[
  {
    "path": ".github/workflows/nuget-publish.yml",
    "content": "name: main\non:\n  push:\n    branches:\n      - main \n    paths: \n      - 'Directory.Build.props'\n\njobs:\n  deploy-nuget:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - name: Build\n        run: dotnet build --configuration Release\n      - name: Pack\n        run: dotnet pack --no-build --configuration Release\n      - name: Push NuGet package\n        run: |\n          dotnet nuget push **/*.nupkg --skip-duplicate --source https://api.nuget.org/v3/index.json --api-key ${{ vars.XUZEYU }}\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore\n\n# User-specific files\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# .NET Core\nproject.lock.json\nproject.fragment.lock.json\nartifacts/\n**/Properties/launchSettings.json\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.bin\n*.Debug\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk \n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# JetBrains Rider\n.idea/\n*.sln.iml\n\n# CodeRush\n.cr/\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output \nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# MFractors (Xamarin productivity tool) working folder \n.mfractor/\n**/bin/\n**/obj/\n**/.vs/\n/src/GraphRag.Net.Web/appsettings.Development.json\n**/tmp-memory-files/\n**/tmp-memory-vectors/\n/src/GraphRag.Net.Web/graph.db\n\n/src/GraphRag.Net.Web/graphmem.db\n/db\n/src/GraphRag.Net/GraphRag.Net.xml\n"
  },
  {
    "path": "Directory.Build.props",
    "content": "<Project>\n  <!-- See https://aka.ms/dotnet/msbuild/customize for more details on customizing your build -->\n  <PropertyGroup>\n    <Version>0.2.0</Version>\n    <SKVersion>1.17.1</SKVersion>  \n  </PropertyGroup>\n</Project>\n"
  },
  {
    "path": "GraphRag.Net.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.10.35027.167\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"GraphRag.Net.Web\", \"src\\GraphRag.Net.Web\\GraphRag.Net.Web.csproj\", \"{8C4B0AA1-7083-4BEA-9F12-2C20CDDB8426}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"GraphRag.Net\", \"src\\GraphRag.Net\\GraphRag.Net.csproj\", \"{214FF6B8-E291-4CC8-94BC-16C1CD9DB3B8}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"解决方案项\", \"解决方案项\", \"{A35F9835-DFCF-478A-9F24-E0B350161746}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tDirectory.Build.props = Directory.Build.props\n\t\t.github\\workflows\\nuget-publish.yml = .github\\workflows\\nuget-publish.yml\n\t\tREADME.md = README.md\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{8C4B0AA1-7083-4BEA-9F12-2C20CDDB8426}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8C4B0AA1-7083-4BEA-9F12-2C20CDDB8426}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8C4B0AA1-7083-4BEA-9F12-2C20CDDB8426}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8C4B0AA1-7083-4BEA-9F12-2C20CDDB8426}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{214FF6B8-E291-4CC8-94BC-16C1CD9DB3B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{214FF6B8-E291-4CC8-94BC-16C1CD9DB3B8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{214FF6B8-E291-4CC8-94BC-16C1CD9DB3B8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{214FF6B8-E291-4CC8-94BC-16C1CD9DB3B8}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {7892D425-42B4-4F17-B17A-38825D88FA7B}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [2024] [许泽宇]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.en.md",
    "content": "[简体中文](./README.md) | English\n\n## This is a simple implementation of dotnet referring to GraphRag\n\nBased on the implementation idea mentioned by Microsoft in the paper, GraphRAG mainly implements the following functions in the execution process:\n- Source Documents → Text Chunks: divide the source document into text blocks.\n- Text Chunks → Element Instances: Extract instances of graph nodes and edges from each text block.\n- Element Instances → Element Summaries: generate summaries for each diagram element.\n- Element Summaries → Graph Communities: use the community detection algorithm to divide the graph into communities.\n- Graph Communities → Community Summaries: generate summaries for each community.\n- Community Summaries → Community Answers → Global Answer: use community summaries to generate local answers, and then summarize these local answers to generate global answers.\n\nThis project is a demo example, which is only used to learn GraphRAG ideas.\n\n## Core Business Process\n\n### 1. Overall Architecture Flow\n\n```mermaid\ngraph LR\n    A[\"Document Import\"] --> B[\"Graph Construction\"]\n    B --> C[\"Community Detection\"]\n    C --> D[\"Summary Generation\"]\n    D --> E[\"Query Retrieval\"]\n    \n    subgraph \"Data Flow\"\n        F[\"Raw Documents\"] --> G[\"Text Chunks\"]\n        G --> H[\"Graph Data<br/>Nodes+Edges\"]\n        H --> I[\"Community Structure\"]\n        I --> J[\"Multi-level Summaries\"]\n        J --> K[\"Intelligent Q&A\"]\n    end\n    \n    subgraph \"Storage Layer\"\n        L[\"Vector Database<br/>TextMemory\"]\n        M[\"Relational Database<br/>Nodes/Edges/Communities/Globals\"]\n    end\n    \n    B -.-> L\n    B -.-> M\n    C -.-> M\n    D -.-> M\n    E -.-> L\n    E -.-> M\n    \n    style A fill:#e1f5fe\n    style E fill:#c8e6c9\n    style L fill:#fce4ec\n    style M fill:#fff9c4\n```\n\n### 2. Document Import and Graph Construction Flow\n\n```mermaid\ngraph TD\n    A[\"Document Input<br/>Raw Documents/Text\"] --> B[\"Text Chunking<br/>TextChunker.SplitPlainTextLines<br/>TextChunker.SplitPlainTextParagraphs\"]\n    B --> C[\"Overlapping Text Chunks<br/>CreateOverlappingChunks<br/>3 paragraphs/chunk, 1 paragraph overlap\"]\n    C --> D[\"LLM Extract Graph Data<br/>SemanticService.CreateGraphAsync\"]\n    D --> E[\"Node Extraction<br/>Entity Recognition+Type Classification\"]\n    D --> F[\"Relationship Extraction<br/>Edges and Relationship Description\"]\n    E --> G[\"Node Deduplication<br/>Vector Similarity Detection\"]\n    F --> H[\"Relationship Deduplication<br/>Duplicate Edge Processing\"]\n    G --> I[\"Store to Database<br/>Nodes Table\"]\n    H --> J[\"Store to Database<br/>Edges Table\"]\n    I --> K[\"Vector Storage<br/>TextMemory.SaveInformationAsync\"]\n    J --> L[\"Orphan Node Detection<br/>ProcessOrphanNodesAsync\"]\n    L --> M[\"Graph Construction Complete\"]\n    \n    style A fill:#e1f5fe\n    style M fill:#c8e6c9\n    style D fill:#fff3e0\n    style K fill:#fce4ec\n```\n\n### 3. Community Detection and Summary Generation Flow\n\n```mermaid\ngraph TD\n    A[\"Graph Data<br/>Nodes + Edges\"] --> B[\"Build Graph Structure<br/>Graph.AddEdge\"]\n    B --> C[\"Label Propagation Algorithm<br/>FastLabelPropagationAlgorithm<br/>10 iterations\"]\n    C --> D[\"Community Detection Results<br/>Node→Community ID Mapping\"]\n    D --> E[\"Store Community Node Relations<br/>CommunitieNodes Table\"]\n    E --> F[\"Group Nodes by Community<br/>Extract Node Description\"]\n    F --> G[\"LLM Generate Community Summary<br/>SemanticService.CommunitySummaries\"]\n    G --> H[\"Store Community Summary<br/>Communities Table\"]\n    H --> I[\"Collect All Community Summaries\"]\n    I --> J[\"LLM Generate Global Summary<br/>SemanticService.GlobalSummaries\"]\n    J --> K[\"Store Global Summary<br/>Globals Table\"]\n    \n    style A fill:#e1f5fe\n    style C fill:#fff3e0\n    style G fill:#fff3e0\n    style J fill:#fff3e0\n    style K fill:#c8e6c9\n```\n\n### 4. Direct Graph Query Flow\n\n```mermaid\ngraph TD\n    A[\"User Query<br/>Question Input\"] --> B[\"Vector Search<br/>TextMemory.SearchAsync<br/>Relevance Threshold 0.5\"]\n    B --> C{\"Nodes Matched?\"}\n    C -->|Yes| D[\"Get Related Nodes<br/>RetrieveTextMemModelList\"]\n    C -->|No| E[\"Retry with Lower Threshold<br/>Threshold 0.3, Expand Search\"]\n    E --> D\n    D --> F[\"Recursive Graph Expansion<br/>GetGraphAllRecursion<br/>Depth Limit+Node Count Limit\"]\n    F --> G[\"Token Count Estimation<br/>EstimateTokenCount\"]\n    G --> H{\"Exceed Token Limit?\"}\n    H -->|Yes| I[\"Trim Nodes by Weight<br/>LimitGraphByTokenCount\"]\n    H -->|No| J[\"Build Query Graph<br/>GraphModel\"]\n    I --> J\n    J --> K[\"LLM Generate Answer<br/>SemanticService.GetGraphAnswerAsync\"]\n    K --> L[\"Return Result\"]\n    \n    style A fill:#e1f5fe\n    style B fill:#fce4ec\n    style F fill:#fff3e0\n    style K fill:#fff3e0\n    style L fill:#c8e6c9\n```\n\n### 5. Community Algorithm Query Flow\n\n```mermaid\ngraph TD\n    A[\"User Query<br/>Question Input\"] --> B[\"Vector Search<br/>Find Related Nodes\"]\n    B --> C{\"Nodes Matched?\"}\n    C -->|Yes| D[\"Find Node Communities<br/>GetGraphAllCommunitiesRecursion\"]\n    C -->|No| E[\"Use Global Summary<br/>Globals Table\"]\n    D --> F[\"Get All Nodes in Community\"]\n    F --> G[\"Build Community Subgraph<br/>Nodes+Edges\"]\n    G --> H[\"Get Related Community Summary<br/>Communities Table\"]\n    H --> I[\"Get Global Summary<br/>Globals Table\"]\n    I --> J[\"LLM Comprehensive Analysis<br/>Graph+Community Summary+Global Summary\"]\n    E --> K[\"Answer Based on Global Summary Only\"]\n    J --> L[\"Return Answer\"]\n    K --> L\n    \n    style A fill:#e1f5fe\n    style B fill:#fce4ec\n    style D fill:#fff3e0\n    style J fill:#fff3e0\n    style K fill:#fff3e0\n    style L fill:#c8e6c9\n```\n\n### Core Algorithm Description\n\n1. **Text Chunking Algorithm**: Uses overlapping window technique, each text chunk contains 3 paragraphs, adjacent chunks overlap by 1 paragraph to ensure continuity of relationship information.\n\n2. **Community Detection Algorithm**: Adopts Fast Label Propagation Algorithm with 10 iterations to discover community structure in the graph.\n\n3. **Vector Search Strategy**: First uses 0.5 relevance threshold for search, if results are insufficient, lowers to 0.3 for retry to ensure finding enough related nodes.\n\n4. **Token Optimization Mechanism**: Real-time estimation of token usage, intelligently trims nodes by weight when exceeding limits to ensure LLM input effectiveness.\n\n5. **Orphan Node Processing**: Automatically detects orphan nodes without relationship connections, attempts to establish relationships with other nodes through semantic search.\n\n## You can directly reference the NuGet package in the project, or directly use the project to provide API services\nFor convenience, the LLM interface is currently only compatible with the openai specification, and other large models can consider using one api class integration products\n\nConfigure in appsettings.json\n\n```\n \"GraphOpenAI\": {\n   \"Key\": \"sk-xxx\",\n   \"EndPoint\": \"https://api.antsk.cn/\",\n   \"ChatModel\": \"gpt-4o-mini\",\n   \"EmbeddingModel\": \"text-embedding-ada-002\"\n },\n\"TextChunker\": {\n    \"LinesToken\": 100,\n    \"ParagraphsToken\": 1000\n},\n\"GraphDBConnection\": {\n    \"DbType\": \"Sqlite\", //PostgreSQL\n    \"DBConnection\": \"Data Source=graph.db\",\n    \"VectorConnection\": \"graphmem.db\", //If PostgreSQL is used, it can be consistent with DBConnection\n    \"VectorSize\": 1536 //DbType=PostgreSQL needs to be set, sqlite can not be set\n},\n\"GraphSearch\": {\n    \"SearchMinRelevance\": 0.5, //Search for minimum relevance\n    \"SearchLimit\": 3, //Limit the number of vector search nodes\n    \"NodeDepth\": 3 ,//Retrieve node depth\n    \"MaxNodes\": 100 //Retrieve the maximum number of nodes\n},\n\"GraphSys\": {\n    \"RetryCounnt\": 2 //Number of retries. Using the domestic model may cause json extraction failure. Increasing the number of retries can improve availability\n}\n```\n## Startup project\n```\ndotnet run --project GraphRag.Net.Web.csproj\n```\n\n## After starting the project, you can use the\n```\nhttp://localhost:5000/swagger\n```\n## Open the swagger view interface\n\n![Graoh](https://github.com/xuzeyu91/GraphRag.Net/blob/main/doc/api.png)\n\n### You can also use the interface\n```\nhttp://localhost:5000/\n```\n\nOpen the UI interface of blazer. The page provides functions such as text import, file import, question and answer dialogue, and view knowledge map\n\n![Graoh](https://github.com/xuzeyu91/GraphRag.Net/blob/main/doc/graph1.png)\n\n\n## Nuget Package Usage\n```\ndotnet add package GraphRag.Net\n```\n## In order to facilitate the adjustment and modification of prompt words, SK Plugin has separated the project. You need to put GraphRag Copy the graphPlugins directory in the Net. Web project to your project, and set\n[graphPlugins](https://github.com/AIDotNet/GraphRag.Net/tree/main/src/GraphRag.Net.Web/graphPlugins)\n```\n  <ItemGroup>\n    <None Include=\"graphPlugins\\**\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n```\n\n### The default configuration uses the OpenAI standard interface. After configuring the OpenAI app settings, you can use the following code to inject\nAfter adding a package, you need to set the configuration file and dependency injection\n```\n//OpenAI configuration\nbuilder.Configuration.GetSection(\"GraphOpenAI\").Get<GraphOpenAIOption>();\n//Document Slicing Configuration\nbuilder.Configuration.GetSection(\"TextChunker\").Get<TextChunkerOption>();\n//Configure Database Links\nbuilder.Configuration.GetSection(\"GraphDBConnection\").Get<GraphDBConnectionOption>();\n//System settings\nbuilder.Configuration.GetSection(\"GraphSys\").Get<GraphSysOption>();\n\n//Inject AddGraphRagNet. Note that you need to inject the configuration file first, and then inject GraphRagNet\nbuilder.Services.AddGraphRagNet();\n```\n\n### If you want to access other models, you can refer to the following code, which abstracts the implementation of Kernel. You can customize the implementation\n```\nvar kernelBuild = Kernel.CreateBuilder();\nkernelBuild.Services.AddKeyedSingleton<ITextGenerationService>(\"mock-text\", new MockTextCompletion());\nkernelBuild.Services.AddKeyedSingleton<IChatCompletionService>(\"mock-chat\", new MockChatCompletion());\nkernelBuild.Services.AddSingleton((ITextEmbeddingGenerationService)new MockTextEmbeddingGeneratorService());\nkernelBuild.Services.AddKeyedSingleton(\"mock-embedding\", new MockTextEmbeddingGeneratorService());\n\nbuilder.Services.AddGraphRagNet(kernelBuild.Build());\n```\n\n#### It should be noted here that since the import may be carried out several times, the generated community and global information is not automatically called during import, so you need to call the generated community and global information according to the actual situation\n\n```\n    await _graphService.GraphCommunitiesAsync(index);\n    await _graphService.GraphGlobalAsync(index);\n```\n\n\nInject IGraphService service when using. The following is the reference sample code\n```\nnamespace GraphRag.Net.Api.Controllers\n{\n    [Route(\"api/[controller]/[action]\")]\n    [ApiController]\n    public class GraphDemoController(IGraphService _graphService) : ControllerBase\n    {\n        /// <summary>\n        /// 获取所有的索引数据\n        /// </summary>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GetAllIndex()\n        {\n            var graphModel = _graphService.GetAllIndex();\n            return Ok(graphModel);\n        }\n\n\n        /// <summary>\n        /// 获取所有的图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GetAllGraphs(string index)\n        {\n            if (string.IsNullOrEmpty(index))\n            {\n                return Ok(new GraphViewModel());\n            }\n            var graphModel = _graphService.GetAllGraphs(index);\n            return Ok(graphModel);\n        }\n\n\n        /// <summary>\n        /// 插入文本数据\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> InsertGraphData(InputModel model)\n        {\n            await _graphService.InsertGraphDataAsync(model.Index, model.Input);\n            return Ok();\n        }\n\n        /// <summary>\n        /// 搜索递归获取节点相关的所有边和节点进行图谱对话\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> SearchGraph(InputModel model)\n        {\n            var result = await _graphService.SearchGraphAsync(model.Index, model.Input);\n            return Ok(result);\n        }\n\n        /// <summary>\n        /// 通过社区算法检索社区节点进行对话\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> SearchGraphCommunity(InputModel model)\n        {\n            var result = await _graphService.SearchGraphCommunityAsync(model.Index, model.Input);\n            return Ok(result);\n        }\n\n        /// <summary>\n        /// 导入txt文档\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"file\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> ImportTxt(string index,IFormFile file)\n        {\n            var forms = await Request.ReadFormAsync();\n            using (var stream = new StreamReader(file.OpenReadStream()))\n            {\n                var txt = await stream.ReadToEndAsync();\n                await _graphService.InsertTextChunkAsync(index,txt);\n                return Ok();\n            }\n        }\n\n        /// <summary>\n        /// 通过社区检测生成社区和摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GraphCommunities(string index)\n        {\n            await _graphService.GraphCommunitiesAsync(index);\n            return Ok();\n        }      \n        \n        /// <summary>\n        /// 通过社区摘要生成全局摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GraphGlobal(string index)\n        {\n            await _graphService.GraphGlobalAsync(index);\n            return Ok();\n        }\n\n        /// <summary>\n        /// 删除图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> DeleteGraph(string index)\n        {\n            await _graphService.DeleteGraph(index);\n            return Ok();\n        }\n    }\n\n    public class InputModel\n    {\n        public string Index { get; set; }\n        public string Input { get; set; }\n    }\n}\n\n```\n\n## Test DB. Some community friends pre trained some data in advance. The link is as follows. After downloading, it can be directly put into the project directory for replacement to test the experience\n```\nhttps://pan.quark.cn/s/bf2d21f29f85\n```\n\n## See AntSK for more Rag scenarios\nProject address：[AntSK](https://github.com/AIDotNet/AntSK)\n\nExperience environment：\n\n[Demo地址](https://demo.antsk.cn)\n\nUser：test\n\nPwd：test\n\n\nYou are also welcome to join our WeChat communication group. You can add my WeChat: **xuzeyu91** and send it to the group\n"
  },
  {
    "path": "README.md",
    "content": "简体中文 | [English](./README.en.md) \n\n## 这是一个参考GraphRag的dotnet简易实现\n\n基于微软在论文中提到的实现思路，执行过程GraphRAG主要实现了如下功能：\n- Source Documents → Text Chunks：将源文档分割成文本块。\n- Text Chunks → Element Instances：从每个文本块中提取图节点和边的实例。\n- Element Instances → Element Summaries：为每个图元素生成摘要。\n- Element Summaries → Graph Communities：使用社区检测算法将图划分为社区。\n- Graph Communities → Community Summaries：为每个社区生成摘要。\n- Community Summaries → Community Answers → Global Answer：使用社区摘要生成局部答案，然后汇总这些局部答案以生成全局答案。\n\n本项目为demo示例，仅用于学习GraphRAG思路。\n\n## 核心业务流程\n\n### 1. 整体架构流程\n\n```mermaid\ngraph LR\n    A[\"文档导入\"] --> B[\"图谱构建\"]\n    B --> C[\"社区检测\"]\n    C --> D[\"摘要生成\"]\n    D --> E[\"查询检索\"]\n    \n    subgraph \"数据流转\"\n        F[\"原始文档\"] --> G[\"文本块\"]\n        G --> H[\"图谱数据<br/>节点+边\"]\n        H --> I[\"社区结构\"]\n        I --> J[\"多层摘要\"]\n        J --> K[\"智能问答\"]\n    end\n    \n    subgraph \"存储层\"\n        L[\"向量数据库<br/>TextMemory\"]\n        M[\"关系数据库<br/>Nodes/Edges/Communities/Globals\"]\n    end\n    \n    B -.-> L\n    B -.-> M\n    C -.-> M\n    D -.-> M\n    E -.-> L\n    E -.-> M\n    \n    style A fill:#e1f5fe\n    style E fill:#c8e6c9\n    style L fill:#fce4ec\n    style M fill:#fff9c4\n```\n\n### 2. 文档导入与图谱构建流程\n\n```mermaid\ngraph TD\n    A[\"文档输入<br/>原始文档/文本\"] --> B[\"文本切片<br/>TextChunker.SplitPlainTextLines<br/>TextChunker.SplitPlainTextParagraphs\"]\n    B --> C[\"重叠文本块<br/>CreateOverlappingChunks<br/>3段落/块，1段落重叠\"]\n    C --> D[\"LLM提取图数据<br/>SemanticService.CreateGraphAsync\"]\n    D --> E[\"节点提取<br/>实体识别+类型分类\"]\n    D --> F[\"关系提取<br/>边和关系描述\"]\n    E --> G[\"节点去重合并<br/>向量相似度检测\"]\n    F --> H[\"关系去重合并<br/>重复边处理\"]\n    G --> I[\"存储到数据库<br/>Nodes表\"]\n    H --> J[\"存储到数据库<br/>Edges表\"]\n    I --> K[\"向量化存储<br/>TextMemory.SaveInformationAsync\"]\n    J --> L[\"孤立节点检测<br/>ProcessOrphanNodesAsync\"]\n    L --> M[\"图谱构建完成\"]\n    \n    style A fill:#e1f5fe\n    style M fill:#c8e6c9\n    style D fill:#fff3e0\n    style K fill:#fce4ec\n```\n\n### 3. 社区检测与摘要生成流程\n\n```mermaid\ngraph TD\n    A[\"图谱数据<br/>Nodes + Edges\"] --> B[\"构建图结构<br/>Graph.AddEdge\"]\n    B --> C[\"标签传播算法<br/>FastLabelPropagationAlgorithm<br/>10次迭代\"]\n    C --> D[\"社区检测结果<br/>节点→社区ID映射\"]\n    D --> E[\"存储社区节点关系<br/>CommunitieNodes表\"]\n    E --> F[\"按社区分组节点<br/>提取节点描述信息\"]\n    F --> G[\"LLM生成社区摘要<br/>SemanticService.CommunitySummaries\"]\n    G --> H[\"存储社区摘要<br/>Communities表\"]\n    H --> I[\"收集所有社区摘要\"]\n    I --> J[\"LLM生成全局摘要<br/>SemanticService.GlobalSummaries\"]\n    J --> K[\"存储全局摘要<br/>Globals表\"]\n    \n    style A fill:#e1f5fe\n    style C fill:#fff3e0\n    style G fill:#fff3e0\n    style J fill:#fff3e0\n    style K fill:#c8e6c9\n```\n\n### 4. 直接图谱查询流程\n\n```mermaid\ngraph TD\n    A[\"用户查询<br/>问题输入\"] --> B[\"向量搜索<br/>TextMemory.SearchAsync<br/>相关度阈值0.5\"]\n    B --> C{\"匹配到节点?\"}\n    C -->|是| D[\"获取相关节点<br/>RetrieveTextMemModelList\"]\n    C -->|否| E[\"降低阈值重试<br/>阈值0.3，扩大搜索\"]\n    E --> D\n    D --> F[\"递归扩展图谱<br/>GetGraphAllRecursion<br/>深度限制+节点数限制\"]\n    F --> G[\"Token数量估算<br/>EstimateTokenCount\"]\n    G --> H{\"超过Token限制?\"}\n    H -->|是| I[\"按权重裁剪节点<br/>LimitGraphByTokenCount\"]\n    H -->|否| J[\"构建查询图谱<br/>GraphModel\"]\n    I --> J\n    J --> K[\"LLM生成答案<br/>SemanticService.GetGraphAnswerAsync\"]\n    K --> L[\"返回结果\"]\n    \n    style A fill:#e1f5fe\n    style B fill:#fce4ec\n    style F fill:#fff3e0\n    style K fill:#fff3e0\n    style L fill:#c8e6c9\n```\n\n### 5. 社区算法查询流程\n\n```mermaid\ngraph TD\n    A[\"用户查询<br/>问题输入\"] --> B[\"向量搜索<br/>找到相关节点\"]\n    B --> C{\"匹配到节点?\"}\n    C -->|是| D[\"查找节点所属社区<br/>GetGraphAllCommunitiesRecursion\"]\n    C -->|否| E[\"使用全局摘要<br/>Globals表\"]\n    D --> F[\"获取社区内所有节点\"]\n    F --> G[\"构建社区子图<br/>节点+边\"]\n    G --> H[\"获取相关社区摘要<br/>Communities表\"]\n    H --> I[\"获取全局摘要<br/>Globals表\"]\n    I --> J[\"LLM综合分析<br/>图谱+社区摘要+全局摘要\"]\n    E --> K[\"仅基于全局摘要回答\"]\n    J --> L[\"返回答案\"]\n    K --> L\n    \n    style A fill:#e1f5fe\n    style B fill:#fce4ec\n    style D fill:#fff3e0\n    style J fill:#fff3e0\n    style K fill:#fff3e0\n    style L fill:#c8e6c9\n```\n\n### 核心算法说明\n\n1. **文本切片算法**：使用重叠窗口技术，每个文本块包含3个段落，相邻块之间重叠1个段落，确保关系信息的连续性。\n\n2. **社区检测算法**：采用快速标签传播算法（Fast Label Propagation Algorithm），通过10次迭代来发现图中的社区结构。\n\n3. **向量搜索策略**：首先使用0.5的相关度阈值进行搜索，如果结果不足则降低至0.3重试，确保找到足够的相关节点。\n\n4. **Token优化机制**：实时估算token使用量，当超过限制时按节点权重进行智能裁剪，保证LLM输入的有效性。\n\n5. **孤立节点处理**：自动检测没有关系连接的孤立节点，通过语义搜索尝试为其建立与其他节点的关系。\n\n## 您可以直接在项目中引用NuGet包，或者直接使用本项目提供API服务\n\n出于方便，LLM接口目前只兼容了openai的规范，其他大模型可以考虑使用one-api类的集成产品\n\n在appsettings.json配置\n\n```\n \"GraphOpenAI\": {\n   \"Key\": \"sk-xxx\",\n   \"EndPoint\": \"https://api.antsk.cn/\",\n   \"ChatModel\": \"gpt-4o-mini\",\n   \"EmbeddingModel\": \"text-embedding-ada-002\"\n },\n\"TextChunker\": {\n    \"LinesToken\": 100,\n    \"ParagraphsToken\": 1000\n},\n\"GraphDBConnection\": {\n    \"DbType\": \"Sqlite\", //PostgreSQL\n    \"DBConnection\": \"Data Source=graph.db\",\n    \"VectorConnection\": \"graphmem.db\", //如果用PostgreSQL，可以和DBConnection一致\n    \"VectorSize\": 1536 //DbType=PostgreSQL时需要设置，sqlite可以不设置\n},\n\"GraphSearch\": {\n    \"SearchMinRelevance\": 0.5, //搜索最小相关性\n    \"SearchLimit\": 3, //向量搜索节点限制个数\n    \"NodeDepth\": 3 ,//检索节点深度\n    \"MaxNodes\": 100 //检索最大节点数\n},\n\"GraphSys\": {\n    \"RetryCounnt\": 2 //重试次数，使用国产模型可能会出现json提取失败，增加重试次数可提高可用性\n}\n```\n## 启动项目\n```\ndotnet run --project GraphRag.Net.Web.csproj\n```\n\n## 启动项目后可以通过\n```\nhttp://localhost:5000/swagger\n```\n## 打开swagger查看接口\n\n![Graoh](https://github.com/xuzeyu91/GraphRag.Net/blob/main/doc/api.png)\n\n### 也可以使用界面\n```\nhttp://localhost:5000/\n```\n\n打开blazor的UI界面，页面提供了文本导入、文件导入，和问答对话，查看知识图谱等功能\n\n![Graoh](https://github.com/xuzeyu91/GraphRag.Net/blob/main/doc/graph1.png)\n\n\n## Nuget包使用\n```\ndotnet add package GraphRag.Net\n```\n## 为了方便进行提示词调整与修改，SK Plugin我们剥离出了项目，您需要把GraphRag.Net.Web项目中的 graphPlugins目录拷贝到你的项目中，并设置：\n[graphPlugins](https://github.com/AIDotNet/GraphRag.Net/tree/main/src/GraphRag.Net.Web/graphPlugins)\n```\n  <ItemGroup>\n    <None Include=\"graphPlugins\\**\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n```\n\n### 默认配置，使用OpenAI标准接口，在配置了OpenAI的appsettings后可以使用下面代码进行注入\n添加包以后，需要进行配置文件的设置以及依赖注入\n```\n//OpenAI配置\nbuilder.Configuration.GetSection(\"GraphOpenAI\").Get<GraphOpenAIOption>();\n//文档切片配置\nbuilder.Configuration.GetSection(\"TextChunker\").Get<TextChunkerOption>();\n//配置数据库链接\nbuilder.Configuration.GetSection(\"GraphDBConnection\").Get<GraphDBConnectionOption>();\n//系统设置\nbuilder.Configuration.GetSection(\"GraphSys\").Get<GraphSysOption>();\n\n//注入AddGraphRagNet,注意，需要先注入配置文件，然后再注入GraphRagNet\nbuilder.Services.AddGraphRagNet();\n```\n\n### 如果你想接入其他模型，可以参考以下代码,这里抽象了Kernel的实现，你可以自定义实现\n```\nvar kernelBuild = Kernel.CreateBuilder();\nkernelBuild.Services.AddKeyedSingleton<ITextGenerationService>(\"mock-text\", new MockTextCompletion());\nkernelBuild.Services.AddKeyedSingleton<IChatCompletionService>(\"mock-chat\", new MockChatCompletion());\nkernelBuild.Services.AddSingleton((ITextEmbeddingGenerationService)new MockTextEmbeddingGeneratorService());\nkernelBuild.Services.AddKeyedSingleton(\"mock-embedding\", new MockTextEmbeddingGeneratorService());\n\nbuilder.Services.AddGraphRagNet(kernelBuild.Build());\n```\n\n#### 此处需要注意，由于导入可能分多次导入，没有在导入时自动调用生成社区和全局信息，需要自己根据实际情况调用生成社区和全局信息\n\n```\n    await _graphService.GraphCommunitiesAsync(index);\n    await _graphService.GraphGlobalAsync(index);\n```\n\n\n使用时注入 IGraphService  服务,以下为参考示例代码\n```\nnamespace GraphRag.Net.Api.Controllers\n{\n    [Route(\"api/[controller]/[action]\")]\n    [ApiController]\n    public class GraphController(IGraphService _graphService) : ControllerBase\n    {\n        /// <summary>\n        /// 获取所有的索引数据\n        /// </summary>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GetAllIndex()\n        {\n            var graphModel = _graphService.GetAllIndex();\n            return Ok(graphModel);\n        }\n\n\n        /// <summary>\n        /// 获取所有的图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GetAllGraphs(string index)\n        {\n            if (string.IsNullOrEmpty(index))\n            {\n                return Ok(new GraphViewModel());\n            }\n            var graphModel = _graphService.GetAllGraphs(index);\n            return Ok(graphModel);\n        }\n\n\n        /// <summary>\n        /// 插入文本数据\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> InsertGraphData(InputModel model)\n        {\n            await _graphService.InsertGraphDataAsync(model.Index, model.Input);\n            return Ok();\n        }\n\n        /// <summary>\n        /// 搜索递归获取节点相关的所有边和节点进行图谱对话\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> SearchGraph(InputModel model)\n        {\n            var result = await _graphService.SearchGraphAsync(model.Index, model.Input);\n            return Ok(result);\n        }\n\n        /// <summary>\n        /// 通过社区算法检索社区节点进行对话\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> SearchGraphCommunity(InputModel model)\n        {\n            var result = await _graphService.SearchGraphCommunityAsync(model.Index, model.Input);\n            return Ok(result);\n        }\n\n        /// <summary>\n        /// 导入txt文档\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"file\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> ImportTxt(string index,IFormFile file)\n        {\n            var forms = await Request.ReadFormAsync();\n            using (var stream = new StreamReader(file.OpenReadStream()))\n            {\n                var txt = await stream.ReadToEndAsync();\n                await _graphService.InsertTextChunkAsync(index,txt);\n                return Ok();\n            }\n        }\n\n        /// <summary>\n        /// 通过社区检测生成社区和摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GraphCommunities(string index)\n        {\n            await _graphService.GraphCommunitiesAsync(index);\n            return Ok();\n        }      \n        \n        /// <summary>\n        /// 通过社区摘要生成全局摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GraphGlobal(string index)\n        {\n            await _graphService.GraphGlobalAsync(index);\n            return Ok();\n        }\n\n        /// <summary>\n        /// 删除图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> DeleteGraph(string index)\n        {\n            await _graphService.DeleteGraph(index);\n            return Ok();\n        }\n    }\n\n    public class InputModel\n    {\n        public string Index { get; set; }\n        public string Input { get; set; }\n    }\n}\n\n```\n\n## 测试DB，有社区朋友提前预训练了一些数据，链接如下，下载后直接放进项目目录替换即可测试体验\n```\nhttps://pan.quark.cn/s/bf2d21f29f85\n```\n\n## 更多Rag场景可查看 AntSK\n项目地址：[AntSK](https://github.com/AIDotNet/AntSK)\n\n体验环境：\n\n[Demo地址](https://demo.antsk.cn)\n\n账号：test\n\n密码：test\n\n"
  },
  {
    "path": "src/GraphRag.Net/Common/Options/GraphDBConnectionOption.cs",
    "content": "﻿namespace GraphRag.Net.Options\n{\n    public class GraphDBConnectionOption\n    {\n        /// <summary>\n        /// sqlite连接字符串\n        /// </summary>\n        public static string DbType { get; set; } = \"Sqlite\";\n\n\n        /// <summary>\n        /// 业务数据链接字符串\n        /// </summary>\n        public static string DBConnection { get; set; } = $\"Data Source=graph.db\";\n        /// <summary>\n        /// 向量数据连接字符串\n        /// </summary>\n        public static string VectorConnection { get; set; } = \"graphmem.db\";\n        /// <summary>\n        /// 向量数据维度，PG需要设置\n        /// </summary>\n        public static int VectorSize { get; set; } = 1536;\n    }\n\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Common/Options/GraphOpenAIOption.cs",
    "content": "﻿namespace GraphRag.Net.Options\n{\n    public class GraphOpenAIOption\n    {\n        public static string EndPoint { get; set; }\n\n        public static string Key { get; set; }\n\n        public static string ChatModel { get; set; }\n\n        public static string EmbeddingModel { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Common/Options/GraphSearchOption.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace GraphRag.Net.Options\n{\n    public class GraphSearchOption\n    {\n        /// <summary>\n        /// 社区检索搜索最小向量相似度\n        /// </summary>\n        public static double SearchMinRelevance { get; set; } = 0.5;\n\n\n        /// <summary>\n        /// 社区检索搜索向量节点数量\n        /// </summary>\n        public static int SearchLimit { get; set; } = 3;\n\n        /// <summary>\n        /// 节点关系检索深度\n        /// </summary>\n        public static int NodeDepth { get; set; } = 3;\n\n        /// <summary>\n        /// 节点检索最多节点数量\n        /// </summary>\n        public static int MaxNodes { get; set; } = 300;\n\n        /// <summary>\n        /// 最大Token数量限制（32K）\n        /// </summary>\n        public static int MaxTokens { get; set; } = 32000;\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Common/Options/GraphSysOption.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace GraphRag.Net.Common.Options\n{\n    public class GraphSysOption\n    {\n        /// <summary>\n        /// 重试次数\n        /// </summary>\n        public static int RetryCounnt { get; set; } = 2;\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Common/Options/TextChunkerOption.cs",
    "content": "﻿namespace GraphRag.Net.Options\n{\n    public class TextChunkerOption\n    {\n        /// <summary>\n        /// 行切片token\n        /// </summary>\n        public static int LinesToken { get; set; } = 100;\n        /// <summary>\n        /// 段落切片token\n        /// </summary>\n        public static int ParagraphsToken { get; set; } = 1000;\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Common/ServiceDescriptionAttribute.cs",
    "content": "﻿using Microsoft.Extensions.DependencyInjection;\n\nnamespace GraphRag.Net\n{\n    public class ServiceDescriptionAttribute : Attribute\n    {\n        public ServiceDescriptionAttribute(Type serviceType, ServiceLifetime lifetime)\n        {\n            ServiceType = serviceType;\n            Lifetime = lifetime;\n        }\n\n        public Type ServiceType { get; set; }\n\n        public ServiceLifetime Lifetime { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Interface/ICommunityDetectionService.cs",
    "content": "﻿using GraphRag.Net.Domain.Model.Graph;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace GraphRag.Net.Domain.Interface\n{\n    public interface ICommunityDetectionService\n    {\n        Dictionary<string, string> FastLabelPropagationAlgorithm(Graph graph, int iterations = 10);\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Interface/IGraphService.cs",
    "content": "﻿using GraphRag.Net.Domain.Model.Graph;\nusing Microsoft.SemanticKernel;\n\nnamespace GraphRag.Net.Domain.Interface\n{\n    public interface IGraphService\n    {\n        /// <summary>\n        /// 获取所有索引信息\n        /// </summary>\n        /// <returns></returns>\n        List<string> GetAllIndex();\n        /// <summary>\n        /// 获取Graph数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        GraphViewModel GetAllGraphs(string index);\n        /// <summary>\n        /// 切片导入文本数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        Task InsertTextChunkAsync(string index, string input);\n        /// <summary>\n        /// 生成图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        Task InsertGraphDataAsync(string index, string input);\n\n        /// <summary>\n        ///  搜索递归获取节点相关的所有边和节点\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        Task<GraphModel> SearchGraphModel(string index, string input);\n\n        /// <summary>\n        /// 搜索递归获取节点相关的所有边和节点进行图谱对话\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        Task<string> SearchGraphAsync(string index, string input);\n        /// <summary>\n        /// 通过社区算法匹配相关节点信息\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        Task<GraphModel> SearchGraphCommunityModel(string index, string input);\n        /// <summary>\n        /// 搜索递归获取节点相关的所有边和节点进行图谱对话,流式返回\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<StreamingKernelContent> SearchGraphStreamAsync(string index, string input);\n        /// <summary>\n        /// 通过社区算法检索社区节点进行对话\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        Task<string> SearchGraphCommunityAsync(string index, string input);\n        /// <summary>\n        /// 通过社区算法检索社区节点进行对话，流式返回\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        IAsyncEnumerable<StreamingKernelContent> SearchGraphCommunityStreamAsync(string index, string input);\n        /// <summary>\n        /// 社区摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        Task GraphCommunitiesAsync(string index);\n        /// <summary>\n        /// 全局摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        Task GraphGlobalAsync(string index);\n\n        /// <summary>\n        /// 删除图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        Task DeleteGraph(string index);\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Interface/ISemanticService.cs",
    "content": "﻿using GraphRag.Net.Domain.Model.Graph;\nusing Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.Memory;\n\nnamespace GraphRag.Net.Domain.Interface\n{\n    public interface ISemanticService\n    {\n        Task<GraphModel> CreateGraphAsync(string input);\n\n        Task<string> GetGraphAnswerAsync(string graph, string input);\n        IAsyncEnumerable<StreamingKernelContent> GetGraphAnswerStreamAsync(string graph, string input);\n        Task<string> GetGraphCommunityAnswerAsync(string graph, string community, string global, string input);\n\n        IAsyncEnumerable<StreamingKernelContent> GetGraphCommunityAnswerStreamAsync(string graph, string community, string global, string input);\n        Task<RelationShipModel> GetRelationship(string node1, string node2);\n        Task<string> MergeDesc(string desc1, string desc2);\n        Task<string> CommunitySummaries(string nodes);\n        Task<string> GlobalSummaries(string community);\n        Task<SemanticTextMemory> GetTextMemory();\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Model/Graph/Graph.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace GraphRag.Net.Domain.Model.Graph\n{\n    public class Graph\n    {\n        public Dictionary<string, List<string>> AdjacencyList { get; }\n\n        public Graph()\n        {\n            AdjacencyList = new Dictionary<string, List<string>>();\n        }\n\n        public void AddEdge(string node1, string node2)\n        {\n            if (!AdjacencyList.ContainsKey(node1))\n            {\n                AdjacencyList[node1] = new List<string>();\n            }\n            if (!AdjacencyList.ContainsKey(node2))\n            {\n                AdjacencyList[node2] = new List<string>();\n            }\n            AdjacencyList[node1].Add(node2);\n            AdjacencyList[node2].Add(node1);\n        }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Model/Graph/GraphModel.cs",
    "content": "﻿using GraphRag.Net.Repositories;\n\nnamespace GraphRag.Net.Domain.Model.Graph\n{\n    public class GraphModel\n    {\n        public List<Nodes> Nodes { get; set; }\n        public List<Edges> Edges { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Model/Graph/GraphViewModel.cs",
    "content": "﻿namespace GraphRag.Net.Domain.Model.Graph\n{\n    public class GraphViewModel\n    {\n        public string rootId { get; set; }\n        public List<NodesViewModel> nodes { get; set; } = new List<NodesViewModel>();\n        public List<LinesViewModel> lines { get; set; } = new List<LinesViewModel>();\n    }\n    public class NodesViewModel\n    {\n        public string id { get; set; }\n        public string text { get; set; }\n        public string color { get; set; } = \"#43a2f1\";\n\n        public NodesDataModel data { get; set; }=new NodesDataModel();\n    }\n\n    public class NodesDataModel\n    {\n        public string desc { get; set; }\n    }\n\n    public class LinesViewModel\n    {\n        public string from { get; set; }\n        public string to { get; set; }\n        public string text { get; set; }\n        public string color { get; set; } = \"#000\";\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Model/Graph/RelationShipModel.cs",
    "content": "﻿using GraphRag.Net.Repositories;\n\nnamespace GraphRag.Net.Domain.Model.Graph\n{\n    public class RelationShipModel\n    {\n        public bool IsRelationship { get; set; }\n\n        public Edges Edge { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Model/Graph/TextMemModel.cs",
    "content": "﻿namespace GraphRag.Net.Domain.Model.Graph\n{\n    public class TextMemModel\n    {\n        public string Id { get; set; }\n        public string Text { get; set; }\n        public double Relevance { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Model/PageList.cs",
    "content": "﻿namespace GraphRag.Net.Model\n{\n    public class PageList<T>\n    {\n        //查询结果\n        public List<T> List { get; set; }\n        /// <summary>\n        /// 当前页，从1开始\n        /// </summary>\n        public int PageIndex { get; set; }\n        /// <summary>\n        /// 每页数量\n        /// </summary>\n        public int PageSize { get; set; }\n        /// <summary>\n        /// 总数\n        /// </summary>\n        public int TotalCount { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Service/CommunityDetectionService.cs",
    "content": "﻿using GraphRag.Net.Domain.Interface;\nusing GraphRag.Net.Domain.Model.Graph;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace GraphRag.Net.Domain.Service\n{\n    [ServiceDescription(typeof(ICommunityDetectionService), ServiceLifetime.Scoped)]\n    public class CommunityDetectionService : ICommunityDetectionService\n    {\n        /// <summary>\n        /// 标签传播算法\n        /// </summary>\n        /// <param name=\"graph\"></param>\n        /// <param name=\"iterations\"></param>\n        /// <returns></returns>\n        public Dictionary<string, string> FastLabelPropagationAlgorithm(Graph graph, int iterations = 10)\n        {\n            // Initialize labels\n            var labels = graph.AdjacencyList.Keys.ToDictionary(node => node, node => node);\n\n            for (int iter = 0; iter < iterations; iter++)\n            {\n                // Shuffle nodes\n                var nodes = graph.AdjacencyList.Keys.OrderBy(a => Guid.NewGuid()).ToList();\n\n                foreach (var node in nodes)\n                {\n                    // Count neighbor labels\n                    var labelCounts = new Dictionary<string, int>();\n                    foreach (var neighbor in graph.AdjacencyList[node])\n                    {\n                        if (!labelCounts.ContainsKey(labels[neighbor]))\n                        {\n                            labelCounts[labels[neighbor]] = 0;\n                        }\n                        labelCounts[labels[neighbor]]++;\n                    }\n\n                    // Find the label of highest frequency\n                    var maxCount = labelCounts.Values.Max();\n                    var bestLabels = labelCounts.Where(x => x.Value == maxCount).Select(x => x.Key).ToList();\n\n                    // Pick a random label among the smallest lexicographically in case of tie\n                    var newLabel = bestLabels.OrderBy(x => x).First();\n\n                    if (labels[node] != newLabel)\n                    {\n                        labels[node] = newLabel;\n                    }\n                }\n            }\n\n            return labels;\n        }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Service/GraphService.cs",
    "content": "﻿using GraphRag.Net.Domain.Interface;\nusing GraphRag.Net.Domain.Model.Graph;\nusing GraphRag.Net.Options;\nusing GraphRag.Net.Repositories;\nusing GraphRag.Net.Utils;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.Memory;\nusing Microsoft.SemanticKernel.Text;\nusing Newtonsoft.Json;\nusing SqlSugar;\n\nnamespace GraphRag.Net.Domain.Service\n{\n    [ServiceDescription(typeof(IGraphService), ServiceLifetime.Scoped)]\n    public class GraphService(\n        INodes_Repositories _nodes_Repositories,\n        IEdges_Repositories _edges_Repositories,\n        ISemanticService _semanticService,\n        ICommunities_Repositories _communities_Repositories,\n        ICommunitieNodes_Repositories _communitieNodes_Repositories,\n        IGlobals_Repositories _globals_Repositories,\n        ICommunityDetectionService _communityDetectionService\n        ) : IGraphService\n    {\n        /// <summary>\n        /// 获取所有索引信息\n        /// </summary>\n        /// <returns></returns>\n        public List<string> GetAllIndex()\n        {\n            var indexs = _nodes_Repositories.GetDB().Queryable<Nodes>().GroupBy(p => p.Index).Select(p => p.Index).ToList();\n            return indexs;\n        }\n\n        /// <summary>\n        /// 获取Graph数据\n        /// </summary>\n        /// <returns></returns>\n        public GraphViewModel GetAllGraphs(string index)\n        {\n            if (string.IsNullOrWhiteSpace(index))\n            {\n                throw new ArgumentException(\"Index required value cannot be null.\");\n            }\n            GraphViewModel graphViewModel = new GraphViewModel();\n            var nodes = _nodes_Repositories.GetList(p => p.Index == index);\n            var edges = _edges_Repositories.GetList(p => p.Index == index);\n            Dictionary<string, string> TypeColor = new Dictionary<string, string>();\n            Random random = new Random();\n            foreach (var n in nodes)\n            {\n                NodesViewModel nodesViewModel = new NodesViewModel()\n                {\n                    id = n.Id,\n                    text = n.Name,\n                    data = new NodesDataModel()\n                    {\n                        desc = n.Desc.ConvertToString()\n                    }\n                };\n                //处理相同的Type用相同的颜色\n                if (TypeColor.ContainsKey(n.Type))\n                {\n                    nodesViewModel.color = TypeColor[n.Type];\n                }\n                else\n                {\n                    nodesViewModel.color = $\"#{random.Next(0x1000000):X6}\";\n                    TypeColor.Add(n.Type, nodesViewModel.color);\n                }\n\n                graphViewModel.nodes.Add(nodesViewModel);\n            }\n\n            foreach (var e in edges)\n            {\n                LinesViewModel linesViewModel = new LinesViewModel()\n                {\n                    from = e.Source,\n                    to = e.Target,\n                    text = e.Relationship\n                };\n                graphViewModel.lines.Add(linesViewModel);\n            }\n            return graphViewModel;\n        }\n\n        /// <summary>\n        /// 切片导入文本数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        public async Task InsertTextChunkAsync(string index, string input)\n        {\n            if (string.IsNullOrWhiteSpace(index) || string.IsNullOrWhiteSpace(input))\n            {\n                throw new ArgumentException(\"Values required for index and input cannot be null.\");\n            }\n\n            var lines = TextChunker.SplitPlainTextLines(input, TextChunkerOption.LinesToken);\n            var paragraphs = TextChunker.SplitPlainTextParagraphs(lines, TextChunkerOption.ParagraphsToken);\n\n            // 优化文本分块：使用重叠窗口来保持关系信息\n            var optimizedChunks = CreateOverlappingChunks(paragraphs);\n\n            foreach (var chunk in optimizedChunks)\n            {\n                await InsertGraphDataAsync(index, chunk);\n            }\n        }\n\n        /// <summary>\n        /// 创建重叠文本块以保持关系信息\n        /// </summary>\n        /// <param name=\"paragraphs\"></param>\n        /// <returns></returns>\n        private List<string> CreateOverlappingChunks(List<string> paragraphs)\n        {\n            var chunks = new List<string>();\n            const int maxChunkSize = 3; // 每个块最多包含3个段落\n            const int overlapSize = 1;   // 重叠1个段落\n\n            if (paragraphs.Count <= maxChunkSize)\n            {\n                // 如果段落数量不多，直接作为一个块\n                chunks.Add(string.Join(\"\\n\\n\", paragraphs));\n            }\n            else\n            {\n                // 创建重叠的文本块\n                for (int i = 0; i < paragraphs.Count; i += (maxChunkSize - overlapSize))\n                {\n                    var chunkParagraphs = paragraphs\n                        .Skip(i)\n                        .Take(maxChunkSize)\n                        .ToList();\n\n                    if (chunkParagraphs.Count > 0)\n                    {\n                        var chunk = string.Join(\"\\n\\n\", chunkParagraphs);\n\n                        // 避免重复的块\n                        if (!chunks.Contains(chunk))\n                        {\n                            chunks.Add(chunk);\n                        }\n                    }\n\n                    // 如果剩余段落不足一个完整块，退出循环\n                    if (i + maxChunkSize >= paragraphs.Count)\n                    {\n                        break;\n                    }\n                }\n            }\n\n            Console.WriteLine($\"原始段落数: {paragraphs.Count}, 优化后块数: {chunks.Count}\");\n            return chunks;\n        }\n\n        /// <summary>\n        /// 生成图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        public async Task InsertGraphDataAsync(string index, string input)\n        {\n            if (string.IsNullOrWhiteSpace(index) || string.IsNullOrWhiteSpace(input))\n            {\n                throw new ArgumentException(\"Values required for index and input cannot be null.\");\n            }\n            try\n            {\n                SemanticTextMemory textMemory = await _semanticService.GetTextMemory();\n                var graph = await _semanticService.CreateGraphAsync(input);\n                Dictionary<string, string> nodeDic = new Dictionary<string, string>();\n                List<Nodes> newNodes = new List<Nodes>(); // 收集新插入的节点\n\n                foreach (var n in graph.Nodes)\n                {\n\n                    string Id = Guid.NewGuid().ToString();\n                    string text2 = $\"Name:{n.Name};Type:{n.Type};Desc:{n.Desc}\";\n                    bool isContinue = false;\n\n                    //判断是否存在相同节点\n                    var oldNode = _nodes_Repositories.GetFirst(p => p.Index == index && p.Name == n.Name);\n                    if (oldNode.IsNotNull() && !string.IsNullOrWhiteSpace(n.Desc))\n                    {\n                        //相同节点关联edge关系\n                        var newDesc = await _semanticService.MergeDesc(oldNode.Desc.ConvertToString(), n.Desc.ConvertToString());\n                        if (string.IsNullOrEmpty(newDesc))\n                        {\n                            //可能触发了LLM规则限制，简单粗暴来拼接吧\n                            oldNode.Desc = oldNode.Desc.ConvertToString() + \"; \" + n.Desc.ConvertToString();\n                        }\n                        else\n                        {\n                            oldNode.Desc = newDesc;\n                        }\n                        //更新描述\n                        _nodes_Repositories.Update(oldNode);\n                        text2 = $\"Name:{oldNode.Name};Type:{oldNode.Type};Desc:{oldNode.Desc}\";\n                        nodeDic.Add(n.Id, oldNode.Id);\n                        await textMemory.SaveInformationAsync(index, id: oldNode.Id, text: text2, cancellationToken: default);\n                        continue;\n                    }\n\n                    //优化相关节点发现：增加搜索数量和降低阈值\n                    List<string> potentialRelatedNodes = new List<string>();\n                    await foreach (MemoryQueryResult memory in textMemory.SearchAsync(index, text2, limit: 5, minRelevanceScore: 0.7))\n                    {\n                        if (memory.Relevance == 1)\n                        {\n                            //相同节点进行合并\n                            Console.WriteLine(\"节点合并\");\n                            nodeDic.Add(n.Id, memory.Metadata.Id);\n                            isContinue = true;\n                            break;\n                        }\n\n                        if (graph.Nodes.Select(p => p.Id).Contains(memory.Metadata.Id))\n                        {\n                            //如果本次包含了向量近似的数据，则跳过\n                            continue;\n                        }\n\n                        potentialRelatedNodes.Add(memory.Metadata.Id);\n                    }\n\n                    if (isContinue)\n                    {\n                        //节点合并，跳出循环\n                        continue;\n                    }\n\n                    // 创建新节点\n                    Nodes node = new Nodes()\n                    {\n                        Id = Id,\n                        Index = index,\n                        Name = n.Name,\n                        Type = n.Type,\n                        Desc = n.Desc.ConvertToString()\n                    };\n\n                    if (!nodeDic.ContainsKey(n.Id))\n                    {\n                        nodeDic.Add(n.Id, node.Id);\n                    }\n                    _nodes_Repositories.Insert(node);\n                    newNodes.Add(node);\n\n                    // 检查与潜在相关节点的关系\n                    foreach (var relatedNodeId in potentialRelatedNodes)\n                    {\n                        var node1 = _nodes_Repositories.GetFirst(p => p.Id == relatedNodeId);\n                        if (node1 != null)\n                        {\n                            string text1 = $\"Name:{node1.Name};Type:{node1.Type};Desc:{node1.Desc}\";\n                            var relationShip = await _semanticService.GetRelationship(text1, text2);\n                            if (relationShip.IsRelationship)\n                            {\n                                if (relationShip.Edge.Source == \"node1\")\n                                {\n                                    relationShip.Edge.Source = node1.Id;\n                                    relationShip.Edge.Target = Id;\n                                }\n                                else\n                                {\n                                    relationShip.Edge.Source = Id;\n                                    relationShip.Edge.Target = node1.Id;\n                                }\n                                if (!_edges_Repositories.IsAny(p => p.Target == relationShip.Edge.Target && p.Source == relationShip.Edge.Source))\n                                {\n                                    relationShip.Edge.Id = Guid.NewGuid().ToString();\n                                    relationShip.Edge.Index = index;\n                                    _edges_Repositories.Insert(relationShip.Edge);\n                                }\n                            }\n                        }\n                    }\n\n                    //向量处理节点信息\n                    await textMemory.SaveInformationAsync(index, id: node.Id, text: text2, cancellationToken: default);\n                }\n\n                foreach (var e in graph.Edges)\n                {\n                    Edges edge = new Edges()\n                    {\n                        Id = Guid.NewGuid().ToString(),\n                        Index = index,\n                        Source = nodeDic[e.Source],\n                        Target = nodeDic[e.Target],\n                        Relationship = e.Relationship\n                    };\n                    _edges_Repositories.Insert(edge);\n                }\n\n                // 检测和处理孤立节点\n                await ProcessOrphanNodesAsync(index, newNodes, textMemory);\n\n                //查询Edges 的Source和Target 重复数据\n                var repeatEdges = _edges_Repositories.GetDB().Queryable<Edges>()\n                .GroupBy(p => new { p.Source, p.Target })\n                .Select(p => new { p.Source, p.Target, Count = SqlFunc.AggregateCount(p.Source) })\n                .ToList().Where(p => p.Count > 1).ToList();\n                //合并查询Edges 的Source和Target 重复数据\n                foreach (var edge in repeatEdges)\n                {\n                    var edges = _edges_Repositories.GetList(p => p.Source == edge.Source && p.Target == edge.Target);\n                    var firstEdge = edges.First();\n\n                    for (int i = 1; i < edges.Count(); i++)\n                    {\n                        if (firstEdge.Relationship == edges[i].Relationship)\n                        {\n                            //相同的边进行合并\n                            _edges_Repositories.Delete(edges[i]);\n                            continue;\n                        }\n                        var newDesc = await _semanticService.MergeDesc(firstEdge.Relationship, edges[i].Relationship);\n                        firstEdge.Relationship = newDesc;\n                        _edges_Repositories.Update(firstEdge);\n                        _edges_Repositories.Delete(edges[i]);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine($\"插入数据失败：{ex.ToString()}\");\n            }\n        }\n\n        /// <summary>\n        /// 检索相关节点\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public async Task<GraphModel> SearchGraphModel(string index, string input)\n        {\n            if (string.IsNullOrWhiteSpace(index) || string.IsNullOrWhiteSpace(input))\n            {\n                throw new ArgumentException(\"Values required for index and input cannot be null.\");\n            }\n\n            var textMemModelList = await RetrieveTextMemModelList(index, input);\n\n            if (textMemModelList.Any())\n            {\n                var nodes = _nodes_Repositories.GetList(p => p.Index == index && textMemModelList.Select(c => c.Id).Contains(p.Id));\n                // 创建节点权重字典\n                Dictionary<string, double> nodeWeights = textMemModelList.ToDictionary(\n                    t => t.Id,\n                    t => t.Relevance\n                );\n                var graphModel = GetGraphAllRecursion(index, nodes, nodeWeights);\n\n                // 计算预估的token数量，并在必要时限制节点数量\n                int estimatedTokens = EstimateTokenCount(graphModel);\n                if (estimatedTokens > GraphSearchOption.MaxTokens)\n                {\n                    Console.WriteLine($\"预估Token数量 {estimatedTokens} 超过限制 {GraphSearchOption.MaxTokens}，正在调整节点数量...\");\n                    graphModel = LimitGraphByTokenCount(graphModel, nodeWeights);\n                }\n\n                return graphModel;\n            }\n            else\n            {\n                return new GraphModel();\n            }\n        }\n\n        /// <summary>\n        /// 估算图模型的token数量\n        /// </summary>\n        /// <param name=\"model\">图模型</param>\n        /// <returns>估算的token数量</returns>\n        private int EstimateTokenCount(GraphModel model)\n        {\n            int tokenCount = 0;\n\n            // 估算节点的token（每个单词约1.3个token，每个节点信息加上额外开销）\n            foreach (var node in model.Nodes)\n            {\n                // 节点ID和名称估算\n                tokenCount += (node.Id?.Length ?? 0) / 3 + 2;\n                tokenCount += (node.Name?.Length ?? 0) / 3 + 2;\n\n                // 节点描述估算（一个汉字约等于1个token，英文单词约等于0.75个token）\n                string desc = node.Desc ?? \"\";\n                int chineseCount = desc.Count(c => c >= 0x4E00 && c <= 0x9FFF);\n                int otherCount = desc.Length - chineseCount;\n                tokenCount += chineseCount + (int)(otherCount * 0.75);\n\n                // 节点额外属性估算\n                tokenCount += 10; // 额外结构开销\n            }\n\n            // 估算边的token\n            tokenCount += model.Edges.Count * 10; // 每个边的结构信息约10个token\n\n            // JSON结构开销\n            tokenCount += 200;\n\n            return tokenCount;\n        }\n\n        /// <summary>\n        /// 根据token数量限制图大小\n        /// </summary>\n        /// <param name=\"model\">原始图模型</param>\n        /// <param name=\"nodeWeights\">节点权重</param>\n        /// <returns>裁剪后的图模型</returns>\n        private GraphModel LimitGraphByTokenCount(GraphModel model, Dictionary<string, double> nodeWeights)\n        {\n            var result = new GraphModel();\n\n            // 将节点按权重排序\n            var sortedNodes = model.Nodes\n                .OrderByDescending(n => nodeWeights.GetValueOrDefault(n.Id, 0))\n                .ToList();\n\n            // 从高权重节点开始添加，直到接近token限制\n            var selectedNodes = new List<Nodes>();\n            int currentTokens = 200; // 基础结构开销\n\n            foreach (var node in sortedNodes)\n            {\n                // 计算添加此节点后的token数\n                string desc = node.Desc ?? \"\";\n                int chineseCount = desc.Count(c => c >= 0x4E00 && c <= 0x9FFF);\n                int otherCount = desc.Length - chineseCount;\n                int nodeTokens = chineseCount + (int)(otherCount * 0.75) +\n                                (node.Id?.Length ?? 0) / 3 +\n                                (node.Name?.Length ?? 0) / 3 + 15;\n\n                // 如果添加此节点会超过限制，跳过\n                if (currentTokens + nodeTokens > GraphSearchOption.MaxTokens * 0.9)\n                {\n                    continue;\n                }\n\n                selectedNodes.Add(node);\n                currentTokens += nodeTokens;\n            }\n\n            // 只保留连接选中节点的边\n            var selectedEdges = model.Edges.Where(e =>\n                selectedNodes.Any(n => n.Id == e.Source) &&\n                selectedNodes.Any(n => n.Id == e.Target)\n            ).ToList();\n\n            result.Nodes = selectedNodes;\n            result.Edges = selectedEdges;\n\n            Console.WriteLine($\"节点限制调整：从 {model.Nodes.Count} 个节点减少到 {result.Nodes.Count} 个节点\");\n            Console.WriteLine($\"预估调整后Token数：约 {currentTokens}\");\n\n            return result;\n        }\n\n        /// <summary>\n        /// 通过社区算法匹配相关节点信息\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        /// <exception cref=\"ArgumentException\"></exception>\n        public async Task<GraphModel> SearchGraphCommunityModel(string index, string input)\n        {\n            if (string.IsNullOrWhiteSpace(index) || string.IsNullOrWhiteSpace(input))\n            {\n                throw new ArgumentException(\"Values required for index and input cannot be null.\");\n            }\n\n            var textMemModelList = await RetrieveTextMemModelList(index, input);\n            if (!textMemModelList.Any())\n            {\n                // 尝试降低阈值重新检索\n                textMemModelList = await RetrieveTextMemModelList(index, input, 0.3, 5);\n            }\n\n            if (textMemModelList.Any())\n            {\n                var nodes = _nodes_Repositories.GetList(p => p.Index == index && textMemModelList.Select(c => c.Id).Contains(p.Id));\n                var graphModel = GetGraphAllCommunitiesRecursion(index, nodes);\n\n                // 计算预估的token数量，并在必要时限制节点数量\n                int estimatedTokens = EstimateTokenCount(graphModel);\n                if (estimatedTokens > GraphSearchOption.MaxTokens)\n                {\n                    Console.WriteLine($\"社区检索：预估Token数量 {estimatedTokens} 超过限制 {GraphSearchOption.MaxTokens}，正在调整节点数量...\");\n                    // 为社区节点创建权重字典（默认权重相同）\n                    Dictionary<string, double> nodeWeights = graphModel.Nodes.ToDictionary(\n                        n => n.Id,\n                        n => 1.0\n                    );\n                    // 为初始检索到的节点赋予更高权重\n                    foreach (var node in nodes)\n                    {\n                        if (nodeWeights.ContainsKey(node.Id))\n                        {\n                            nodeWeights[node.Id] = 2.0; // 给初始节点更高权重\n                        }\n                    }\n                    graphModel = LimitGraphByTokenCount(graphModel, nodeWeights);\n                }\n\n                return graphModel;\n            }\n            else\n            {\n                return new GraphModel();\n            }\n        }\n\n        /// <summary>\n        /// 搜索递归获取节点相关的所有边和节点进行图谱对话\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        public async Task<string> SearchGraphAsync(string index, string input)\n        {\n            var graphModel = await SearchGraphModel(index, input);\n            string answer = await _semanticService.GetGraphAnswerAsync(JsonConvert.SerializeObject(graphModel), input);\n            return answer;\n        }\n\n        /// <summary>\n        /// 搜索递归获取节点相关的所有边和节点进行图谱对话,流式返回\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        public async IAsyncEnumerable<StreamingKernelContent> SearchGraphStreamAsync(string index, string input)\n        {\n            var graphModel = await SearchGraphModel(index, input);\n            if (graphModel.Nodes.Count() > 0)\n            {\n                var answerStream = _semanticService.GetGraphAnswerStreamAsync(JsonConvert.SerializeObject(graphModel), input);\n                await foreach (var content in answerStream)\n                {\n                    yield return content;\n                }\n            }\n        }\n\n        /// <summary>\n        /// 通过社区算法检索社区节点进行对话\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        public async Task<string> SearchGraphCommunityAsync(string index, string input)\n        {\n            string answer = \"\";\n            var graphModel = await SearchGraphCommunityModel(index, input);\n            var global = _globals_Repositories.GetFirst(p => p.Index == index)?.Summaries;\n            if (graphModel.Nodes.Count() > 0)\n            {\n                var community = string.Join(Environment.NewLine, _communities_Repositories.GetDB().Queryable<Communities>().Where(p => p.Index == index).Select(p => p.Summaries).ToList());\n\n                //这里数据有点多，要通过语义进行一次过滤\n                answer = await _semanticService.GetGraphCommunityAnswerAsync(JsonConvert.SerializeObject(graphModel), community, global, input);\n            }\n            else\n            {\n                //如果没有匹配到节点信息，使用全局信息\n                answer = await _semanticService.GetGraphCommunityAnswerAsync(\"NoSearch\", \"NoSearch\", global, input);\n            }\n            return answer;\n        }\n\n        /// <summary>\n        /// 通过社区算法检索社区节点进行对话,流式返回\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"input\"></param>\n        /// <returns></returns>\n        public async IAsyncEnumerable<StreamingKernelContent> SearchGraphCommunityStreamAsync(string index, string input)\n        {\n            var textMemModelList = await RetrieveTextMemModelList(index, input);\n            var global = _globals_Repositories.GetFirst(p => p.Index == index)?.Summaries;\n            IAsyncEnumerable<StreamingKernelContent> answer;\n\n            //匹配到节点信息\n            var graphModel = await SearchGraphCommunityModel(index, input);\n            if (graphModel.Nodes.Count() > 0)\n            {\n                var community = string.Join(Environment.NewLine, _communities_Repositories.GetDB().Queryable<Communities>().Where(p => p.Index == index).Select(p => p.Summaries).ToList());\n                //这里数据有点多，要通过语义进行一次过滤\n                answer = _semanticService.GetGraphCommunityAnswerStreamAsync(JsonConvert.SerializeObject(graphModel), community, global, input);\n            }\n            else\n            {\n                //如果没有匹配到节点信息，使用全局信息\n                answer = _semanticService.GetGraphCommunityAnswerStreamAsync(\"NoSearch\", \"NoSearch\", global, input);\n            }\n            await foreach (var content in answer)\n            {\n                yield return content;\n            }\n        }\n\n        /// <summary>\n        /// 社区摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public async Task GraphCommunitiesAsync(string index)\n        {\n            var nodes = _nodes_Repositories.GetList(p => p.Index == index);\n            var edges = _edges_Repositories.GetList(p => p.Index == index);\n\n            //删除社区数据\n            _communitieNodes_Repositories.Delete(p => p.Index == index);\n            _communities_Repositories.Delete(p => p.Index == index);\n\n            var graph = new Graph();\n            foreach (var edge in edges)\n            {\n                graph.AddEdge(edge.Source, edge.Target);\n            }\n\n            //重新计算社区\n            var result = _communityDetectionService.FastLabelPropagationAlgorithm(graph);\n\n            Console.WriteLine(\"开始社区总结\");\n            foreach (var kvp in result)\n            {\n                //插入社区节点数据\n                CommunitieNodes communitieNodes = new CommunitieNodes();\n                communitieNodes.Index = index;\n                communitieNodes.CommunitieId = kvp.Value;\n                communitieNodes.NodeId = kvp.Key;\n                _communitieNodes_Repositories.Insert(communitieNodes);\n            }\n            //获取所有社区ID\n            var communitieIds = _communitieNodes_Repositories.GetDB().Queryable<CommunitieNodes>().Where(p => p.Index == index).GroupBy(p => p.CommunitieId).Select(p => p.CommunitieId).ToList();\n\n            foreach (var communitieId in communitieIds)\n            {\n                var nodeList = _communitieNodes_Repositories.GetDB().Queryable<CommunitieNodes>()\n                    .LeftJoin<Nodes>((c, n) => c.NodeId == n.Id)\n                    .Where(c => c.CommunitieId == communitieId)\n                    .Select((c, n) => $\"Name:{n.Name}; Type:{n.Type}; Desc:{n.Desc}\")\n                    .ToList();\n\n                var nodeDescs = string.Join(Environment.NewLine, nodeList);\n                var summaries = await _semanticService.CommunitySummaries(nodeDescs);\n\n                Communities communities = new Communities()\n                {\n                    CommunitieId = communitieId,\n                    Index = index,\n                    Summaries = summaries\n                };\n                //插入社区总结数据\n                _communities_Repositories.Insert(communities);\n            }\n\n        }\n\n        /// <summary>\n        /// 全局摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public async Task GraphGlobalAsync(string index)\n        {\n            _globals_Repositories.Delete(p => p.Index == index);\n            var communitieSummariesList = _communities_Repositories.GetDB().Queryable<Communities>().Where(p => p.Index == index).Select(p => p.Summaries).ToList();\n            var communitieSummaries = string.Join(Environment.NewLine, communitieSummariesList);\n            var globalSummaries = await _semanticService.GlobalSummaries(communitieSummaries);\n\n            Globals globals = new Globals()\n            {\n                Index = index,\n                Summaries = globalSummaries\n            };\n            _globals_Repositories.Insert(globals);\n        }\n\n        /// <summary>\n        /// 增强图谱关系：为现有节点发现和建立新的关系\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public async Task EnhanceGraphRelationshipsAsync(string index)\n        {\n            if (string.IsNullOrWhiteSpace(index))\n            {\n                throw new ArgumentException(\"Index required value cannot be null.\");\n            }\n\n            Console.WriteLine(\"开始增强图谱关系...\");\n            SemanticTextMemory textMemory = await _semanticService.GetTextMemory();\n\n            // 获取所有孤立或连接较少的节点\n            var allNodes = _nodes_Repositories.GetList(p => p.Index == index);\n            var lowConnectedNodes = new List<Nodes>();\n\n            foreach (var node in allNodes)\n            {\n                var connectionCount = _edges_Repositories.GetDB().Queryable<Edges>()\n                    .Where(e => (e.Source == node.Id || e.Target == node.Id) && e.Index == index)\n                    .Count();\n\n                // 如果连接数少于2个，认为是需要增强的节点\n                if (connectionCount < 2)\n                {\n                    lowConnectedNodes.Add(node);\n                }\n            }\n\n            Console.WriteLine($\"发现 {lowConnectedNodes.Count} 个需要增强关系的节点\");\n\n            // 为每个低连接节点尝试建立新关系\n            int enhancedCount = 0;\n            foreach (var node in lowConnectedNodes)\n            {\n                try\n                {\n                    int newConnections = await AttemptConnectOrphanNodeAsync(index, node, textMemory);\n                    if (newConnections > 0)\n                    {\n                        enhancedCount++;\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Console.WriteLine($\"增强节点 {node.Name} 关系时出错：{ex.Message}\");\n                }\n            }\n\n            Console.WriteLine($\"关系增强完成，共为 {enhancedCount} 个节点建立了新关系\");\n        }\n\n        /// <summary>\n        /// 批量关系验证：检查并优化现有关系的质量\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public async Task ValidateAndOptimizeRelationshipsAsync(string index)\n        {\n            if (string.IsNullOrWhiteSpace(index))\n            {\n                throw new ArgumentException(\"Index required value cannot be null.\");\n            }\n\n            Console.WriteLine(\"开始验证和优化现有关系...\");\n\n            var allEdges = _edges_Repositories.GetList(p => p.Index == index);\n            var weakRelationships = new List<Edges>();\n\n            // 识别可能需要优化的关系\n            foreach (var edge in allEdges)\n            {\n                // 检查关系描述是否过于简单或模糊\n                if (string.IsNullOrWhiteSpace(edge.Relationship) ||\n                    edge.Relationship.Length < 3 ||\n                    edge.Relationship.ToLower().Contains(\"related\") ||\n                    edge.Relationship.ToLower().Contains(\"associated\"))\n                {\n                    weakRelationships.Add(edge);\n                }\n            }\n\n            Console.WriteLine($\"发现 {weakRelationships.Count} 个需要优化的关系\");\n\n            // 优化弱关系\n            int optimizedCount = 0;\n            foreach (var edge in weakRelationships.Take(20)) // 限制处理数量\n            {\n                try\n                {\n                    var sourceNode = _nodes_Repositories.GetFirst(p => p.Id == edge.Source);\n                    var targetNode = _nodes_Repositories.GetFirst(p => p.Id == edge.Target);\n\n                    if (sourceNode != null && targetNode != null)\n                    {\n                        string sourceText = $\"Name:{sourceNode.Name};Type:{sourceNode.Type};Desc:{sourceNode.Desc}\";\n                        string targetText = $\"Name:{targetNode.Name};Type:{targetNode.Type};Desc:{targetNode.Desc}\";\n\n                        var newRelationship = await _semanticService.GetRelationship(sourceText, targetText);\n                        if (newRelationship.IsRelationship &&\n                            !string.IsNullOrWhiteSpace(newRelationship.Edge.Relationship) &&\n                            newRelationship.Edge.Relationship != edge.Relationship)\n                        {\n                            edge.Relationship = newRelationship.Edge.Relationship;\n                            _edges_Repositories.Update(edge);\n                            optimizedCount++;\n                            Console.WriteLine($\"优化关系: {sourceNode.Name} -> {targetNode.Name}: {newRelationship.Edge.Relationship}\");\n                        }\n                    }\n                }\n                catch (Exception ex)\n                {\n                    Console.WriteLine($\"优化关系时出错：{ex.Message}\");\n                }\n            }\n\n            Console.WriteLine($\"关系优化完成，共优化了 {optimizedCount} 个关系\");\n        }\n\n        public async Task DeleteGraph(string index)\n        {\n            SemanticTextMemory textMemory = await _semanticService.GetTextMemory();\n            var nodes = await _nodes_Repositories.GetListAsync(p => p.Index == index);\n            foreach (var node in nodes)\n            {\n                //删除向量数据\n                await textMemory.RemoveAsync(index, node.Id);\n            }\n            //删除索引数据\n            await _nodes_Repositories.DeleteAsync(p => p.Index == index);\n            await _edges_Repositories.DeleteAsync(p => p.Index == index);\n            await _communities_Repositories.DeleteAsync(p => p.Index == index);\n            await _communitieNodes_Repositories.DeleteAsync(p => p.Index == index);\n            await _globals_Repositories.DeleteAsync(p => p.Index == index);\n        }\n\n\n        #region 内部方法\n\n        /// <summary>\n        /// 检测和处理孤立节点\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"newNodes\"></param>\n        /// <param name=\"textMemory\"></param>\n        /// <returns></returns>\n        private async Task ProcessOrphanNodesAsync(string index, List<Nodes> newNodes, SemanticTextMemory textMemory)\n        {\n            Console.WriteLine($\"开始检测孤立节点，新增节点数：{newNodes.Count}\");\n\n            foreach (var node in newNodes)\n            {\n                // 检查节点是否为孤立节点（没有任何边连接）\n                bool hasConnections = _edges_Repositories.IsAny(p =>\n                    (p.Source == node.Id || p.Target == node.Id) && p.Index == index);\n\n                if (!hasConnections)\n                {\n                    Console.WriteLine($\"发现孤立节点：{node.Name}\");\n                    var connectionsFound = await AttemptConnectOrphanNodeAsync(index, node, textMemory);\n                    Console.WriteLine($\"为节点 {node.Name} 建立了 {connectionsFound} 个新连接\");\n                }\n            }\n        }\n\n        /// <summary>\n        /// 尝试为孤立节点建立连接\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"orphanNode\"></param>\n        /// <param name=\"textMemory\"></param>\n        /// <returns>返回建立的新连接数量</returns>\n        private async Task<int> AttemptConnectOrphanNodeAsync(string index, Nodes orphanNode, SemanticTextMemory textMemory)\n        {\n            string nodeText = $\"Name:{orphanNode.Name};Type:{orphanNode.Type};Desc:{orphanNode.Desc}\";\n\n            // 使用更低的阈值和更多的搜索结果来寻找潜在关系\n            List<string> candidateNodes = new List<string>();\n\n            // 第一轮：基于节点描述搜索\n            await foreach (MemoryQueryResult memory in textMemory.SearchAsync(index, nodeText, limit: 10, minRelevanceScore: 0.5))\n            {\n                if (memory.Metadata.Id != orphanNode.Id)\n                {\n                    candidateNodes.Add(memory.Metadata.Id);\n                }\n            }\n\n            // 第二轮：基于节点名称搜索（针对命名实体）\n            if (candidateNodes.Count < 3)\n            {\n                await foreach (MemoryQueryResult memory in textMemory.SearchAsync(index, orphanNode.Name, limit: 5, minRelevanceScore: 0.6))\n                {\n                    if (memory.Metadata.Id != orphanNode.Id && !candidateNodes.Contains(memory.Metadata.Id))\n                    {\n                        candidateNodes.Add(memory.Metadata.Id);\n                    }\n                }\n            }\n\n            // 第三轮：基于节点类型搜索相同类型的实体\n            if (candidateNodes.Count < 2)\n            {\n                var sameTypeNodes = _nodes_Repositories.GetList(p =>\n                    p.Index == index && p.Type == orphanNode.Type && p.Id != orphanNode.Id)\n                    .Take(5).Select(p => p.Id).ToList();\n\n                foreach (var nodeId in sameTypeNodes)\n                {\n                    if (!candidateNodes.Contains(nodeId))\n                    {\n                        candidateNodes.Add(nodeId);\n                    }\n                }\n            }\n\n            // 尝试建立关系\n            int connectionsFound = 0;\n            foreach (var candidateId in candidateNodes.Take(5)) // 限制检查数量以控制成本\n            {\n                var candidateNode = _nodes_Repositories.GetFirst(p => p.Id == candidateId);\n                if (candidateNode != null)\n                {\n                    string candidateText = $\"Name:{candidateNode.Name};Type:{candidateNode.Type};Desc:{candidateNode.Desc}\";\n\n                    try\n                    {\n                        var relationShip = await _semanticService.GetRelationship(candidateText, nodeText);\n                        if (relationShip.IsRelationship)\n                        {\n                            // 确定关系方向\n                            string sourceId, targetId;\n                            if (relationShip.Edge.Source == \"node1\")\n                            {\n                                sourceId = candidateNode.Id;\n                                targetId = orphanNode.Id;\n                            }\n                            else\n                            {\n                                sourceId = orphanNode.Id;\n                                targetId = candidateNode.Id;\n                            }\n\n                            // 检查关系是否已存在\n                            if (!_edges_Repositories.IsAny(p => p.Source == sourceId && p.Target == targetId && p.Index == index))\n                            {\n                                var edge = new Edges()\n                                {\n                                    Id = Guid.NewGuid().ToString(),\n                                    Index = index,\n                                    Source = sourceId,\n                                    Target = targetId,\n                                    Relationship = relationShip.Edge.Relationship\n                                };\n                                _edges_Repositories.Insert(edge);\n                                connectionsFound++;\n                                Console.WriteLine($\"为孤立节点 {orphanNode.Name} 建立关系：{relationShip.Edge.Relationship} -> {candidateNode.Name}\");\n\n                                // 如果已经找到足够的连接，停止搜索\n                                if (connectionsFound >= 2)\n                                {\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    catch (Exception ex)\n                    {\n                        Console.WriteLine($\"为孤立节点建立关系时出错：{ex.Message}\");\n                    }\n                }\n            }\n\n            if (connectionsFound == 0)\n            {\n                Console.WriteLine($\"警告：未能为孤立节点 {orphanNode.Name} 建立任何关系\");\n            }\n\n            return connectionsFound;\n        }\n\n        /// <summary>\n        /// 基于搜索条件检索TextMemModel的列表。\n        /// </summary>\n        /// <param name=\"index\">索引</param>\n        /// <param name=\"input\">输入文本</param>\n        /// <param name=\"minRelevance\">最小相关性阈值</param>\n        /// <param name=\"limit\">搜索结果限制</param>\n        /// <returns></returns>\n        private async Task<List<TextMemModel>> RetrieveTextMemModelList(string index, string input, double? minRelevance = null, int? limit = null)\n        {\n            SemanticTextMemory textMemory = await _semanticService.GetTextMemory();\n            List<TextMemModel> textMemModelList = new List<TextMemModel>();\n\n            // 使用提供的阈值或默认配置\n            double relevanceThreshold = minRelevance ?? GraphSearchOption.SearchMinRelevance;\n            int resultLimit = limit ?? GraphSearchOption.SearchLimit;\n\n            int matchCount = 0;\n            await foreach (MemoryQueryResult memory in textMemory.SearchAsync(index, input, limit: resultLimit, minRelevanceScore: relevanceThreshold))\n            {\n                matchCount++;\n                var textMemModel = new TextMemModel()\n                {\n                    Id = memory.Metadata.Id,\n                    Text = memory.Metadata.Text,\n                    Relevance = memory.Relevance\n                };\n                textMemModelList.Add(textMemModel);\n            }\n\n            // 如果结果不足，尝试降低阈值\n            if (matchCount < 2 && relevanceThreshold > 0.3)\n            {\n                double lowerThreshold = Math.Max(0.3, relevanceThreshold - 0.2);\n                Console.WriteLine($\"结果不足，降低阈值至:{lowerThreshold}重试\");\n\n                await foreach (MemoryQueryResult memory in textMemory.SearchAsync(index, input, limit: resultLimit + 2, minRelevanceScore: lowerThreshold))\n                {\n                    if (!textMemModelList.Any(t => t.Id == memory.Metadata.Id))\n                    {\n                        matchCount++;\n                        var textMemModel = new TextMemModel()\n                        {\n                            Id = memory.Metadata.Id,\n                            Text = memory.Metadata.Text,\n                            Relevance = memory.Relevance\n                        };\n                        textMemModelList.Add(textMemModel);\n                    }\n                }\n            }\n\n            // 按相关性排序\n            textMemModelList = textMemModelList.OrderByDescending(t => t.Relevance).ToList();\n            Console.WriteLine($\"向量匹配数:{matchCount}, 最高相关度:{(textMemModelList.Any() ? textMemModelList.First().Relevance.ToString(\"F2\") : \"N/A\")}\");\n            return textMemModelList;\n        }\n\n        /// <summary>\n        /// 递归获取节点相关的所有边和节点\n        /// </summary>\n        /// <param name=\"index\">索引</param>\n        /// <param name=\"initialNodes\">初始节点列表</param>\n        /// <param name=\"nodeWeights\">节点权重字典</param>\n        /// <returns></returns>\n        private GraphModel GetGraphAllRecursion(string index, List<Nodes> initialNodes, Dictionary<string, double> nodeWeights)\n        {\n            var allNodes = new List<Nodes>(initialNodes);\n            var allEdges = new List<Edges>();\n            var nodesToExplore = new List<Nodes>(initialNodes);\n            int depth = 0;\n\n            while (nodesToExplore.Count > 0)\n            {\n                if (depth >= GraphSearchOption.NodeDepth || allNodes.Count >= GraphSearchOption.MaxNodes)\n                {\n                    break;\n                }\n\n                // 按权重排序待探索节点\n                nodesToExplore = nodesToExplore\n                    .OrderByDescending(n => nodeWeights.ContainsKey(n.Id) ? nodeWeights[n.Id] : 0)\n                    .ToList();\n\n                var currentNodes = nodesToExplore.Take(Math.Min(5, nodesToExplore.Count)).ToList();\n                nodesToExplore.RemoveRange(0, currentNodes.Count);\n\n                var newEdges = GetEdges(index, currentNodes);\n                if (!newEdges.Any())\n                {\n                    continue;\n                }\n\n                // 添加新边，避免重复\n                foreach (var edge in newEdges)\n                {\n                    if (!allEdges.Any(e => e.Source == edge.Source && e.Target == edge.Target))\n                    {\n                        allEdges.Add(edge);\n\n                        // 为新发现的节点设置权重\n                        double parentWeight = nodeWeights.GetValueOrDefault(edge.Source, 0);\n                        double weightDecay = 0.8; // 权重衰减因子\n\n                        if (!nodeWeights.ContainsKey(edge.Target))\n                        {\n                            nodeWeights[edge.Target] = parentWeight * weightDecay;\n                        }\n                    }\n                }\n\n                // 获取新节点\n                var newNodes = GetNodes(index, newEdges);\n                var nodesToAdd = newNodes.Where(n => !allNodes.Any(existingNode => existingNode.Id == n.Id)).ToList();\n                allNodes.AddRange(nodesToAdd);\n                nodesToExplore.AddRange(nodesToAdd);\n\n                depth++;\n            }\n\n            // 如果节点数超过限制，保留权重最高的节点\n            if (allNodes.Count > GraphSearchOption.MaxNodes)\n            {\n                allNodes = allNodes\n                    .OrderByDescending(n => nodeWeights.GetValueOrDefault(n.Id, 0))\n                    .Take(GraphSearchOption.MaxNodes)\n                    .ToList();\n\n                // 确保边的节点都在保留的节点中\n                allEdges = allEdges\n                    .Where(e => allNodes.Any(n => n.Id == e.Source) && allNodes.Any(n => n.Id == e.Target))\n                    .ToList();\n            }\n\n            return new GraphModel\n            {\n                Nodes = allNodes,\n                Edges = allEdges\n            };\n        }\n\n\n        /// <summary>\n        /// 通过社区算法检索社区节点\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"initialNodes\"></param>\n        /// <returns></returns>\n        private GraphModel GetGraphAllCommunitiesRecursion(string index, List<Nodes> initialNodes)\n        {\n            var allNodes = new List<Nodes>();\n            var allEdges = new List<Edges>();\n\n            var nodeIds = initialNodes.Select(x => x.Id).ToList();\n\n            var communitiesNodes = _communities_Repositories.GetDB().Queryable<Communities>()\n                .LeftJoin<CommunitieNodes>((c, cn) => c.CommunitieId == cn.CommunitieId)\n                .LeftJoin<Nodes>((c, cn, n) => cn.NodeId == n.Id)\n                .Where((c, cn, n) => nodeIds.Contains(n.Id)).Select((c, cn, n) => new Nodes() { Index = n.Index, Id = n.Id, Name = n.Name, Type = n.Type, Desc = n.Desc }).ToList();\n            allNodes.AddRange(communitiesNodes);\n            var newEdges = GetEdges(index, allNodes);\n\n            foreach (var edge in newEdges)\n            {\n                if (!allEdges.Any(e => e.Source == edge.Source && e.Target == edge.Target))\n                {\n                    allEdges.Add(edge);\n                }\n            }\n\n            // 如果节点数超过最大限制，进行截断\n            if (allNodes.Count > GraphSearchOption.MaxNodes)\n            {\n                allNodes = allNodes.Take(GraphSearchOption.MaxNodes).ToList();\n            }\n            // 需要相应地处理 allEdges，确保边的节点在 allNodes 中 \n            allEdges = allEdges.Where(e => allNodes.Any(p => p.Id == e.Source) && allNodes.Any(p => p.Id == e.Target)).ToList();\n\n            return new GraphModel\n            {\n                Nodes = allNodes,\n                Edges = allEdges\n            };\n        }\n\n        /// <summary>\n        /// 获取边信息\n        /// </summary>\n        /// <param name=\"index\">索引</param>\n        /// <param name=\"nodes\">节点列表</param>\n        /// <returns></returns>\n        private List<Edges> GetEdges(string index, List<Nodes> nodes)\n        {\n            var nodeIds = nodes.Select(x => x.Id).ToList();\n            var edges = new List<Edges>();\n            edges = _edges_Repositories.GetList(x => x.Index == index && nodeIds.Contains(x.Source) && nodeIds.Contains(x.Target));\n            return edges;\n        }\n\n        /// <summary>\n        /// 获取节点信息\n        /// </summary>\n        /// <param name=\"index\">索引</param>\n        /// <param name=\"edges\">边列表</param>\n        /// <returns></returns>\n        private List<Nodes> GetNodes(string index, List<Edges> edges)\n        {\n            var targets = edges.Select(p => p.Target).ToList();\n            var sources = edges.Select(p => p.Source).ToList();\n            List<string> nodeIds = new List<string>();\n            nodeIds.AddRange(targets);\n            nodeIds.AddRange(sources);\n\n            var nodes = _nodes_Repositories.GetList(p => p.Index == index || nodeIds.Contains(p.Id));\n            return nodes;\n        }\n\n        /// <summary>\n        /// 获取相关社区ID列表\n        /// </summary>\n        private List<string> GetRelevantCommunities(string index, List<string> nodeIds)\n        {\n            var communities = _communitieNodes_Repositories.GetDB().Queryable<CommunitieNodes>()\n                .Where(cn => nodeIds.Contains(cn.NodeId))\n                .Select(cn => cn.CommunitieId)\n                .Distinct()\n                .ToList();\n\n            return communities;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Domain/Service/SemanticService.cs",
    "content": "﻿using Azure.AI.OpenAI;\nusing GraphRag.Net.Options;\nusing GraphRag.Net.Domain.Interface;\nusing GraphRag.Net.Utils;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.Connectors.OpenAI;\nusing Microsoft.SemanticKernel.Connectors.Postgres;\nusing Microsoft.SemanticKernel.Connectors.Sqlite;\nusing Microsoft.SemanticKernel.Memory;\nusing Npgsql;\nusing Newtonsoft.Json;\nusing GraphRag.Net.Domain.Model.Graph;\nusing Polly;\nusing Polly.Retry;\nusing GraphRag.Net.Common.Options;\n\nnamespace GraphRag.Net.Domain.Service\n{\n    [ServiceDescription(typeof(ISemanticService), ServiceLifetime.Scoped)]\n    public class SemanticService(Kernel _kernel) : ISemanticService\n    {\n        public async Task<GraphModel> CreateGraphAsync(string input)\n        {\n            var retryPolicy = Policy.Handle<Exception>().RetryAsync(GraphSysOption.RetryCounnt, (ex, count) =>\n            {\n                Console.WriteLine($\"CreateGraphAsync失败，重试{count}次，异常信息{ex.Message}\");\n            });\n            var result = await retryPolicy.ExecuteAsync<GraphModel>(async () =>\n            {\n                OpenAIPromptExecutionSettings settings = new()\n                {\n                    Temperature = 0,\n                    ResponseFormat = ChatCompletionsResponseFormat.JsonObject\n                };\n                KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"create\");\n                var args = new KernelArguments(settings)\n                {\n                    [\"input\"] = input,\n                };\n                var skresult = await _kernel.InvokeAsync(createFun, args);\n\n                string json = skresult.GetValue<string>()?.Trim() ?? \"\";\n                var graph = JsonConvert.DeserializeObject<GraphModel>(json);\n                return graph;\n\n            });\n            return result;\n        }\n        public async Task<string> GetGraphAnswerAsync(string graph, string input)\n        {\n            KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"search\");\n            var args = new KernelArguments()\n            {\n                [\"graph\"] = graph,\n                [\"input\"] = input,\n            };\n            var skresult = await _kernel.InvokeAsync(createFun, args);\n\n            string result = skresult.GetValue<string>()?.Trim() ?? \"\";\n            return result;\n        }\n        public async IAsyncEnumerable<StreamingKernelContent> GetGraphAnswerStreamAsync(string graph, string input)\n        {\n            KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"search\");\n            var args = new KernelArguments()\n            {\n                [\"graph\"] = graph,\n                [\"input\"] = input,\n            };\n            var skresult = _kernel.InvokeStreamingAsync(createFun, args);\n            await foreach (var content in skresult)\n            {\n                yield return content;\n            }\n        }\n\n\n        public async Task<string> GetGraphCommunityAnswerAsync(string graph, string community, string global, string input)\n        {\n\n            KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"community_search\");\n            var args = new KernelArguments()\n            {\n                [\"graph\"] = graph,\n                [\"community\"] = community,\n                [\"global\"] = global,\n                [\"input\"] = input,\n            };\n            var skresult = await _kernel.InvokeAsync(createFun, args);\n\n            string result = skresult.GetValue<string>()?.Trim() ?? \"\";\n            return result;\n        }\n\n        public async IAsyncEnumerable<StreamingKernelContent> GetGraphCommunityAnswerStreamAsync(string graph, string community, string global, string input)\n        {\n            KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"community_search\");\n            var args = new KernelArguments()\n            {\n                [\"graph\"] = graph,\n                [\"community\"] = community,\n                [\"global\"] = global,\n                [\"input\"] = input,\n            };\n            var skresult = _kernel.InvokeStreamingAsync(createFun, args);\n            await foreach (var content in skresult)\n            {\n                yield return content;\n            }\n\n        }\n\n\n        public async Task<RelationShipModel> GetRelationship(string node1, string node2)\n        {\n            var retryPolicy = Policy.Handle<Exception>().RetryAsync(GraphSysOption.RetryCounnt, (ex, count) =>\n            {\n                Console.WriteLine($\"GetRelationship失败，重试{count}次，异常信息{ex.Message}\");\n            });\n            var result = await retryPolicy.ExecuteAsync<RelationShipModel>(async () =>\n            {\n                OpenAIPromptExecutionSettings settings = new()\n                {\n                    Temperature = 0,\n                    ResponseFormat = ChatCompletionsResponseFormat.JsonObject\n                };\n                KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"relationship\");\n                var args = new KernelArguments(settings)\n                {\n                    [\"node1\"] = node1,\n                    [\"node2\"] = node2,\n                };\n                var skresult = await _kernel.InvokeAsync(createFun, args);\n\n                string json = skresult.GetValue<string>()?.Trim() ?? \"\";\n\n                var relation = JsonConvert.DeserializeObject<RelationShipModel>(json);\n                return relation;\n            });\n            return result;\n        }\n\n        public async Task<string> MergeDesc(string desc1, string desc2)\n        {\n            KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"mergedesc\");\n            var args = new KernelArguments()\n            {\n                [\"desc1\"] = desc1,\n                [\"desc2\"] = desc2,\n            };\n            var skresult = await _kernel.InvokeAsync(createFun, args);\n\n            string result = skresult.GetValue<string>()?.Trim() ?? \"\";\n            return result;\n        }\n        public async Task<string> CommunitySummaries(string nodes)\n        {\n            KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"community_summaries\");\n            var args = new KernelArguments()\n            {\n                [\"nodes\"] = nodes\n            };\n            var skresult = await _kernel.InvokeAsync(createFun, args);\n\n            string result = skresult.GetValue<string>()?.Trim() ?? \"\";\n            return result;\n        }\n        public async Task<string> GlobalSummaries(string community)\n        {\n            KernelFunction createFun = _kernel.Plugins.GetFunction(\"graph\", \"global_summaries\");\n            var args = new KernelArguments()\n            {\n                [\"community\"] = community\n            };\n            var skresult = await _kernel.InvokeAsync(createFun, args);\n\n            string result = skresult.GetValue<string>()?.Trim() ?? \"\";\n            return result;\n        }\n\n        /// <summary>\n        /// 获取SemanticTextMemory\n        /// </summary>\n        /// <returns></returns>\n        /// <exception cref=\"InvalidOperationException\"></exception>\n        public async Task<SemanticTextMemory> GetTextMemory()\n        {\n            IMemoryStore memoryStore = null;\n            switch (GraphDBConnectionOption.DbType)\n            {\n                case \"Sqlite\":\n                    memoryStore = await SqliteMemoryStore.ConnectAsync(GraphDBConnectionOption.VectorConnection);\n                    break;\n                case \"PostgreSQL\":\n                    NpgsqlDataSourceBuilder dataSourceBuilder = new(GraphDBConnectionOption.VectorConnection);\n                    dataSourceBuilder.UseVector();\n                    NpgsqlDataSource dataSource = dataSourceBuilder.Build();\n                    memoryStore = new PostgresMemoryStore(dataSource, vectorSize: 1536, schema: \"public\");\n                    break;\n            }\n            if (memoryStore == null)\n            {\n                throw new InvalidOperationException(\"GraphDBConnection error failed to initialize memory store.\");\n            }\n\n            var handler = new OpenAIHttpClientHandler();\n            var httpClient = new HttpClient(handler);\n            httpClient.Timeout = TimeSpan.FromMinutes(10);\n            var embeddingGenerator = new OpenAITextEmbeddingGenerationService(GraphOpenAIOption.EmbeddingModel, GraphOpenAIOption.Key, httpClient: new HttpClient(handler));\n            SemanticTextMemory textMemory = new(memoryStore, embeddingGenerator);\n\n            return textMemory;\n        }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Extensions/ServiceCollectionExtensions.cs",
    "content": "﻿using System.Reflection;\nusing GraphRag.Net;\nusing GraphRag.Net.Options;\nusing GraphRag.Net.Repositories;\nusing GraphRag.Net.Utils;\nusing Microsoft.SemanticKernel;\nusing SqlSugar;\n\nnamespace Microsoft.Extensions.DependencyInjection\n{\n    /// <summary>\n    /// 容器扩展\n    /// </summary>\n    public static class ServiceCollectionExtensions\n    {\n        /// <summary>\n        /// 从程序集中加载类型并添加到容器中\n        /// </summary>\n        /// <param name=\"services\">容器</param>\n        /// <returns></returns>\n        public static IServiceCollection AddGraphRagNet(this IServiceCollection services, Kernel _kernel = null)\n        {\n            Type attributeType = typeof(ServiceDescriptionAttribute);\n            //var refAssembyNames = Assembly.GetExecutingAssembly().GetReferencedAssemblies();\n\n            Assembly assembly = Assembly.Load(\"GraphRag.Net\");\n\n            var types = assembly.GetTypes();\n\n            foreach (var classType in types)\n            {\n                if (!classType.IsAbstract && classType.IsClass && classType.IsDefined(attributeType, false))\n                {\n                    ServiceDescriptionAttribute serviceAttribute = (classType.GetCustomAttribute(attributeType) as ServiceDescriptionAttribute);\n                    switch (serviceAttribute.Lifetime)\n                    {\n                        case ServiceLifetime.Scoped:\n                            services.AddScoped(serviceAttribute.ServiceType, classType);\n                            break;\n\n                        case ServiceLifetime.Singleton:\n                            services.AddSingleton(serviceAttribute.ServiceType, classType);\n                            break;\n\n                        case ServiceLifetime.Transient:\n                            services.AddTransient(serviceAttribute.ServiceType, classType);\n                            break;\n                    }\n                }\n            }\n\n            CodeFirst();\n            InitSK(services, _kernel);\n\n            return services;\n        }\n\n        /// <summary>\n        /// 初始化SK\n        /// </summary>\n        /// <param name=\"services\"></param>\n        /// <param name=\"_kernel\">可以提供自定义Kernel</param>\n        static void InitSK(IServiceCollection services,Kernel _kernel = null)\n        {\n            var handler = new OpenAIHttpClientHandler();\n            services.AddTransient<Kernel>((serviceProvider) =>\n            {\n                if (_kernel == null)\n                {\n                    _kernel = Kernel.CreateBuilder()\n                    .AddOpenAIChatCompletion(\n                      modelId: GraphOpenAIOption.ChatModel,\n                      apiKey: GraphOpenAIOption.Key,\n                      httpClient: new HttpClient(handler)\n                         )\n                    .Build();\n                }\n                //导入插件\n                if (!_kernel.Plugins.Any(p => p.Name == \"graph\"))\n                {\n                    var pluginPatth = Path.Combine(RepoFiles.SamplePluginsPath(), \"graph\");\n                    Console.WriteLine($\"pluginPatth:{pluginPatth}\");\n                    _kernel.ImportPluginFromPromptDirectory(pluginPatth);\n                }\n                return _kernel;\n            });\n        }\n\n        /// <summary>\n        /// 初始化DB\n        /// </summary>\n        static void CodeFirst()\n        {\n            // 获取仓储服务\n            var _repository = new Nodes_Repositories();\n\n            // 创建数据库（如果不存在）\n            _repository.GetDB().DbMaintenance.CreateDatabase();\n            // 在所有程序集中查找具有[SugarTable]特性的类\n            var assembly = Assembly.GetExecutingAssembly();\n            // 获取该程序集中所有具有SugarTable特性的类型\n            var entityTypes = assembly.GetTypes()\n                    .Where(type => TypeIsEntity(type));\n            // 为每个找到的类型初始化数据库表\n            foreach (var type in entityTypes)\n            {\n                _repository.GetDB().CodeFirst.InitTables(type);\n            }\n        }\n\n        static bool TypeIsEntity(Type type)\n        {\n            // 检查类型是否具有SugarTable特性\n            return type.GetCustomAttributes(typeof(SugarTable), inherit: false).Length > 0;\n        }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/GraphRag.Net.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>\n    <LangVersion>latest</LangVersion>\n    <Version>$(Version)</Version>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <Authors>许泽宇</Authors>\n    <Product>GraphRag.Net</Product>\n    <Company>xuzeyu</Company>  \n    <Title>GraphRag.Net</Title>\n    <Description>\n      GraphRag for .NET –这是一个参考GraphRag的DotNet简易实现。\n      基于微软在论文中提到的实现思路，执行过程GraphRAG主要实现了如下功能：\n      Source Documents → Text Chunks：将源文档分割成文本块。\n      Text Chunks → Element Instances：从每个文本块中提取图节点和边的实例。\n      Element Instances → Element Summaries：为每个图元素生成摘要。\n      Element Summaries → Graph Communities：使用社区检测算法将图划分为社区。\n      Graph Communities → Community Summaries：为每个社区生成摘要。\n      Community Summaries → Community Answers → Global Answer：使用社区摘要生成局部答案，然后汇总这些局部答案以生成全局答案。\n      商务需求联系微信xuzeyu91\n    </Description>\n    <PackageProjectUrl>https://github.com/xuzeyu91/GraphRag.Net</PackageProjectUrl>\n    <Tags>AI, Rag, GraphRag</Tags>\n    <PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>\n    <NoWarn>CA1050,CA1707,CA2007,VSTHRD111,CS1591,RCS1110,CA5394,SKEXP0001,SKEXP0002,SKEXP0003,SKEXP0004,SKEXP0010,SKEXP0011,,SKEXP0012,SKEXP0020,SKEXP0021,SKEXP0022,SKEXP0023,SKEXP0024,SKEXP0025,SKEXP0026,SKEXP0027,SKEXP0028,SKEXP0029,SKEXP0030,SKEXP0031,SKEXP0032,SKEXP0040,SKEXP0041,SKEXP0042,SKEXP0050,SKEXP0051,SKEXP0052,SKEXP0053,SKEXP0054,SKEXP0055,SKEXP0060,SKEXP0061,SKEXP0101,SKEXP0102</NoWarn>\n    <GenerateDocumentationFile>True</GenerateDocumentationFile>\n    <DocumentationFile>GraphRag.Net.xml</DocumentationFile>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.SemanticKernel\" Version=\"$(SKVersion)\" />\n    <PackageReference Include=\"Microsoft.SemanticKernel.Core\" Version=\"$(SKVersion)\" />\n    <PackageReference Include=\"Microsoft.SemanticKernel.Plugins.Core\" Version=\"$(SKVersion)-alpha\" />\n    <PackageReference Include=\"Microsoft.SemanticKernel.Connectors.Postgres\" Version=\"$(SKVersion)-alpha\" />\n    <PackageReference Include=\"Microsoft.SemanticKernel.Connectors.Sqlite\" Version=\"$(SKVersion)-alpha\" />\n    <PackageReference Include=\"Microsoft.SemanticKernel.Plugins.Memory\" Version=\"$(SKVersion)-alpha\" />\n    <PackageReference Include=\"Polly\" Version=\"8.5.0\" />\n    <PackageReference Include=\"SqlSugarCore\" Version=\"5.1.4.171\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Base/IRepository.cs",
    "content": "﻿\nusing GraphRag.Net.Model;\nusing SqlSugar;\nusing System.Linq.Expressions;\n\nnamespace GraphRag.Net.Base\n{\n    public interface IRepository<T>\n    {\n        SqlSugarScope GetDB();\n        List<T> GetList();\n        Task<List<T>> GetListAsync();\n        List<T> GetList(Expression<Func<T, bool>> whereExpression);\n        Task<List<T>> GetListAsync(Expression<Func<T, bool>> whereExpression);\n        int Count(Expression<Func<T, bool>> whereExpression);\n        Task<int> CountAsync(Expression<Func<T, bool>> whereExpression);\n        PageList<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel page);\n        Task<PageList<T>> GetPageListAsync(Expression<Func<T, bool>> whereExpression, PageModel page);\n\n        PageList<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel page, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc);\n        Task<PageList<T>> GetPageListAsync(Expression<Func<T, bool>> whereExpression, PageModel page, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc);\n    \n        PageList<T> GetPageList(List<IConditionalModel> conditionalList, PageModel page);\n        Task<PageList<T>> GetPageListAsync(List<IConditionalModel> conditionalList, PageModel page);\n        PageList<T> GetPageList(List<IConditionalModel> conditionalList, PageModel page, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc);\n        Task<PageList<T>> GetPageListAsync(List<IConditionalModel> conditionalList, PageModel page, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc);\n        T GetById(dynamic id);\n        Task<T> GetByIdAsync(dynamic id);\n        T GetSingle(Expression<Func<T, bool>> whereExpression);\n        Task<T> GetSingleAsync(Expression<Func<T, bool>> whereExpression);\n        T GetFirst(Expression<Func<T, bool>> whereExpression);\n        Task<T> GetFirstAsync(Expression<Func<T, bool>> whereExpression);\n        bool Insert(T obj);\n        Task<bool> InsertAsync(T obj);\n        bool InsertRange(List<T> objs);\n        Task<bool> InsertRangeAsync(List<T> objs);\n        int InsertReturnIdentity(T obj);\n        Task<int> InsertReturnIdentityAsync(T obj);\n        long InsertReturnBigIdentity(T obj);\n        Task<long> InsertReturnBigIdentityAsync(T obj);\n        bool DeleteByIds(dynamic[] ids);\n        Task<bool> DeleteByIdsAsync(dynamic[] ids);\n        bool Delete(dynamic id);\n        Task<bool> DeleteAsync(dynamic id);\n        bool Delete(T obj);\n        Task<bool> DeleteAsync(T obj);\n        bool Delete(Expression<Func<T, bool>> whereExpression);\n        Task<bool> DeleteAsync(Expression<Func<T, bool>> whereExpression);\n        bool Update(T obj);\n        Task<bool> UpdateAsync(T obj);\n        bool UpdateRange(List<T> objs);\n        bool InsertOrUpdate(T obj);\n        Task<bool> InsertOrUpdateAsync(T obj);\n        Task<bool> UpdateRangeAsync(List<T> objs);\n        bool IsAny(Expression<Func<T, bool>> whereExpression);\n        Task<bool> IsAnyAsync(Expression<Func<T, bool>> whereExpression);\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Base/Repository.cs",
    "content": "﻿using GraphRag.Net.Model;\nusing SqlSugar;\nusing System.Linq.Expressions;\n\n\nnamespace GraphRag.Net.Base\n{\n    public class Repository<T> : SimpleClient<T> where T : class, new()\n    {\n\n        public Repository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null\n        {\n\n            if (context == null)\n            {\n            }\n\n        }\n\n        //注意：如果使用Client不能写成静态的，Scope并发更高\n\n        public static SqlSugarScope SqlScope = SqlSugarHelper.SqlScope();\n        public SimpleClient<T> CurrentDb\n        { get { return new SimpleClient<T>(SqlScope); } }//用来处理T表的常用操作\n\n        #region 通用方法\n\n        public virtual SqlSugarScope GetDB()\n        {\n            return SqlScope;\n        }\n\n        /// <summary>\n        /// 获取所有list\n        /// </summary>\n        /// <returns></returns>\n        public virtual List<T> GetList()\n        {\n            return CurrentDb.GetList();\n        }\n\n        /// <summary>\n        /// 获取所有list-异步\n        /// </summary>\n        /// <returns></returns>\n        public virtual async Task<List<T>> GetListAsync()\n        {\n            return await CurrentDb.GetListAsync();\n        }\n\n        /// <summary>\n        /// 根据lambda查询\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual List<T> GetList(Expression<Func<T, bool>> whereExpression)\n        {\n            return CurrentDb.GetList(whereExpression);\n        }\n\n        /// <summary>\n        /// 根据lambda查询-异步\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual async Task<List<T>> GetListAsync(Expression<Func<T, bool>> whereExpression)\n        {\n            return await CurrentDb.GetListAsync(whereExpression);\n        }\n\n        /// <summary>\n        /// 根据lambda表达式获取数量\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual int Count(Expression<Func<T, bool>> whereExpression)\n        {\n            return CurrentDb.Count(whereExpression);\n        }\n\n        /// <summary>\n        /// 根据lambda表达式获取数量-异步\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual async Task<int> CountAsync(Expression<Func<T, bool>> whereExpression)\n        {\n            return await CurrentDb.CountAsync(whereExpression);\n        }\n\n        /// <summary>\n        /// 获取分页\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <param name=\"page\"></param>\n        /// <returns></returns>\n        public virtual PageList<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel page)\n        {\n            PageList<T> list = new PageList<T>();\n            list.List = CurrentDb.GetPageList(whereExpression, page);\n            list.PageIndex = page.PageIndex;\n            list.PageSize = page.PageSize;\n            list.TotalCount = page.TotalCount;\n            return list;\n        }\n\n        /// <summary>\n        /// 获取分页-异步\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <param name=\"page\"></param>\n        /// <returns></returns>\n        public virtual async Task<PageList<T>> GetPageListAsync(Expression<Func<T, bool>> whereExpression, PageModel page)\n        {\n            PageList<T> list = new PageList<T>();\n            list.List = await CurrentDb.GetPageListAsync(whereExpression, page);\n            list.PageIndex = page.PageIndex;\n            list.PageSize = page.PageSize;\n            list.TotalCount = page.TotalCount;\n            return list;\n        }\n\n        public virtual PageList<T> GetPageList(Expression<Func<T, bool>> whereExpression, PageModel page, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc)\n        {\n            PageList<T> list = new PageList<T>();\n            list.List = CurrentDb.GetPageList(whereExpression, page, orderByExpression, orderByType);\n            list.PageIndex = page.PageIndex;\n            list.PageSize = page.PageSize;\n            list.TotalCount = page.TotalCount;\n            return list;\n        }\n\n        public virtual async Task<PageList<T>> GetPageListAsync(Expression<Func<T, bool>> whereExpression, PageModel page, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc)\n        {\n            PageList<T> list = new PageList<T>();\n            list.List = await CurrentDb.GetPageListAsync(whereExpression, page, orderByExpression, orderByType);\n            list.PageIndex = page.PageIndex;\n            list.PageSize = page.PageSize;\n            list.TotalCount = page.TotalCount;\n            return list;\n        }\n\n        public virtual PageList<T> GetPageList(List<IConditionalModel> conditionalList, PageModel page)\n        {\n            PageList<T> list = new PageList<T>();\n            list.List = CurrentDb.GetPageList(conditionalList, page);\n            list.PageIndex = page.PageIndex;\n            list.PageSize = page.PageSize;\n            list.TotalCount = page.TotalCount;\n            return list;\n        }\n\n        public virtual async Task<PageList<T>> GetPageListAsync(List<IConditionalModel> conditionalList, PageModel page)\n        {\n            PageList<T> list = new PageList<T>();\n            list.List = await CurrentDb.GetPageListAsync(conditionalList, page);\n            list.PageIndex = page.PageIndex;\n            list.PageSize = page.PageSize;\n            list.TotalCount = page.TotalCount;\n            return list;\n        }\n\n        public virtual PageList<T> GetPageList(List<IConditionalModel> conditionalList, PageModel page, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc)\n        {\n            PageList<T> list = new PageList<T>();\n            list.List = CurrentDb.GetPageList(conditionalList, page, orderByExpression, orderByType);\n            list.PageIndex = page.PageIndex;\n            list.PageSize = page.PageSize;\n            list.TotalCount = page.TotalCount;\n            return list;\n        }\n\n        public virtual async Task<PageList<T>> GetPageListAsync(List<IConditionalModel> conditionalList, PageModel page, Expression<Func<T, object>> orderByExpression = null, OrderByType orderByType = OrderByType.Asc)\n        {\n            PageList<T> list = new PageList<T>();\n            list.List = await CurrentDb.GetPageListAsync(conditionalList, page, orderByExpression, orderByType);\n            list.PageIndex = page.PageIndex;\n            list.PageSize = page.PageSize;\n            list.TotalCount = page.TotalCount;\n            return list;\n        }\n\n        /// <summary>\n        /// 根据id获取实体\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public virtual T GetById(dynamic id)\n        {\n            return CurrentDb.GetById(id);\n        }\n\n        /// <summary>\n        /// 根据id获取实体-异步\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public virtual async Task<T> GetByIdAsync(dynamic id)\n        {\n            return await CurrentDb.GetByIdAsync(id);\n        }\n\n        /// <summary>\n        /// 根据lambda获取单个对象 （注意，需要确保唯一，如果获取到2个会报错，这种场景需要使用GetFirst）\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual T GetSingle(Expression<Func<T, bool>> whereExpression)\n        {\n            return CurrentDb.GetSingle(whereExpression); //Db.Queryable<T>().First(whereExpression);\n        }\n\n        /// <summary>\n        /// 根据lambda获取单个对象-异步  （注意，需要确保唯一，如果获取到2个会报错，这种场景需要使用GetFirst）\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual async Task<T> GetSingleAsync(Expression<Func<T, bool>> whereExpression)\n        {\n            return await CurrentDb.GetSingleAsync(whereExpression); //await Db.Queryable<T>().FirstAsync(whereExpression);\n        }\n\n        /// <summary>\n        /// 根据lambda获取单个对象\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual T GetFirst(Expression<Func<T, bool>> whereExpression)\n        {\n            return GetDB().Queryable<T>().First(whereExpression);\n        }\n\n        /// <summary>\n        /// 根据lambda获取单个对象 --异步\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual async Task<T> GetFirstAsync(Expression<Func<T, bool>> whereExpression)\n        {\n            return await GetDB().Queryable<T>().FirstAsync(whereExpression);\n        }\n\n        /// <summary>\n        /// 实体插入\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual bool Insert(T obj)\n        {\n            return CurrentDb.Insert(obj);\n        }\n\n        /// <summary>\n        /// 实体插入-异步\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> InsertAsync(T obj)\n        {\n            return await CurrentDb.InsertAsync(obj);\n        }\n\n        /// <summary>\n        /// 批量插入\n        /// </summary>\n        /// <param name=\"objs\"></param>\n        /// <returns></returns>\n        public virtual bool InsertRange(List<T> objs)\n        {\n            return CurrentDb.InsertRange(objs);\n        }\n\n        /// <summary>\n        /// 批量插入-异步\n        /// </summary>\n        /// <param name=\"objs\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> InsertRangeAsync(List<T> objs)\n        {\n            return await CurrentDb.InsertRangeAsync(objs);\n        }\n\n        /// <summary>\n        /// 插入返回自增列\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual int InsertReturnIdentity(T obj)\n        {\n            return CurrentDb.InsertReturnIdentity(obj);\n        }\n\n        /// <summary>\n        /// 插入返回自增列-异步\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual async Task<int> InsertReturnIdentityAsync(T obj)\n        {\n            return await CurrentDb.InsertReturnIdentityAsync(obj);\n        }\n\n        /// <summary>\n        /// 插入返回longid\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual long InsertReturnBigIdentity(T obj)\n        {\n            return CurrentDb.InsertReturnBigIdentity(obj);\n        }\n\n        /// <summary>\n        /// 插入返回longid-异步\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual async Task<long> InsertReturnBigIdentityAsync(T obj)\n        {\n            return await CurrentDb.InsertReturnBigIdentityAsync(obj);\n        }\n\n        /// <summary>\n        /// 批量删除\n        /// </summary>\n        /// <param name=\"ids\"></param>\n        /// <returns></returns>\n        public virtual bool DeleteByIds(dynamic[] ids)\n        {\n            return CurrentDb.DeleteByIds(ids);\n        }\n\n        /// <summary>\n        /// 批量删除-异步\n        /// </summary>\n        /// <param name=\"ids\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> DeleteByIdsAsync(dynamic[] ids)\n        {\n            return await CurrentDb.DeleteByIdsAsync(ids);\n        }\n\n        /// <summary>\n        /// 根据主键删除\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public virtual bool Delete(dynamic id)\n        {\n            return CurrentDb.DeleteById(id);\n        }\n\n        /// <summary>\n        /// 根据主键删除-异步\n        /// </summary>\n        /// <param name=\"id\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> DeleteAsync(dynamic id)\n        {\n            return await CurrentDb.DeleteByIdAsync(id);\n        }\n\n        /// <summary>\n        /// 根据实体删除\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual bool Delete(T obj)\n        {\n            return CurrentDb.Delete(obj);\n        }\n\n        /// <summary>\n        /// 根据实体删除-异步\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> DeleteAsync(T obj)\n        {\n            return await CurrentDb.DeleteAsync(obj);\n        }\n\n        /// <summary>\n        /// 根据表达式删除\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual bool Delete(Expression<Func<T, bool>> whereExpression)\n        {\n            return CurrentDb.Delete(whereExpression);\n        }\n\n        /// <summary>\n        /// 根据表达式删除-异步\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> DeleteAsync(Expression<Func<T, bool>> whereExpression)\n        {\n            return await CurrentDb.DeleteAsync(whereExpression);\n        }\n\n        /// <summary>\n        /// 更新\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual bool Update(T obj)\n        {\n            return CurrentDb.Update(obj);\n        }\n\n        /// <summary>\n        /// 更新-异步\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> UpdateAsync(T obj)\n        {\n            return await CurrentDb.UpdateAsync(obj);\n        }\n\n        /// <summary>\n        /// 批量更新\n        /// </summary>\n        /// <param name=\"objs\"></param>\n        /// <returns></returns>\n        public virtual bool UpdateRange(List<T> objs)\n        {\n            return CurrentDb.UpdateRange(objs);\n        }\n\n        /// <summary>\n        /// 新增或修改\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual bool InsertOrUpdate(T obj)\n        {\n            return CurrentDb.InsertOrUpdate(obj);\n        }\n\n        /// <summary>\n        /// 新增或修改-异步\n        /// </summary>\n        /// <param name=\"obj\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> InsertOrUpdateAsync(T obj)\n        {\n            return await CurrentDb.InsertOrUpdateAsync(obj);\n        }\n\n\n        /// <summary>\n        /// 批量更新-异步\n        /// </summary>\n        /// <param name=\"objs\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> UpdateRangeAsync(List<T> objs)\n        {\n            return await CurrentDb.UpdateRangeAsync(objs);\n        }\n\n        /// <summary>\n        /// 是否包含元素\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual bool IsAny(Expression<Func<T, bool>> whereExpression)\n        {\n            return CurrentDb.IsAny(whereExpression);\n        }\n\n        /// <summary>\n        /// 是否包含元素-异步\n        /// </summary>\n        /// <param name=\"whereExpression\"></param>\n        /// <returns></returns>\n        public virtual async Task<bool> IsAnyAsync(Expression<Func<T, bool>> whereExpression)\n        {\n            return await CurrentDb.IsAnyAsync(whereExpression);\n        }\n\n        #endregion 通用方法\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Base/SqlSugarHelper.cs",
    "content": "﻿using GraphRag.Net.Options;\nusing SqlSugar;\nusing System.Reflection;\n\nnamespace GraphRag.Net.Base\n{\n    public class SqlSugarHelper()\n    {\n\n        /// <summary>\n        /// sqlserver连接\n        /// </summary>\n        public static SqlSugarScope SqlScope()\n        {\n\n            string DBType = GraphDBConnectionOption.DbType;\n            string ConnectionString = GraphDBConnectionOption.DBConnection;\n\n            var config = new ConnectionConfig()\n            {\n                ConnectionString = ConnectionString,\n                InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息\n                IsAutoCloseConnection = true,\n                ConfigureExternalServices = new ConfigureExternalServices\n                {\n                    //注意:  这儿AOP设置不能少\n                    EntityService = (c, p) =>\n                    {\n                        /***高版C#写法***/\n                        //支持string?和string  \n                        if (p.IsPrimarykey == false && new NullabilityInfoContext()\n                         .Create(c).WriteState is NullabilityState.Nullable)\n                        {\n                            p.IsNullable = true;\n                        }\n                    }\n                }\n            };\n            DbType dbType = (DbType)Enum.Parse(typeof(DbType), DBType);\n            config.DbType = dbType;\n            var scope = new SqlSugarScope(config, Db =>\n            {\n\n            });\n            return scope;\n        }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/CommunitieNodes/CommunitieNodes.cs",
    "content": "﻿using SqlSugar;\n\nnamespace GraphRag.Net.Repositories\n{\n    /// <summary>\n    /// 社区与节点关系\n    /// </summary>\n    [SugarTable(\"CommunitieNodes\")]\n    [SugarIndex(\"i_communitienodes_index\", nameof(CommunitieNodes.Index), OrderByType.Asc)]\n    [SugarIndex(\"i_communitienodes_communitieid\", nameof(CommunitieNodes.CommunitieId), OrderByType.Asc)]\n    [SugarIndex(\"i_communitienodes_nodeid\", nameof(CommunitieNodes.NodeId), OrderByType.Asc)]\n    public class CommunitieNodes\n    {\n        /// <summary>\n        /// 索引信息\n        /// </summary>\n        public string Index { get; set; }\n        /// <summary>\n        /// 社区关键节点ID\n        /// </summary>\n        public string CommunitieId { get; set; }\n        /// <summary>\n        /// 节点ID\n        /// </summary>\n        public string NodeId { get; set; }\n\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/CommunitieNodes/CommunitieNodes_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace GraphRag.Net.Repositories\n{\n    [ServiceDescription(typeof(ICommunitieNodes_Repositories), ServiceLifetime.Scoped)]\n    public class CommunitieNodes_Repositories : Repository<CommunitieNodes>, ICommunitieNodes_Repositories\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/CommunitieNodes/ICommunitieNodes_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\n\nnamespace GraphRag.Net.Repositories\n{\n    public interface ICommunitieNodes_Repositories : IRepository<CommunitieNodes>\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Communities/Communities.cs",
    "content": "﻿using SqlSugar;\n\nnamespace GraphRag.Net.Repositories\n{\n    /// <summary>\n    /// 社区\n    /// </summary>\n    [SugarTable(\"Communities\")]\n    [SugarIndex(\"i_communities_index\", nameof(Communities.Index), OrderByType.Asc)]\n    public class Communities\n    {\n        /// <summary>\n        /// 社区ID\n        /// </summary>\n        [SugarColumn(IsPrimaryKey = true)]\n        public string CommunitieId { get; set; }\n\n        /// <summary>\n        /// 索引信息\n        /// </summary>\n        public string Index { get; set; }\n\n        /// <summary>\n        /// 社区摘要\n        /// </summary>\n        [SugarColumn(ColumnDataType = \"varchar(4000)\")]\n        public string Summaries { get; set; }\n\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Communities/Communities_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace GraphRag.Net.Repositories\n{\n    [ServiceDescription(typeof(ICommunities_Repositories), ServiceLifetime.Scoped)]\n    public class Communities_Repositories : Repository<Communities>, ICommunities_Repositories\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Communities/ICommunities_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\n\nnamespace GraphRag.Net.Repositories\n{\n    public interface ICommunities_Repositories : IRepository<Communities>\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Edges/Edges.cs",
    "content": "﻿using SqlSugar;\n\nnamespace GraphRag.Net.Repositories\n{\n    /// <summary>\n    /// 边\n    /// </summary>\n    [SugarTable(\"Edges\")]\n    [SugarIndex(\"i_edges_index\", nameof(Edges.Index), OrderByType.Asc)]\n    [SugarIndex(\"i_edges_source\", nameof(Edges.Source), OrderByType.Asc)]\n    [SugarIndex(\"i_edges_target\", nameof(Edges.Target), OrderByType.Asc)]\n    public class Edges\n    {\n        /// <summary>\n        /// 主键\n        /// </summary>\n        [SugarColumn(IsPrimaryKey = true)]\n        public string Id { get; set; }\n        /// <summary>\n        /// 索引\n        /// </summary>\n        public string Index { get; set; }\n        /// <summary>\n        /// 源ID\n        /// </summary>\n        public string Source { get; set; }\n\n        /// <summary>\n        /// 目标ID\n        /// </summary>\n        public string Target { get; set; }\n\n        /// <summary>\n        /// 关系信息\n        /// </summary>\n        [SugarColumn(ColumnDataType = \"varchar(2000)\")]\n        public string Relationship { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Edges/Edges_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace GraphRag.Net.Repositories\n{\n    [ServiceDescription(typeof(IEdges_Repositories), ServiceLifetime.Scoped)]\n    public class Edges_Repositories : Repository<Edges>, IEdges_Repositories\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Edges/IEdges_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\n\nnamespace GraphRag.Net.Repositories\n{\n    public interface IEdges_Repositories : IRepository<Edges>\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Global/Globals.cs",
    "content": "﻿using SqlSugar;\n\nnamespace GraphRag.Net.Repositories\n{\n    /// <summary>\n    /// 社区\n    /// </summary>\n    [SugarTable(\"Globals\")]\n    [SugarIndex(\"i_global_index\", nameof(Globals.Index), OrderByType.Asc)]\n    public class Globals\n    {\n        /// <summary>\n        /// 索引信息\n        /// </summary>\n        public string Index { get; set; }\n\n        /// <summary>\n        /// 全局摘要\n        /// </summary>\n        [SugarColumn(ColumnDataType = \"varchar(4000)\")]\n        public string Summaries { get; set; }\n\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Global/Globals_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace GraphRag.Net.Repositories\n{\n    [ServiceDescription(typeof(IGlobals_Repositories), ServiceLifetime.Scoped)]\n    public class Globals_Repositories : Repository<Globals>, IGlobals_Repositories\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Global/IGlobals_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\n\nnamespace GraphRag.Net.Repositories\n{\n    public interface IGlobals_Repositories : IRepository<Globals>\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Nodes/INodes_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\n\nnamespace GraphRag.Net.Repositories\n{\n    public interface INodes_Repositories : IRepository<Nodes>\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Nodes/Nodes.cs",
    "content": "﻿using SqlSugar;\n\nnamespace GraphRag.Net.Repositories\n{\n    /// <summary>\n    /// 节点\n    /// </summary>\n    [SugarTable(\"Nodes\")]\n    [SugarIndex(\"i_nodes_index\", nameof(Nodes.Index), OrderByType.Asc)]\n    public class Nodes\n    {\n        /// <summary>\n        /// 主键\n        /// </summary>\n        [SugarColumn(IsPrimaryKey = true)]\n        public string Id { get; set; }\n        /// <summary>\n        /// 索引\n        /// </summary>\n        public string Index { get; set; }\n        /// <summary>\n        /// 名称\n        /// </summary>\n        public string Name { get; set; }\n        /// <summary>\n        /// 类型\n        /// </summary>\n        public string Type { get; set; }\n\n        /// <summary>\n        /// 节点描述\n        /// </summary>\n        [SugarColumn(ColumnDataType = \"varchar(2000)\")]\n        public string? Desc { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net/Repositories/Graph/Nodes/Nodes_Repositories.cs",
    "content": "﻿using GraphRag.Net.Base;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace GraphRag.Net.Repositories\n{\n    [ServiceDescription(typeof(INodes_Repositories), ServiceLifetime.Scoped)]\n    public class Nodes_Repositories : Repository<Nodes>, INodes_Repositories\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Utils/ConvertUtils.cs",
    "content": "﻿using Newtonsoft.Json;\nusing System.ComponentModel;\nusing System.Reflection;\nusing System.Text.RegularExpressions;\nusing System.Web;\n\nnamespace GraphRag.Net.Utils\n{\n    internal static class ConvertUtils\n    {\n        /// <summary>\n        /// 判断是否为空，为空返回true\n        /// </summary>\n        /// <param name=\"data\"></param>\n        /// <returns></returns>\n        public static bool IsNull(this object data)\n        {\n            //如果为null\n            if (data == null)\n            {\n                return true;\n            }\n\n            //如果为\"\"\n            if (data.GetType() == typeof(String))\n            {\n                if (string.IsNullOrEmpty(data.ToString().Trim()))\n                {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// 判断是否为空，为空返回true\n        /// </summary>\n        /// <param name=\"data\"></param>\n        /// <returns></returns>\n        public static bool IsNotNull(this object data)\n        {\n            //如果为null\n            if (data == null)\n            {\n                return false;\n            }\n\n            //如果为\"\"\n            if (data.GetType() == typeof(String))\n            {\n                if (string.IsNullOrEmpty(data.ToString().Trim()))\n                {\n                    return false;\n                }\n            }\n            return true;\n        }\n\n        /// <summary>\n        /// 判断是否为空，为空返回true\n        /// </summary>\n        /// <param name=\"data\"></param>\n        /// <returns></returns>\n        public static bool IsNull(string data)\n        {\n            //如果为null\n            if (data == null)\n            {\n                return true;\n            }\n\n            //如果为\"\"\n            if (data.GetType() == typeof(String))\n            {\n                if (string.IsNullOrEmpty(data.ToString().Trim()))\n                {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        /// <summary>\n        /// 将obj类型转换为string\n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <returns></returns>\n        public static string ConvertToString(this object s)\n        {\n            if (s == null)\n            {\n                return \"\";\n            }\n            else\n            {\n                return Convert.ToString(s);\n            }\n        }\n\n        /// <summary>\n        /// object 转int32\n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <returns></returns>\n        public static Int32 ConvertToInt32(this object s)\n        {\n            int i = 0;\n            if (s == null)\n            {\n                return 0;\n            }\n            else\n            {\n                int.TryParse(s.ToString(), out i);\n            }\n            return i;\n        }\n\n        /// <summary>\n        /// object 转int32\n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <returns></returns>\n        public static Int64 ConvertToInt64(this object s)\n        {\n            long i = 0;\n            if (s == null)\n            {\n                return 0;\n            }\n            else\n            {\n                long.TryParse(s.ToString(), out i);\n            }\n            return i;\n        }\n\n        /// <summary>\n        /// 将字符串转double\n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <returns></returns>\n        public static double ConvertToDouble(this object s)\n        {\n            double i = 0;\n            if (s == null)\n            {\n                return 0;\n            }\n            else\n            {\n                double.TryParse(s.ToString(), out i);\n            }\n            return i;\n        }\n\n        /// <summary>\n        /// 转换为datetime类型\n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <returns></returns>\n        public static DateTime ConvertToDateTime(this string s)\n        {\n            DateTime dt = new DateTime();\n            if (s == null || s == \"\")\n            {\n                return DateTime.Now;\n            }\n            DateTime.TryParse(s, out dt);\n            return dt;\n        }\n\n        /// <summary>\n        /// 转换为datetime类型的格式字符串\n        /// </summary>\n        /// <param name=\"s\">要转换的对象</param>\n        /// <param name=\"y\">格式化字符串</param>\n        /// <returns></returns>\n        public static string ConvertToDateTime(this string s, string y)\n        {\n            DateTime dt = new DateTime();\n            DateTime.TryParse(s, out dt);\n            return dt.ToString(y);\n        }\n\n        /// <summary>\n        /// 将字符串转换成decimal\n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <returns></returns>\n        public static decimal ConvertToDecimal(this object s)\n        {\n            decimal d = 0;\n            if (s == null || s == \"\")\n            {\n                return 0;\n            }\n\n            Decimal.TryParse(s.ToString(), out d);\n\n            return d;\n        }\n\n        /// <summary>\n        /// decimal保留2位小数\n        /// </summary>\n        public static decimal DecimalFraction(this decimal num)\n        {\n            return Convert.ToDecimal(num.ToString(\"f2\"));\n        }\n\n        /// <summary>\n        /// 替换html种的特殊字符\n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <returns></returns>\n        public static string ReplaceHtml(this string s)\n        {\n            return s.Replace(\"&lt;\", \"<\").Replace(\"&gt;\", \">\").Replace(\"&amp;\", \"&\").Replace(\"&quot;\", \"\\\"\");\n        }\n\n        /// <summary>\n        /// 流转byte\n        /// </summary>\n        /// <param name=\"stream\"></param>\n        /// <returns></returns>\n        public static byte[] StreamToByte(this Stream stream)\n        {\n            byte[] bytes = new byte[stream.Length];\n            stream.Read(bytes, 0, bytes.Length);\n            // 设置当前流的位置为流的开始\n            stream.Seek(0, SeekOrigin.Begin);\n            return bytes;\n        }\n\n        public static string JsonToMarkDown(this string s)\n        {\n            return $\"{Environment.NewLine}```json{Environment.NewLine}{s}{Environment.NewLine}```{Environment.NewLine}\";\n        }\n\n        /// <summary>\n        /// json参数转化querystring参数\n        /// </summary>\n        /// <param name=\"parameters\"></param>\n        /// <returns></returns>\n        public static string ToQueryString(this Dictionary<string, string> parameters)\n        {\n            var nameValueCollection = HttpUtility.ParseQueryString(string.Empty);\n\n            foreach (var param in parameters)\n            {\n                nameValueCollection[param.Key] = param.Value;\n            }\n\n            return nameValueCollection.ToString();\n        }\n\n        /// <summary>\n        /// 忽略大小写匹配\n        /// </summary>\n        /// <param name=\"s\"></param>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static bool ComparisonIgnoreCase(this string s, string value)\n        {\n            return s.Equals(value, StringComparison.OrdinalIgnoreCase);\n        }\n\n        public static string GetDescription(this Enum value)\n        {\n            FieldInfo field = value.GetType().GetField(value.ToString());\n\n            if (field != null)\n            {\n                DescriptionAttribute attribute = (DescriptionAttribute)field.GetCustomAttribute(typeof(DescriptionAttribute));\n\n                if (attribute != null)\n                {\n                    return attribute.Description;\n                }\n            }\n\n            return value.ToString();\n        }\n\n        /// <summary>\n        /// 是否为流式请求\n        /// </summary>\n        /// <param name=\"value\"></param>\n        /// <returns></returns>\n        public static bool IsStream(this string value)\n        {\n            // 正则表达式忽略空格的情况\n            string pattern = @\"\\s*\"\"stream\"\"\\s*:\\s*true\\s*\";\n\n            // 使用正则表达式匹配\n            bool contains = Regex.IsMatch(value, pattern);\n            return contains;\n        }\n\n        /// <summary>\n        /// \\uxxxx转中文,保留换行符号\n        /// </summary>\n        /// <param name=\"unicodeString\"></param>\n        /// <returns></returns>\n        public static string Unescape(this string value)\n        {\n            if (value.IsNull())\n            {\n                return \"\";\n            }\n\n            try\n            {\n                Formatting formatting = Formatting.None;\n\n                object jsonObj = JsonConvert.DeserializeObject(value);\n                string unescapeValue = JsonConvert.SerializeObject(jsonObj, formatting);\n                return unescapeValue;\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine(ex.ToString());\n                return \"\";\n            }\n        }\n\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Utils/OpenAIHttpClientHandler.cs",
    "content": "﻿using GraphRag.Net.Options;\nusing System.Text;\nusing System.Text.RegularExpressions;\n\n\nnamespace GraphRag.Net.Utils\n{\n    internal class OpenAIHttpClientHandler : HttpClientHandler\n    {\n\n        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n        {\n            UriBuilder uriBuilder;\n            Regex regex = new Regex(@\"(https?)://([^/:]+)(:\\d+)?/(.*)\");\n            Match match = regex.Match(GraphOpenAIOption.EndPoint);\n\n            var mediaType = request.Content.Headers.ContentType.MediaType;\n            string requestBody = (await request.Content.ReadAsStringAsync()).Unescape();\n            var uncaseBody = new StringContent(requestBody, Encoding.UTF8, mediaType);\n            request.Content = uncaseBody;\n\n            if (Environment.GetEnvironmentVariable(\"ASPNETCORE_ENVIRONMENT\") == \"Development\" && request.Content != null)\n            {\n                //便于调试查看请求prompt\n                Console.WriteLine(requestBody);\n            }\n            if (match.Success)\n            {\n                string xieyi = match.Groups[1].Value;\n                string host = match.Groups[2].Value;\n                string port = match.Groups[3].Value; // 可选的端口号\n                string route = match.Groups[4].Value;\n                // 如果port不为空，它将包含冒号，所以你可能需要去除它\n                port = string.IsNullOrEmpty(port) ? port : port.Substring(1);\n                // 拼接host和端口号\n                var hostnew = string.IsNullOrEmpty(port) ? host : $\"{host}:{port}\";\n\n                switch (request.RequestUri.LocalPath)\n                {\n                    case \"/v1/chat/completions\":\n                        //替换代理\n                        uriBuilder = new UriBuilder(request.RequestUri)\n                        {\n                            // 这里是你要修改的 URL\n                            Scheme = $\"{xieyi}://{hostnew}/\",\n                            Host = host,\n                            Path = route + \"v1/chat/completions\",\n                        };\n                        if (port.ConvertToInt32() != 0)\n                        {\n                            uriBuilder.Port = port.ConvertToInt32();\n                        }\n\n                        request.RequestUri = uriBuilder.Uri;\n\n                        break;\n                    case \"/v1/embeddings\":\n                        uriBuilder = new UriBuilder(request.RequestUri)\n                        {\n                            // 这里是你要修改的 URL\n                            Scheme = $\"{xieyi}://{host}/\",\n                            Host = host,\n                            Path = route + \"v1/embeddings\",\n                        };\n                        if (port.ConvertToInt32() != 0)\n                        {\n                            uriBuilder.Port = port.ConvertToInt32();\n                        }\n                        request.RequestUri = uriBuilder.Uri;\n                        break;\n                }\n            }\n\n            // 接着，调用基类的 SendAsync 方法将你的修改后的请求发出去\n            HttpResponseMessage response = await base.SendAsync(request, cancellationToken);\n\n            return response;\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Utils/RepoUtils/AppException.cs",
    "content": "﻿// Copyright (c) Microsoft. All rights reserved.\n\nnamespace GraphRag.Net.Utils;\n\ninternal class AppException : Exception\n{\n    public AppException() : base()\n    {\n    }\n\n    public AppException(string message) : base(message)\n    {\n    }\n\n    public AppException(string message, Exception innerException) : base(message, innerException)\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Utils/RepoUtils/ObjectExtensions.cs",
    "content": "﻿using System.Text.Json;\n\nnamespace GraphRag.Net.Utils\n{\n    internal static class ObjectExtensions\n    {\n        private static readonly JsonSerializerOptions s_jsonOptionsCache = new() { WriteIndented = true };\n\n        public static string AsJson(this object obj)\n        {\n            return JsonSerializer.Serialize(obj, s_jsonOptionsCache);\n        }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net/Utils/RepoUtils/RepoFiles.cs",
    "content": "﻿// Copyright (c) Microsoft. All rights reserved.\n\nusing System.Reflection;\n\nnamespace GraphRag.Net.Utils;\n\ninternal static class RepoFiles\n{\n    /// <summary>\n    /// Scan the local folders from the repo, looking for \"samples/plugins\" folder.\n    /// </summary>\n    /// <returns>The full path to samples/plugins</returns>\n    public static string SamplePluginsPath()\n    {\n        string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;\n        string folderName = \"graphPlugins\";\n\n        string FindPluginsDirectory(string startDir, string targetFolder)\n        {\n            string currDir = Path.GetFullPath(startDir);\n            const int maxAttempts = 10;\n\n            for (int i = 0; i < maxAttempts; i++)\n            {\n                string potentialPath = Path.Combine(currDir, targetFolder);\n                if (Directory.Exists(potentialPath))\n                {\n                    return potentialPath;\n                }\n\n                currDir = Path.GetFullPath(Path.Combine(currDir, \"..\"));\n            }\n\n            return null; // Not found after max attempts.\n        }\n\n        // Check in the BaseDirectory and its parent directories\n        string path = FindPluginsDirectory(baseDirectory, folderName)\n                    ?? FindPluginsDirectory(baseDirectory + Path.DirectorySeparatorChar + folderName, folderName);\n\n        if (string.IsNullOrEmpty(path))\n        {\n            throw new AppException(\"Plugins directory not found. The app needs the plugins from the repo to work.\");\n        }\n        return path;\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/.config/dotnet-tools.json",
    "content": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"dotnet-ef\": {\n      \"version\": \"8.0.8\",\n      \"commands\": [\n        \"dotnet-ef\"\n      ],\n      \"rollForward\": false\n    }\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/App.razor",
    "content": "<Router AppAssembly=\"@typeof(Program).Assembly\">\n    <Found Context=\"routeData\">\n        <CascadingValue Value=\"routeData\">\n            <RouteView RouteData=\"@routeData\" DefaultLayout=\"@typeof(BasicLayout)\" />\n        </CascadingValue>\n    </Found>\n    <NotFound>\n        <LayoutView Layout=\"@typeof(BasicLayout)\">\n            <p>Sorry, there's nothing at this address.</p>\n        </LayoutView>\n    </NotFound>\n</Router>\n<AntContainer />"
  },
  {
    "path": "src/GraphRag.Net.Web/Components/GlobalHeader/RightContent.razor",
    "content": "﻿@namespace GraphRag.Net.Web.Components\n@inherits AntDomComponentBase\n\n<Space Class=\"@ClassMapper.Class\" Size=\"@(\"26\")\">\n    <button class=\"github_btn\" onclick=\"window.open('https://github.com/AIDotNet/GraphRag.Net')\"></button>\n   \n</Space>\n\n\n<style>\n    .github_btn {\n        cursor: pointer;\n        border: none;\n        background-image: url('http://img.shields.io/github/stars/aidotnet/graphrag.net?style=social');\n        width: 88px;\n        height: 20px;\n    }\n</style>"
  },
  {
    "path": "src/GraphRag.Net.Web/Components/GlobalHeader/RightContent.razor.cs",
    "content": "﻿using AntDesign;\nusing AntDesign.ProLayout;\nusing GraphRag.Net.Web.Models;\nusing Microsoft.AspNetCore.Components;\n\nnamespace GraphRag.Net.Web.Components\n{\n    public partial class RightContent\n    {\n        private CurrentUser _currentUser = new CurrentUser();\n        private NoticeIconData[] _notifications = { };\n        private NoticeIconData[] _messages = { };\n        private NoticeIconData[] _events = { };\n        private int _count = 0;\n\n        private List<AutoCompleteDataItem<string>> DefaultOptions { get; set; } = new List<AutoCompleteDataItem<string>>\n        {\n            new AutoCompleteDataItem<string>\n            {\n                Label = \"umi ui\",\n                Value = \"umi ui\"\n            },\n            new AutoCompleteDataItem<string>\n            {\n                Label = \"Pro Table\",\n                Value = \"Pro Table\"\n            },\n            new AutoCompleteDataItem<string>\n            {\n                Label = \"Pro Layout\",\n                Value = \"Pro Layout\"\n            }\n        };\n\n        public AvatarMenuItem[] AvatarMenuItems { get; set; } = new AvatarMenuItem[]\n        {\n            new() { Key = \"center\", IconType = \"user\", Option = \"个人中心\"},\n            new() { Key = \"setting\", IconType = \"setting\", Option = \"个人设置\"},\n            new() { IsDivider = true },\n            new() { Key = \"logout\", IconType = \"logout\", Option = \"退出登录\"}\n        };\n\n        [Inject] protected NavigationManager NavigationManager { get; set; }\n\n        [Inject] protected MessageService MessageService { get; set; }\n\n        protected override async Task OnInitializedAsync()\n        {\n            await base.OnInitializedAsync();\n            SetClassMap();\n\n        }\n\n        protected void SetClassMap()\n        {\n            ClassMapper\n                .Clear()\n                .Add(\"right\");\n        }\n\n        public void HandleSelectUser(MenuItem item)\n        {\n            switch (item.Key)\n            {\n                case \"center\":\n                    NavigationManager.NavigateTo(\"/account/center\");\n                    break;\n                case \"setting\":\n                    NavigationManager.NavigateTo(\"/account/settings\");\n                    break;\n                case \"logout\":\n                    NavigationManager.NavigateTo(\"/user/login\");\n                    break;\n            }\n        }\n\n        public void HandleSelectLang(MenuItem item)\n        {\n        }\n\n        public async Task HandleClear(string key)\n        {\n            switch (key)\n            {\n                case \"notification\":\n                    _notifications = new NoticeIconData[] { };\n                    break;\n                case \"message\":\n                    _messages = new NoticeIconData[] { };\n                    break;\n                case \"event\":\n                    _events = new NoticeIconData[] { };\n                    break;\n            }\n            await MessageService.Success($\"清空了{key}\");\n        }\n\n        public async Task HandleViewMore(string key)\n        {\n            await MessageService.Info(\"Click on view more\");\n        }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Controllers/GraphController.cs",
    "content": "using GraphRag.Net.Domain.Interface;\nusing GraphRag.Net.Domain.Model.Graph;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace GraphRag.Net.Api.Controllers\n{\n    [Route(\"api/[controller]/[action]\")]\n    [ApiController]\n    public class GraphController(IGraphService _graphService) : ControllerBase\n    {\n        /// <summary>\n        /// 获取所有的索引数据\n        /// </summary>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GetAllIndex()\n        {\n            var graphModel = _graphService.GetAllIndex();\n            return Ok(graphModel);\n        }\n\n\n        /// <summary>\n        /// 获取所有的图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GetAllGraphs(string index)\n        {\n            if (string.IsNullOrEmpty(index))\n            {\n                return Ok(new GraphViewModel());\n            }\n            var graphModel = _graphService.GetAllGraphs(index);\n            return Ok(graphModel);\n        }\n\n\n        /// <summary>\n        /// 插入文本数据\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> InsertGraphData(InputModel model)\n        {\n            await _graphService.InsertGraphDataAsync(model.Index, model.Input);\n            return Ok();\n        }\n\n        /// <summary>\n        /// 搜索递归获取节点相关的所有边和节点进行图谱对话\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> SearchGraph(InputModel model)\n        {\n            var result = await _graphService.SearchGraphAsync(model.Index, model.Input);\n            return Ok(result);\n        }\n\n        /// <summary>\n        /// 通过社区算法检索社区节点进行对话\n        /// </summary>\n        /// <param name=\"model\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> SearchGraphCommunity(InputModel model)\n        {\n            var result = await _graphService.SearchGraphCommunityAsync(model.Index, model.Input);\n            return Ok(result);\n        }\n\n        /// <summary>\n        /// 导入txt文档\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <param name=\"file\"></param>\n        /// <returns></returns>\n        [HttpPost]\n        public async Task<IActionResult> ImportTxt(string index,IFormFile file)\n        {\n            var forms = await Request.ReadFormAsync();\n            using (var stream = new StreamReader(file.OpenReadStream()))\n            {\n                var txt = await stream.ReadToEndAsync();\n                await _graphService.InsertTextChunkAsync(index,txt);\n                return Ok();\n            }\n        }\n\n        /// <summary>\n        /// 通过社区检测生成社区和摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GraphCommunities(string index)\n        {\n            await _graphService.GraphCommunitiesAsync(index);\n            return Ok();\n        }      \n        \n        /// <summary>\n        /// 通过社区摘要生成全局摘要\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> GraphGlobal(string index)\n        {\n            await _graphService.GraphGlobalAsync(index);\n            return Ok();\n        }\n\n        /// <summary>\n        /// 删除图谱数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        [HttpGet]\n        public async Task<IActionResult> DeleteGraph(string index)\n        {\n            await _graphService.DeleteGraph(index);\n            return Ok();\n        }\n    }\n\n    public class InputModel\n    {\n        public string Index { get; set; }\n        public string Input { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Extensions/DateTimeExtension.cs",
    "content": "﻿namespace GraphRag.Net.Web\n{\n    public static class DateTimeExtension\n    {\n        private const int Second = 1;\n        private const int Minute = 60 * Second;\n        private const int Hour = 60 * Minute;\n        private const int Day = 24 * Hour;\n        private const int Month = 30 * Day;\n\n        // todo: Need to be localized\n        public static string ToFriendlyDisplay(this DateTime dateTime)\n        {\n            var ts = DateTime.Now - dateTime;\n            var delta = ts.TotalSeconds;\n            if (delta < 0)\n            {\n                return \"not yet\";\n            }\n            if (delta < 1 * Minute)\n            {\n                return ts.Seconds == 1 ? \"1 second ago\" : ts.Seconds + \" seconds ago\";\n            }\n            if (delta < 2 * Minute)\n            {\n                return \"1 minute ago\";\n            }\n            if (delta < 45 * Minute)\n            {\n                return ts.Minutes + \"minute\";\n            }\n            if (delta < 90 * Minute)\n            {\n                return \"1 hour ago\";\n            }\n            if (delta < 24 * Hour)\n            {\n                return ts.Hours + \" hours ago\";\n            }\n            if (delta < 48 * Hour)\n            {\n                return \"yesterday\";\n            }\n            if (delta < 30 * Day)\n            {\n                return ts.Days + \" days ago\";\n            }\n            if (delta < 12 * Month)\n            {\n                var months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));\n                return months <= 1 ? \"A month ago\" : months + \" months ago\";\n            }\n            else\n            {\n                var years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));\n                return years <= 1 ? \"a year ago\" : years + \" years ago\";\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/GraphRag.Net.Web.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>\n    <LangVersion>latest</LangVersion>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Authors>许泽宇</Authors>\n    <Product>GraphRag.Net</Product>\n    <Company>xuzeyu</Company>\n    <Description>商务需求联系微信xuzeyu91</Description>\n    <GenerateDocumentationFile>True</GenerateDocumentationFile>\n    <DocumentationFile>GraphRag.Net.Web.xml</DocumentationFile>\n    <NoWarn>CA1050,CA1707,CA2007,VSTHRD111,CS1591,RCS1110,CA5394,SKEXP0001,SKEXP0002,SKEXP0003,SKEXP0004,SKEXP0010,SKEXP0011,,SKEXP0012,SKEXP0020,SKEXP0021,SKEXP0022,SKEXP0023,SKEXP0024,SKEXP0025,SKEXP0026,SKEXP0027,SKEXP0028,SKEXP0029,SKEXP0030,SKEXP0031,SKEXP0032,SKEXP0040,SKEXP0041,SKEXP0042,SKEXP0050,SKEXP0051,SKEXP0052,SKEXP0053,SKEXP0054,SKEXP0055,SKEXP0060,SKEXP0061,SKEXP0101,SKEXP0102,KMEXP01</NoWarn>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Content Remove=\"graphPlugins\\graph\\community_search\\config.json\" />\n    <Content Remove=\"graphPlugins\\graph\\community_summaries\\config.json\" />\n    <Content Remove=\"graphPlugins\\graph\\create\\config.json\" />\n    <Content Remove=\"graphPlugins\\graph\\global_summaries\\config.json\" />\n    <Content Remove=\"graphPlugins\\graph\\mergedesc\\config.json\" />\n    <Content Remove=\"graphPlugins\\graph\\relationship\\config.json\" />\n    <Content Remove=\"graphPlugins\\graph\\search\\config.json\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Include=\"graphPlugins\\**\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"AntDesign.Charts\" Version=\"0.5.6\" />\n    <PackageReference Include=\"AntDesign.ProLayout\" Version=\"1.0.1\" />\n    <PackageReference Include=\"Polly\" Version=\"8.5.0\" />\n    <PackageReference Include=\"SqlSugarCore\" Version=\"5.1.4.171\" />\n    <PackageReference Include=\"Swashbuckle.AspNetCore\" Version=\"7.2.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\GraphRag.Net\\GraphRag.Net.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"graphPlugins\\graph\\community_search\\skprompt.txt\">\n      <PackagePath>graphPlugins\\</PackagePath>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Pack>true</Pack>\n    </None>\n    <None Update=\"graphPlugins\\graph\\community_summaries\\skprompt.txt\">\n      <PackagePath>graphPlugins\\</PackagePath>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Pack>true</Pack>\n    </None>\n    <None Update=\"graphPlugins\\graph\\create\\skprompt.txt\">\n      <PackagePath>graphPlugins\\</PackagePath>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Pack>true</Pack>\n    </None>\n    <None Update=\"graphPlugins\\graph\\global_summaries\\skprompt.txt\">\n      <PackagePath>graphPlugins\\</PackagePath>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Pack>true</Pack>\n    </None>\n    <None Update=\"graphPlugins\\graph\\mergedesc\\skprompt.txt\">\n      <PackagePath>graphPlugins\\</PackagePath>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Pack>true</Pack>\n    </None>\n    <None Update=\"graphPlugins\\graph\\relationship\\skprompt.txt\">\n      <PackagePath>graphPlugins\\</PackagePath>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Pack>true</Pack>\n    </None>\n    <None Update=\"graphPlugins\\graph\\search\\skprompt.txt\">\n      <PackagePath>graphPlugins\\</PackagePath>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <Pack>true</Pack>\n    </None>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/GraphRag.Net.Web/GraphRag.Net.Web.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>GraphRag.Net.Web</name>\n    </assembly>\n    <members>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.GetAllIndex\">\n            <summary>\n            获取所有的索引数据\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.GetAllGraphs(System.String)\">\n            <summary>\n            获取所有的图谱数据\n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.InsertGraphData(GraphRag.Net.Api.Controllers.InputModel)\">\n            <summary>\n            插入文本数据\n            </summary>\n            <param name=\"model\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.SearchGraph(GraphRag.Net.Api.Controllers.InputModel)\">\n            <summary>\n            搜索递归获取节点相关的所有边和节点进行图谱对话\n            </summary>\n            <param name=\"model\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.SearchGraphCommunity(GraphRag.Net.Api.Controllers.InputModel)\">\n            <summary>\n            通过社区算法检索社区节点进行对话\n            </summary>\n            <param name=\"model\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.ImportTxt(System.String,Microsoft.AspNetCore.Http.IFormFile)\">\n            <summary>\n            导入txt文档\n            </summary>\n            <param name=\"index\"></param>\n            <param name=\"file\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.GraphCommunities(System.String)\">\n            <summary>\n            通过社区检测生成社区和摘要\n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.GraphGlobal(System.String)\">\n            <summary>\n            通过社区摘要生成全局摘要\n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:GraphRag.Net.Api.Controllers.GraphController.DeleteGraph(System.String)\">\n            <summary>\n            删除图谱数据\n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Layouts/BasicLayout.razor",
    "content": "﻿@namespace GraphRag.Net.Web\n@inherits LayoutComponentBase\n\n<AntDesign.ProLayout.BasicLayout \n    Logo=\"@(\"https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg\")\"\n    MenuData=\"_menuData\">\n    <RightContentRender>\n        <GraphRag.Net.Web.Components.RightContent />\n    </RightContentRender>\n    <ChildContent>\n        @Body\n    </ChildContent>\n    <FooterRender>\n        <FooterView Copyright=\"2024 许泽宇的技术分享\" Links=\"Links\"></FooterView>\n    </FooterRender>\n</AntDesign.ProLayout.BasicLayout>\n<SettingDrawer />\n\n@code\n{\n    private MenuDataItem[] _menuData = { };\n\n    [Inject] public HttpClient HttpClient { get; set; }\n\n    protected override async Task OnInitializedAsync()\n    {\n        await base.OnInitializedAsync();\n        _menuData = await HttpClient.GetFromJsonAsync<MenuDataItem[]>(\"data/menu.json\");\n    }\n\n\n    public LinkItem[] Links { get; set; } =\n    {\n        new LinkItem\n        {\n            Key = \"GraphRag.Net\",\n            Title = \"GraphRag.Net\",\n            Href = \"https://github.com/xuzeyu91/GraphRag.Net\",\n            BlankTarget = true,\n        }\n    };\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Layouts/UserLayout.razor",
    "content": "﻿@namespace GraphRag.Net.Web\n@using OneOf\n@inherits LayoutComponentBase\n\n<div class=\"container__b__0\">\n    <div class=\"lang\">\n        <!--todo: selectLang-->\n    </div>\n    <div class=\"content\">\n        <div class=\"top\">\n            <div class=\"header\">\n                <a>\n                    <img alt=\"logo\" class=\"logo\" src=\"assets/logo.svg\" />\n                    <span class=\"title\">GraphRag.Net.Web</span>\n                </a>\n            </div>\n            <div class=\"desc\">GraphRag.Net.Web</div>\n        </div>\n        @Body\n    </div>\n    <FooterView Copyright=\"2024 许泽宇的技术分享\" Links=\"Links\"></FooterView>\n</div>\n\n@code\n{\n    public LinkItem[] Links { get; set; } =\n    {\n        new LinkItem\n        {\n            Key = \"GraphRag.Net\",\n            Title = \"GraphRag.Net\",\n            Href = \"https://github.com/xuzeyu91/GraphRag.Net\",\n            BlankTarget = true,\n        }\n    };\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Layouts/UserLayout.razor.css",
    "content": "/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\n.container__b__0 {\n  display: flex;\n  flex-direction: column;\n  height: 100vh;\n  overflow: auto;\n  background: #f0f2f5;\n}\n.container__b__0 .lang {\n  width: 100%;\n  height: 40px;\n  line-height: 44px;\n  text-align: right;\n}\n.container__b__0 .lang :global(.ant-dropdown-trigger) {\n  margin-right: 24px;\n}\n.container__b__0 .content {\n  flex: 1;\n  padding: 32px 0;\n}\n.container__b__0 .top {\n  text-align: center;\n}\n.container__b__0 .header {\n  height: 44px;\n  line-height: 44px;\n}\n.container__b__0 .header a {\n  text-decoration: none;\n}\n.container__b__0 .logo {\n  height: 44px;\n  margin-right: 16px;\n  vertical-align: top;\n}\n.container__b__0 .title {\n  position: relative;\n  top: 2px;\n  color: rgba(0, 0, 0, 0.85);\n  font-weight: 600;\n  font-size: 33px;\n  font-family: Avenir, 'Helvetica Neue', Arial, Helvetica, sans-serif;\n}\n.container__b__0 .desc {\n  margin-top: 12px;\n  margin-bottom: 40px;\n  color: rgba(0, 0, 0, 0.45);\n  font-size: 14px;\n}\n@media (min-width: 768px) {\n  .container__b__0 {\n    background-image: url('https://gw.alipayobjects.com/zos/rmsportal/TVYTbAXWheQpRcWDaDMu.svg');\n    background-repeat: no-repeat;\n    background-position: center 110px;\n    background-size: 100%;\n  }\n  .container__b__0 .content {\n    padding: 32px 0 24px;\n  }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Mock/MockChatCompletion.cs",
    "content": "﻿using Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.ChatCompletion;\nusing System.Runtime.CompilerServices;\nusing System.Text;\nusing System.Text.Encodings.Web;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Text.Unicode;\n\nnamespace GraphRag.Net.Web.Mock\n{\n    public class MockChatCompletion : IChatCompletionService\n    {\n        private readonly Dictionary<string, object?> _attributes = new();\n        private string _chatId;\n\n\n        private static readonly JsonSerializerOptions _jsonSerializerOptions = new()\n        {\n            NumberHandling = JsonNumberHandling.AllowReadingFromString,\n            Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)\n        };\n\n        public IReadOnlyDictionary<string, object?> Attributes => _attributes;\n\n        public MockChatCompletion()\n        {\n\n        }\n\n        public async Task<IReadOnlyList<ChatMessageContent>> GetChatMessageContentsAsync(ChatHistory chatHistory, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)\n        {\n            StringBuilder sb = new();\n            string result = $\"这是一条Mock数据，便于聊天测试，你的消息是：{chatHistory.LastOrDefault().ToString()}\";\n            return [new(AuthorRole.Assistant, result.ToString())];\n        }\n\n        public async IAsyncEnumerable<StreamingChatMessageContent> GetStreamingChatMessageContentsAsync(ChatHistory chatHistory, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, [EnumeratorCancellation] CancellationToken cancellationToken = default)\n        {\n            StringBuilder sb = new();\n            string result = $\"这是一条Mock数据，便于聊天测试，你的消息是：{chatHistory.LastOrDefault().ToString()}\";\n            foreach (var c in result)\n            {\n                yield return new StreamingChatMessageContent(AuthorRole.Assistant, c.ToString());\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Mock/MockTextCompletion.cs",
    "content": "﻿using Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.Services;\nusing Microsoft.SemanticKernel.TextGeneration;\nusing System.Text;\nusing System.Text.Encodings.Web;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\nusing System.Text.Unicode;\n\nnamespace GraphRag.Net.Web.Mock\n{\n    public class MockTextCompletion : ITextGenerationService, IAIService\n    {\n        private readonly Dictionary<string, object?> _attributes = new();\n        private string _chatId;\n\n        private static readonly JsonSerializerOptions _jsonSerializerOptions = new()\n        {\n            NumberHandling = JsonNumberHandling.AllowReadingFromString,\n            Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)\n        };\n\n        public IReadOnlyDictionary<string, object?> Attributes => _attributes;\n\n        public MockTextCompletion()\n        {\n\n        }\n\n        public async Task<IReadOnlyList<TextContent>> GetTextContentsAsync(string prompt, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default)\n        {\n            StringBuilder sb = new();\n            string result = $\"这是一条Mock数据，便于聊天测试，你的消息是：{prompt}\";\n            return [new(result.ToString())];\n        }\n\n        public async IAsyncEnumerable<StreamingTextContent> GetStreamingTextContentsAsync(string prompt, PromptExecutionSettings? executionSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default)\n        {\n            StringBuilder sb = new();\n            string result = $\"这是一条Mock数据，便于聊天测试，你的消息是：{prompt}\";\n            foreach (var c in result)\n            {\n                var streamingTextContent = new StreamingTextContent(c.ToString(), modelId: \"mock\");\n\n                yield return streamingTextContent;\n            }\n        }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Mock/MockTextEmbeddingGeneratorService.cs",
    "content": "﻿using Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.Embeddings;\nusing Microsoft.SemanticKernel.Services;\n\nnamespace GraphRag.Net.Web.Mock\n{\n    public sealed class MockTextEmbeddingGeneratorService : ITextEmbeddingGenerationService\n    {\n        private Dictionary<string, object?> AttributesInternal { get; } = [];\n        public IReadOnlyDictionary<string, object?> Attributes => this.AttributesInternal;\n        public MockTextEmbeddingGeneratorService()\n        {\n\n        }\n        public async Task<IList<ReadOnlyMemory<float>>> GenerateEmbeddingsAsync(\n          IList<string> data,\n          Kernel? kernel = null,\n          CancellationToken cancellationToken = default)\n        {\n            IList<ReadOnlyMemory<float>> results = new List<ReadOnlyMemory<float>>();\n\n            float[] array1 = { 1.0f, 2.0f, 3.0f };\n            float[] array2 = { 4.0f, 5.0f, 6.0f };\n            float[] array3 = { 7.0f, 8.0f, 9.0f };\n\n            // 将数组包装为ReadOnlyMemory<float>并添加到列表中\n            results.Add(new ReadOnlyMemory<float>(array1));\n            results.Add(new ReadOnlyMemory<float>(array2));\n            results.Add(new ReadOnlyMemory<float>(array3));\n\n            return results;\n        }\n\n        public void Dispose()\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ActivitiesType.cs",
    "content": "namespace GraphRag.Net.Web.Models\n{\n    public class ActivitiesType\n    {\n        public string Id { get; set; }\n        public DateTime UpdatedAt { get; set; }\n        public ActivityUser User { get; set; }\n        public ActivityGroup Group { get; set; }\n        public ActivityProject Project { get; set; }\n        public string Template { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ActivityGroup.cs",
    "content": "namespace GraphRag.Net.Web.Models\n{\n    public class ActivityGroup\n    {\n        public string Name { get; set; }\n        public string Link { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ActivityProject.cs",
    "content": "namespace GraphRag.Net.Web.Models\n{\n    public class ActivityProject\n    {\n        public string Name { get; set; }\n        public string Link { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ActivityUser.cs",
    "content": "namespace GraphRag.Net.Web.Models\n{\n    public class ActivityUser\n    {\n        public string Name { get; set; }\n        public string Avatar { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/AdvancedOperation.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class AdvancedOperation\n    {\n        public string Key { get; set; }\n        public string Type { get; set; }\n        public string Name { get; set; }\n        public string Status { get; set; }\n        public string UpdatedAt { get; set; }\n        public string Memo { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/AdvancedProfileData.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class AdvancedProfileData\n    {\n        public AdvancedOperation[] AdvancedOperation1 { get; set; }\n        public AdvancedOperation[] AdvancedOperation2 { get; set; }\n        public AdvancedOperation[] AdvancedOperation3 { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/BasicGood.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class BasicGood\n    {\n        public string Id { get; set; }\n        public string Name { get; set; }\n        public string Barcode { get; set; }\n        public string Price { get; set; }\n        public string Num { get; set; }\n        public string Amount { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/BasicProfileDataType.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class BasicProfileDataType\n    {\n        public BasicGood[] BasicGoods { get; set; }\n        public BasicProgress[] BasicProgress { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/BasicProgress.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class BasicProgress\n    {\n        public string Key { get; set; }\n        public string Time { get; set; }\n        public string Rate { get; set; }\n        public string Status { get; set; }\n        public string Operator { get; set; }\n        public string Cost { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ChartData.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class ChartData\n    {\n        public ChartDataItem[] VisitData { get; set; }\n        public ChartDataItem[] VisitData2 { get; set; }\n        public ChartDataItem[] SalesData { get; set; }\n        public SearchDataItem[] SearchData { get; set; }\n        public OfflineDataItem[] OfflineData { get; set; }\n        public OfflineChartDataItem[] OfflineChartData { get; set; }\n        public ChartDataItem[] SalesTypeData { get; set; }\n        public ChartDataItem[] SalesTypeDataOnline { get; set; }\n        public ChartDataItem[] SalesTypeDataOffline { get; set; }\n        public RadarDataItem[] RadarData { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ChartDataItem.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class ChartDataItem\n    {\n        public string X { get; set; }\n        public int Y { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ChatMessage.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class ChatMessage\n    {\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/CurrentUser.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class TagType\n    {\n        public string Key { get; set; }\n        public string Label { get; set; }\n    }\n\n    public class GeographicType\n    {\n        public TagType Province { get; set; }\n        public TagType City { get; set; }\n    }\n\n    public class CurrentUser\n    {\n        public string Name { get; set; }\n        public string Avatar { get; set; }\n        public string Userid { get; set; }\n        public NoticeType[] Notice { get; set; } = { };\n        public string Email { get; set; }\n        public string Signature { get; set; }\n        public string Title { get; set; }\n        public string Group { get; set; }\n        public TagType[] Tags { get; set; } = { };\n        public int NotifyCount { get; set; }\n        public int UnreadCount { get; set; }\n        public string Country { get; set; }\n        public GeographicType Geographic { get; set; }\n        public string Address { get; set; }\n        public string Phone { get; set; }\n    }\n\n    public class UserLiteItem\n    {\n        public string Avater { get; set; }\n        public string Title { get; set; }\n        public string Description { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/FormItemLayout.cs",
    "content": "﻿using AntDesign;\n\nnamespace GraphRag.Net.Web.Models\n{\n    public class FormItemLayout\n    {\n        public ColLayoutParam LabelCol { get; set; }\n        public ColLayoutParam WrapperCol { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/FormModel.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class StepFormModel\n    {\n        public string ReceiverAccountType { get; set; } = \"ant-design@alipay.com\";\n        public string ReceiverAccount { get; set; } = \"test@example.com\";\n        public string ReceiverName { get; set; } = \"Alex\";\n        public string PayAccount { get; set; }\n        public string Password { get; set; } = \"500\";\n        public string Amount { get; set; } = \"12345678\";\n    }\n\n    public class AdvancedFormModel\n    {\n        public string Name { get; set; }\n        public string Url { get; set; }\n        public string Owner { get; set; }\n        public string Approver { get; set; }\n        public DateTime?[] DateRange { get; set; }\n        public string Type { get; set; }\n        public string Name2 { get; set; }\n        public string Url2 { get; set; }\n        public string Owner2 { get; set; }\n        public string Approver2 { get; set; }\n        public DateTime? DateRange2 { get; set; }\n        public string Type2 { get; set; }\n    }\n\n    public class BasicFormModel\n    {\n        public string Title { get; set; }\n        public string Client { get; set; }\n        public string Invites { get; set; }\n        public int Disclosure { get; set; }\n        public int Weight { get; set; }\n        public string Standard { get; set; }\n        public string Goal { get; set; }\n        public DateTime?[] DateRange { get; set; }\n    }\n\n    public class Owner\n    {\n        public string Id { get; set; }\n        public string Name { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/LayoutModel.cs",
    "content": "﻿using AntDesign;\n\nnamespace GraphRag.Net.Web.Models\n{\n    public class LayoutModel\n    {\n        public static FormItemLayout _formItemLayout = new FormItemLayout\n        {\n            LabelCol = new ColLayoutParam\n            {\n                Xs = new EmbeddedProperty { Span = 24 },\n                Sm = new EmbeddedProperty { Span = 7 },\n            },\n\n            WrapperCol = new ColLayoutParam\n            {\n                Xs = new EmbeddedProperty { Span = 24 },\n                Sm = new EmbeddedProperty { Span = 12 },\n                Md = new EmbeddedProperty { Span = 10 },\n            }\n        };\n\n        public static FormItemLayout _submitFormLayout = new FormItemLayout\n        {\n            WrapperCol = new ColLayoutParam\n            {\n                Xs = new EmbeddedProperty { Span = 24, Offset = 0 },\n                Sm = new EmbeddedProperty { Span = 10, Offset = 7 },\n            }\n        };\n\n        public static ListGridType _listGridType = new ListGridType\n        {\n            Gutter = 16,\n            Xs = 1,\n            Sm = 2,\n            Md = 3,\n            Lg = 3,\n            Xl = 4,\n            Xxl = 4\n        };\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ListFormModel.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class ListFormModel\n    {\n        public string Owner { get; set; } = \"wzj\";\n\n        public string ActiveUser { get; set; }\n\n        public string Satisfaction { get; set; }\n    }\n\n    public class BasicListFormModel\n    {\n        public string Status { get; set; } = \"all\";\n        public string SearchKeyword { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/ListItemDataType.cs",
    "content": "using GraphRag.Net.Web.Utils;\nusing System.Text.Json.Serialization;\n\nnamespace GraphRag.Net.Web.Models\n{\n    public class Member\n    {\n        public string Avatar { get; set; }\n        public string Name { get; set; }\n        public string Id { get; set; }\n    }\n\n    public class ListItemDataType\n    {\n        public string Id { get; set; }\n        public string Owner { get; set; }\n        public string Title { get; set; }\n        public string Avatar { get; set; }\n        public string Cover { get; set; }\n        public string Status { get; set; }\n        public int Percent { get; set; }\n        public string Logo { get; set; }\n        public string Href { get; set; }\n        public string Body { get; set; }\n        public string SubDescription { get; set; }\n        public string Description { get; set; }\n        public int ActiveUser { get; set; }\n        public int NewUser { get; set; }\n        public int Star { get; set; }\n        public int Like { get; set; }\n        public int Message { get; set; }\n        public string Content { get; set; }\n        public Member[] Members { get; set; }\n\n        [JsonConverter(typeof(LongToDateTimeConverter))]\n        public DateTime UpdatedAt { get; set; }\n\n        [JsonConverter(typeof(LongToDateTimeConverter))]\n        public DateTime CreatedAt { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/LoginParamsType.cs",
    "content": "﻿using System.ComponentModel.DataAnnotations;\n\nnamespace GraphRag.Net.Web.Models\n{\n    public class LoginParamsType\n    {\n        [Required] public string UserName { get; set; }\n\n        [Required] public string Password { get; set; }\n\n        public string Mobile { get; set; }\n\n        public string Captcha { get; set; }\n\n        public string LoginType { get; set; }\n\n        public bool AutoLogin { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/NoticeItem.cs",
    "content": "﻿using AntDesign.ProLayout;\n\nnamespace GraphRag.Net.Web.Models\n{\n    public class NoticeItem : NoticeIconData\n    {\n        public string Id { get; set; }\n        public string Type { get; set; }\n        public string Status { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/NoticeType.cs",
    "content": "namespace GraphRag.Net.Web.Models\n{\n    public class NoticeType\n    {\n        public string Id { get; set; }\n        public string Title { get; set; }\n        public string Logo { get; set; }\n        public string Description { get; set; }\n        public string UpdatedAt { get; set; }\n        public string Member { get; set; }\n        public string Href { get; set; }\n        public string MemberLink { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/OfflineChartDataItem.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class OfflineChartDataItem\n    {\n        public long X { get; set; }\n        public int Y1 { get; set; }\n        public int Y2 { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/OfflineDataItem.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class OfflineDataItem\n    {\n        public string Name { get; set; }\n        public float Cvr { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/RadarDataItem.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class RadarDataItem\n    {\n        public string Name { get; set; }\n        public string Label { get; set; }\n        public int Value { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Models/SearchDataItem.cs",
    "content": "﻿namespace GraphRag.Net.Web.Models\n{\n    public class SearchDataItem\n    {\n        public int Index { get; set; }\n        public string Keywod { get; set; }\n        public int Count { get; set; }\n        public int Range { get; set; }\n        public int Status { get; set; }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Pages/Graph/Chat.razor",
    "content": "﻿@namespace GraphRag.Net.Web.Pages.Graph\n@page \"/Chat\"\n@using GraphRag.Net.Domain.Interface\n\n<style>\n    .chat-page {\n        padding: 24px;\n        background: #f5f5f5;\n        min-height: 100vh;\n    }\n    \n    .section-card {\n        border-radius: 12px;\n        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n        transition: all 0.3s ease;\n        border: 1px solid #e8e8e8;\n    }\n    \n    .section-card:hover {\n        box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\n        transform: translateY(-2px);\n    }\n    \n    .form-group {\n        margin-bottom: 20px;\n    }\n    \n    .form-label {\n        display: block;\n        margin-bottom: 8px;\n        font-weight: 600;\n        font-size: 14px;\n        color: #262626;\n    }\n    \n    .action-buttons {\n        display: flex;\n        gap: 12px;\n        margin-top: 20px;\n    }\n    \n    .primary-button {\n        background: linear-gradient(135deg, #1890ff 0%, #096dd9 100%);\n        border: none;\n        border-radius: 8px;\n        font-weight: 500;\n        transition: all 0.3s ease;\n    }\n    \n    .primary-button:hover {\n        background: linear-gradient(135deg, #40a9ff 0%, #1890ff 100%);\n        transform: translateY(-1px);\n        box-shadow: 0 4px 12px rgba(24, 144, 255, 0.3);\n    }\n    \n    .secondary-button {\n        background: #f6f6f6;\n        border: 1px solid #d9d9d9;\n        border-radius: 8px;\n        color: #595959;\n        font-weight: 500;\n        transition: all 0.3s ease;\n    }\n    \n    .secondary-button:hover {\n        background: #fff;\n        border-color: #40a9ff;\n        color: #1890ff;\n        transform: translateY(-1px);\n    }\n    \n    .result-area {\n        background: #fafafa;\n        border: 1px solid #e8e8e8;\n        border-radius: 8px;\n        padding: 16px;\n    }\n    \n    .upload-area {\n        border: 2px dashed #d9d9d9;\n        border-radius: 12px;\n        padding: 24px;\n        text-align: center;\n        background: #fafafa;\n        transition: all 0.3s ease;\n    }\n    \n    .upload-area:hover {\n        border-color: #40a9ff;\n        background: #f0f8ff;\n    }\n    \n    .card-title {\n        font-size: 18px;\n        font-weight: 600;\n        color: #262626;\n        margin-bottom: 0;\n    }\n    \n    .external-link {\n        margin-top: 16px;\n        padding: 8px 0;\n        border-top: 1px solid #f0f0f0;\n        text-align: center;\n    }\n    \n    .page-header {\n        text-align: center;\n        margin-bottom: 32px;\n        padding: 20px 0;\n        background: linear-gradient(135deg, #1890ff 0%, #096dd9 100%);\n        border-radius: 12px;\n        color: white;\n    }\n    \n    .page-title {\n        font-size: 28px;\n        font-weight: 700;\n        margin: 0;\n        text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n    }\n    \n    .page-subtitle {\n        font-size: 16px;\n        margin: 8px 0 0 0;\n        opacity: 0.9;\n    }\n</style>\n\n<div class=\"chat-page\">\n    <div class=\"page-header\">\n        <p class=\"page-title\">🔍 GraphRAG 智能问答系统</p>\n        <p class=\"page-subtitle\">基于知识图谱的智能搜索与文档导入平台</p>\n    </div>\n    \n    <Row Gutter=\"(24, 24)\">\n        <Col Xl=\"8\" Lg=\"8\" Md=\"24\" Sm=\"24\" Xs=\"24\">\n            <Card Class=\"section-card\" \n                  Style=\"height: 100%;\">\n                <TitleTemplate>\n                    <span class=\"card-title\">🔍 搜索图谱内容</span>\n                </TitleTemplate>\n                <ChildContent>\n                <Spin Spinning=@loadding>\n                    <div class=\"form-group\">\n                        <label class=\"form-label\">\n                            <Icon Type=\"database\" /> 选择索引\n                        </label>\n                        <Select TItem=\"string\"\n                                TItemValue=\"string\"\n                                ValueProperty=\"c=>c\"\n                                LabelProperty=\"c=>c\"\n                                DataSource=\"@_indexList\"\n                                @bind-Value=\"@_index\"\n                                Placeholder=\"请选择要搜索的索引\"\n                                Size=\"@AntSizeLDSType.Large\"\n                                Style=\"width: 100%;\"\n                                OnSelectedItemChanged=\"OnSelectedItemChangedHandler\">\n                        </Select>\n                    </div>\n                    \n                    <div class=\"form-group\">\n                        <label class=\"form-label\">\n                            <Icon Type=\"message\" /> 提出问题\n                        </label>\n                        <Input @bind-Value=\"_input\" \n                               Placeholder=\"请输入您想要了解的问题...\" \n                               Size=\"@AntSizeLDSType.Large\"\n                               AllowClear />\n                    </div>\n                    \n                    <div class=\"form-group\">\n                        <label class=\"form-label\">\n                            <Icon Type=\"bulb\" /> 智能回答\n                        </label>\n                        <div class=\"result-area\">\n                            <TextArea @bind-Value=\"_output\" \n                                      MinRows=\"8\" \n                                      MaxRows=\"12\" \n                                      Placeholder=\"AI 回答将在这里显示...\" \n                                      Style=\"background: transparent; border: none; resize: none;\" />\n                        </div>\n                    </div>\n                    \n                    <div class=\"action-buttons\">\n                        <Button Type=\"@ButtonType.Primary\" \n                                OnClick=\"Search\" \n                                Size=\"@AntSizeLDSType.Large\"\n                                Class=\"primary-button\"\n                                Style=\"flex: 1;\">\n                            <Icon Type=\"search\" /> 节点搜索\n                        </Button>\n                        <Button Type=\"@ButtonType.Primary\" \n                                OnClick=\"Search1\" \n                                Size=\"@AntSizeLDSType.Large\"\n                                Class=\"primary-button\"\n                                Style=\"flex: 1;\">\n                            <Icon Type=\"cluster\" /> 社区搜索\n                        </Button>\n                    </div>\n                    \n                    <Divider Style=\"margin: 20px 0;\" />\n                    \n                    <a href=\"/graph?index=@_index\" target=\"_blank\" style=\"text-decoration: none;\">\n                        <Button Type=\"@ButtonType.Default\" \n                                Size=\"@AntSizeLDSType.Large\"\n                                Class=\"secondary-button\"\n                                Block>\n                            <Icon Type=\"eye\" /> 查看完整知识图谱\n                        </Button>\n                    </a>\n                </Spin>\n                </ChildContent>\n            </Card>\n        </Col>\n        \n        <Col Xl=\"8\" Lg=\"8\" Md=\"24\" Sm=\"24\" Xs=\"24\">\n            <Card Class=\"section-card\" \n                  Style=\"height: 100%;\">\n                <TitleTemplate>\n                    <span class=\"card-title\">📝 导入文本数据</span>\n                </TitleTemplate>\n                <ChildContent>\n                <div class=\"form-group\">\n                    <label class=\"form-label\">\n                        <Icon Type=\"tag\" /> 索引名称\n                    </label>\n                    <Input @bind-Value=\"_importIndex\" \n                           Placeholder=\"为您的数据设置一个便于识别的索引名称...\" \n                           Size=\"@AntSizeLDSType.Large\"\n                           AllowClear />\n                </div>\n                \n                <div class=\"form-group\">\n                    <label class=\"form-label\">\n                        <Icon Type=\"file-text\" /> 文本内容\n                    </label>\n                    <TextArea @bind-Value=\"_importText\" \n                              MinRows=\"12\" \n                              MaxRows=\"16\" \n                              Placeholder=\"在此输入要导入的文本内容，支持长文本和多段落...\" \n                              Style=\"width: 100%; border-radius: 8px;\" />\n                </div>\n                \n                <Button Type=\"@ButtonType.Primary\" \n                        OnClick=\"InputText\" \n                        Size=\"@AntSizeLDSType.Large\"\n                        Class=\"primary-button\"\n                        Block>\n                    <Icon Type=\"import\" /> 立即导入文本数据\n                </Button>\n                </ChildContent>\n            </Card>\n        </Col>\n\n        <Col Xl=\"8\" Lg=\"8\" Md=\"24\" Sm=\"24\" Xs=\"24\">\n            <Card Class=\"section-card\" \n                  Style=\"height: 100%;\">\n                <TitleTemplate>\n                    <span class=\"card-title\">📁 导入 TXT 文件</span>\n                </TitleTemplate>\n                <ChildContent>\n                <div class=\"form-group\">\n                    <label class=\"form-label\">\n                        <Icon Type=\"tag\" /> 索引名称\n                    </label>\n                    <Input @bind-Value=\"_importIndex\" \n                           Placeholder=\"为您的文件设置一个便于识别的索引名称...\" \n                           Size=\"@AntSizeLDSType.Large\"\n                           AllowClear />\n                </div>\n                \n                <div style=\"margin-top: 24px;\">\n                    <div class=\"upload-area\">\n                        <Upload Action=\"@(\"api/Graph/ImportTxt?index=\"+_importIndex)\"\n                                Name=\"file\"\n                                Accept=\"text/plain\"\n                                BeforeUpload=\"BeforeUpload\"\n                                OnSingleCompleted=\"OnSingleCompleted\"\n                                Style=\"width: 100%;\"\n                                Drag>\n                            <p style=\"margin-bottom: 16px;\">\n                                <Icon Type=\"cloud-upload\" Style=\"font-size: 48px; color: #40a9ff;\" />\n                            </p>\n                            <p style=\"font-size: 18px; font-weight: 500; margin-bottom: 8px; color: #262626;\">\n                                点击选择文件或拖拽到此处\n                            </p>\n                            <p style=\"color: #8c8c8c; margin: 0; font-size: 14px;\">\n                                支持 .txt 格式文件，可单个或批量上传\n                            </p>\n                        </Upload>\n                    </div>\n                </div>\n                \n                <div class=\"external-link\">\n                    <a href=\"https://antsk.cn\" target=\"_blank\" style=\"color: #1890ff; text-decoration: none; display: block; margin-bottom: 8px;\">\n                        <Icon Type=\"link\" /> 了解更多文件导入类型 - AntSK 项目\n                    </a>\n                    <a href=\"https://fileext.antsk.cn\" target=\"_blank\" style=\"color: #52c41a; text-decoration: none;\">\n                        <Icon Type=\"file-text\" /> 强大的文档解析API - 支持多格式转换\n                    </a>\n                </div>\n                </ChildContent>\n            </Card>\n        </Col>\n    </Row>\n</div>\n@code {\n\n  \n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Pages/Graph/Chat.razor.cs",
    "content": "﻿using AntDesign;\nusing GraphRag.Net.Domain.Interface;\nusing Microsoft.AspNetCore.Components;\n\nnamespace GraphRag.Net.Web.Pages.Graph\n{\n    public partial class Chat\n    {\n        [Inject] IGraphService _graphService { get; set; }\n        [Inject] IMessageService _message { get; set; }\n        private List<UploadFileItem> _fileList = [];\n        private List<string> _indexList { get; set; }\n        private bool loadding = false;\n        private string _index;\n        private string _input;\n        private string _output;\n\n        private string _importIndex;\n        private string _importText;\n\n        protected override async Task OnInitializedAsync()\n        {\n            await base.OnInitializedAsync();\n            _indexList = _graphService.GetAllIndex();\n        }\n\n        private async Task Search()\n        {\n            Console.Write(\"111\");\n            loadding = true;\n            _output = await _graphService.SearchGraphAsync(_index, _input);\n            loadding = false;\n        }\n\n        private async Task Search1()\n        {\n            loadding = true;\n            _output = await _graphService.SearchGraphCommunityAsync(_index, _input);\n            loadding = false;\n        }\n\n\n        private void OnSelectedItemChangedHandler(string value)\n        {\n            _index = value;\n        }\n\n\n        private bool BeforeUpload(UploadFileItem file)\n        {\n            if (string.IsNullOrEmpty(_importIndex))\n            {\n                _message.Error(\"请先填写index\");\n                return false;\n            }\n            if (file.Type != \"text/plain\")\n            {\n                _message.Error(\"文件格式错误,请重新选择!\");\n                return false;\n            }\n            var IsLt500K = file.Size < 1024 * 1024 * 100;\n            if (!IsLt500K)\n            {\n                _message.Error(\"文件需不大于100MB!\");\n                return false;\n            }\n\n            return true;\n        }\n\n        private void OnSingleCompleted(UploadInfo fileinfo)\n        {\n            _indexList = _graphService.GetAllIndex();\n            _message.Info(\"导入完成\");\n        }\n\n        private async Task InputText()\n        {\n            if (string.IsNullOrEmpty(_importIndex))\n            { \n                _message.Error(\"请先填写index\");\n            }\n            await _graphService.InsertGraphDataAsync(_importIndex, _importText);\n\n            //生成社区和全局摘要\n            await _graphService.GraphCommunitiesAsync(_importIndex);\n            await _graphService.GraphGlobalAsync(_importIndex);\n\n            _indexList = _graphService.GetAllIndex();\n            _message.Info(\"导入完成\");\n        }\n    }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Pages/Graph/Graph.razor",
    "content": "﻿@namespace GraphRag.Net.Web.Pages.Demo\n@page \"/Graph\"\n\n<div id=\"graph\">\n    <div style=\"height:calc(100vh - 30px);width:100%;border:#eeeeee solid 1px;\">\n        <relation-graph ref=\"seeksRelationGraph\"\n                        :options=\"graphOptions\"\n                        :on-node-click=\"onNodeClick\" />\n    </div>\n</div>\n<Modal Title=\"@nodeTitle\" Visible=\"@isModalVisible\" OnOk=\"HandleOk\" OnCancel=\"HandleCancel\">\n    @nodeDescription\n</Modal>\n<!-- 引入relation-graph -->\n<script src=\"./js/vue2.js\"></script>\n<script src=\"./js/screenfull.min.js\"></script>\n<script src=\"./js/html2canvas.min.js\"></script>\n<script src=\"./js/relation-graph.umd.js\"></script>\n\n<script>\n    // window.onload = function () {\n    //      // 等待 Blazor 初始化完成\n    //    Blazor.start().then(function () {\n    //       initializeVueApp(dotNetHelper);\n    //    });\n    // };\n    function initializeVueApp(dotNetHelper) {\n        let graph = new Vue({\n            el: '#graph',\n            data: {\n                message: 'Hello Vue!',\n                graphOptions: {\n                    defaultJunctionPoint: 'border'\n                    // 这里可以参考\"Graph 图谱\"中的参数进行设置\n                }\n            },\n            mounted() {\n                this.showRelationGraph();\n            },\n            methods: {\n                showRelationGraph() {\n\n                    console.log('ref:btn:', this.$refs.btn);\n                    console.log('ref:', this.$refs.seeksRelationGraph);\n                    const url = new URL(window.location.href);\n\n                    // 获取查询字符串部分\n                    const queryString = url.search;\n\n                    // 解析查询字符串为一个 URLSearchParams 对象\n                    const urlParams = new URLSearchParams(queryString);\n\n                    // 获取参数的值，例如 'index'\n                    const index = urlParams.get('index');\n                    fetch('/api/Graph/GetAllGraphs?index=' + index)\n                        .then(response => {\n                            if (!response.ok) {\n                                throw new Error('网络响应不成功，状态码：' + response.status);\n                            }\n                            return response.json(); // 或者 response.json() 取决于你的响应内容类型\n                        })\n                        .then(data => {\n                            // 请求成功，处理响应数据\n                            console.log(data);\n                            this.$refs.seeksRelationGraph.setJsonData(data, (seeksRGGraph) => {\n                                // 这些写上当图谱初始化完成后需要执行的代码\n                            });\n                        })\n                        .catch(error => {\n                            // 处理错误\n                            console.error('请求出错：', error);\n                        });\n                },\n                onNodeClick(nodeObject, $event) {\n                     dotNetHelper.invokeMethodAsync('ShowNodeDescription',nodeObject.text, nodeObject.data.desc);\n                }\n            }\n        })\n    }\n</script>\n\n@code\n{\n    [Inject]\n    protected IJSRuntime _jsRuntime { get; set; }\n\n    private bool isModalVisible = false;\n    private string nodeDescription = string.Empty;\n    private string nodeTitle = string.Empty;\n\n    private DotNetObjectReference<Graph> objRef;\n\n    [JSInvokable(\"ShowNodeDescription\")]\n    public void ShowNodeDescription(string title, string description)\n    {\n        nodeTitle = title;\n        nodeDescription = description;\n        isModalVisible = true;\n        StateHasChanged();\n    }\n\n    private void HandleOk()\n    {\n        isModalVisible = false;\n    }\n\n    private void HandleCancel()\n    {\n        isModalVisible = false;\n    }\n\n    protected override async Task OnAfterRenderAsync(bool firstRender)\n    {\n        if (firstRender)\n        {\n            // 确保所有脚本加载完成后，调用初始化 Vue 的 JavaScript 函数\n            await Task.Delay(500); // 短暂延时\n            objRef = DotNetObjectReference.Create(this);\n            try\n            {\n                await _jsRuntime.InvokeVoidAsync(\"initializeVueApp\", objRef);\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine(ex.Message);\n            }\n        }\n    }\n\n    public void Dispose()\n    {\n        objRef?.Dispose();\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/Pages/Index.razor",
    "content": "﻿@namespace GraphRag.Net.Web.Pages\n@page \"/\"\n\n<h3>GraphRag.Net是一个可以快速导入文本、文档创建GraphRag示例进行测试体验的平台</h3>\n<h3>您也可以单独引用 GraphRag.Net到您的项目中来使用 </h3>\n<h3></h3>\n@code {\n\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Pages/_Host.cshtml",
    "content": "﻿@page \"/\"\n@namespace GraphRag.Net.Web.Pages\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n@{\n    Layout = null;\n}\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>GraphRag.Net.Web</title>\n    <base href=\"~/\" />\n    <link href=\"_content/AntDesign/css/ant-design-blazor.css\" rel=\"stylesheet\" />\n    <link href=\"_content/AntDesign.ProLayout/css/ant-design-pro-layout-blazor.css\" rel=\"stylesheet\" />\n    <link href=\"./css/site.css\" rel=\"stylesheet\" />\n    <link href=\"GraphRag.Net.Web.styles.css\" rel=\"stylesheet\" />\n</head>\n<body>\n    <app>\n        <component type=\"typeof(App)\" render-mode=\"Server\" />\n    </app>\n\n     <script type=\"text/javascript\" src=\"@(\"https://unpkg.com/@antv/g2plot@2.4.17/dist/g2plot.min.js\")\"></script>\n    <script src=\"_content/AntDesign/js/ant-design-blazor.js\"></script>\n    <script src=\"_content/AntDesign.Charts/ant-design-charts-blazor.js\"></script>\n    <script src=\"_framework/blazor.server.js\"></script>\n\n    <!-- 引入relation-graph -->\n    <script src=\"./js/vue2.js\"></script> \n    <script src=\"./js/screenfull.min.js\"></script>\n    <script src=\"./js/html2canvas.min.js\"></script>\n    <script src=\"./js/relation-graph.umd.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Program.cs",
    "content": "using AntDesign.ProLayout;\nusing GraphRag.Net;\nusing GraphRag.Net.Options;\nusing GraphRag.Net.Web.Mock;\nusing Microsoft.AspNetCore.Components;\nusing Microsoft.Extensions.Options;\nusing Microsoft.SemanticKernel;\nusing Microsoft.SemanticKernel.ChatCompletion;\nusing Microsoft.SemanticKernel.Embeddings;\nusing Microsoft.SemanticKernel.TextGeneration;\nusing System.Reflection;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// Add services to the container.\nbuilder.Services.AddRazorPages();\nbuilder.Services.AddServerSideBlazor();\nbuilder.Services.AddAntDesign();\nbuilder.Services.AddScoped(sp => new HttpClient\n{\n    BaseAddress = new Uri(sp.GetService<NavigationManager>()!.BaseUri)\n});\nbuilder.Services.Configure<ProSettings>(builder.Configuration.GetSection(\"ProSettings\"));\n\nbuilder.Services.AddControllers();\n// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle\nbuilder.Services.AddEndpointsApiExplorer();\nbuilder.Services.AddSwaggerGen(c => {\n    c.SwaggerDoc(\"v1\", new() { Title = \"GraphRag.Net.Api\", Version = \"v1\" });\n    //添加Api层注释（true表示显示控制器注释）\n    var xmlFile = $\"{Assembly.GetExecutingAssembly().GetName().Name}.xml\";\n    var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);\n    c.IncludeXmlComments(xmlPath, true);\n});\n\nbuilder.Configuration.GetSection(\"GraphOpenAI\").Get<GraphOpenAIOption>();\nbuilder.Configuration.GetSection(\"TextChunker\").Get<TextChunkerOption>();\nbuilder.Configuration.GetSection(\"GraphSearch\").Get<GraphSearchOption>();\n//builder.Configuration.GetSection(\"GraphDBConnection\").Get<GraphDBConnectionOption>();\n\n//这里可以自定义Kernel,如果不传则使用默认Kernel\nbuilder.Services.AddGraphRagNet();\n\n////自定义Kernel 可以实现其他模型的对接实现\n//var kernelBuild = Kernel.CreateBuilder();\n//kernelBuild.Services.AddKeyedSingleton<ITextGenerationService>(\"mock-text\", new MockTextCompletion());\n//kernelBuild.Services.AddKeyedSingleton<IChatCompletionService>(\"mock-chat\", new MockChatCompletion());\n//kernelBuild.Services.AddSingleton((ITextEmbeddingGenerationService)new MockTextEmbeddingGeneratorService());\n//kernelBuild.Services.AddKeyedSingleton(\"mock-embedding\", new MockTextEmbeddingGeneratorService());\n\n//builder.Services.AddGraphRagNet(kernelBuild.Build());\n\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment())\n{\n    app.UseSwagger();\n    app.UseSwaggerUI();\n}\nelse\n{\n    app.UseExceptionHandler(\"/Error\");\n    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.\n    app.UseHsts();\n}\n\napp.UseStaticFiles();\n\napp.UseRouting();\n\napp.MapBlazorHub();\napp.MapFallbackToPage(\"/_Host\");\n\napp.UseAuthorization();\n\napp.MapControllers();\n\napp.Run();\n"
  },
  {
    "path": "src/GraphRag.Net.Web/Utils/LongToDateTimeConverter.cs",
    "content": "﻿using System.Buffers.Text;\nusing System.Text.Json;\nusing System.Text.Json.Serialization;\n\nnamespace GraphRag.Net.Web.Utils\n{\n    public class LongToDateTimeConverter : JsonConverter<DateTime>\n    {\n        public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)\n        {\n            if (Utf8Parser.TryParse(reader.ValueSpan, out long value, out _))\n                return DateTime.UnixEpoch.AddMilliseconds(value);\n\n            throw new FormatException();\n        }\n\n        public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)\n        {\n            writer.WriteStringValue(\n                JsonEncodedText.Encode(((long)(value - DateTime.UnixEpoch).TotalMilliseconds).ToString()));\n        }\n    }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/_Imports.razor",
    "content": "﻿@using AntDesign\n@using AntDesign.Charts\n@using AntDesign.ProLayout\n@using System.Net.Http\n@using System.Net.Http.Json\n@using Microsoft.AspNetCore.Components.Forms\n@using Microsoft.AspNetCore.Components.Routing\n@using Microsoft.AspNetCore.Components.Web\n@using Microsoft.JSInterop\n@using GraphRag.Net.Web\n@using GraphRag.Net.Web.Models\n"
  },
  {
    "path": "src/GraphRag.Net.Web/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\",\n  \"urls\": \"http://*:5000\",\n  \"ProSettings\": {\n    \"NavTheme\": \"light\",\n    \"Layout\": \"side\",\n    \"ContentWidth\": \"Fluid\",\n    \"FixedHeader\": false,\n    \"FixSiderbar\": true,\n    \"Title\": \"GraphRag.Net\",\n    \"PrimaryColor\": \"daybreak\",\n    \"ColorWeak\": false,\n    \"SplitMenus\": false,\n    \"HeaderRender\": true,\n    \"FooterRender\": true,\n    \"MenuRender\": true,\n    \"MenuHeaderRender\": true,\n    \"HeaderHeight\": 48\n  },\n  \"GraphOpenAI\": {\n    \"Key\": \"你的秘钥，注册antskapi享受2折优惠\",\n    \"EndPoint\": \"https://api.antsk.cn/\",\n    \"ChatModel\": \"gpt-4o\",\n    \"EmbeddingModel\": \"text-embedding-ada-002\"\n  },\n  \"TextChunker\": {\n    \"LinesToken\": 100,\n    \"ParagraphsToken\": 1000\n  },\n  \"GraphDBConnection\": {\n    \"DbType\": \"Sqlite\", //PostgreSQL\n    \"DBConnection\": \"Data Source=graph.db\",\n    \"VectorConnection\": \"graphmem.db\",\n    \"VectorSize\": 1536 //PostgreSQL，需要设置，sqlite可以不设置\n  },\n  \"GraphSearch\": {\n    \"SearchMinRelevance\": 0.5,\n    \"SearchLimit\": 3,\n    \"NodeDepth\": 3,\n    \"MaxNodes\":10\n  },\n  \"GraphSys\": {\n    \"RetryCounnt\": 2 //重试次数，使用国产模型可能会出现json提取失败，增加重试次数可提高可用性\n  }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/community_search/config.json",
    "content": "{\n  \"schema\": 1,\n  \"description\": \"GraphRag问答\",\n  \"execution_settings\": {\n    \"default\": {\n      \"temperature\": 0.3\n    }\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/community_search/skprompt.txt",
    "content": "你是一个问答助手，需要根据图谱数据回答用户问题。\n\n<Graph>\n{{$graph}}\n</Graph>\n\n社区摘要如下：\n{{$community}}\n\n全局摘要如下:\n{{$global}}\n\n### 回答指南：\n1. 分析用户问题与图谱数据的关联度\n2. 根据图谱数据提供详细且准确的回答\n3. 识别图谱中的实体关系，并在回答中合理展示这些关系\n4. 若问题涉及多个图谱节点，确保整合所有相关信息\n5. 如遇到图谱中不存在的信息：\n   - 明确告知用户该信息不在图谱中\n   - 提供基于图谱已有信息的最佳推测（如果可能）\n   - 建议用户提供更多具体信息或重新表述问题\n### 回答要求：\n- 确保回答与图谱数据保持一致，不要添加图谱之外的信息\n- 回答应清晰、简洁，重点突出关键信息\n- 使用自然语言表达，避免技术术语除非用户问题中包含\n- 不要提及你是从<Graph></Graph>获取的知识\n- 当无法确定答案时，坦诚表明并请求更多信息\n\n用户问题: {{$input}}\n输出："
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/community_summaries/config.json",
    "content": "{\n  \"schema\": 1,\n  \"description\": \"社区总结\",\n  \"execution_settings\": {\n    \"default\": {\n      \"temperature\": 0\n    }\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/community_summaries/skprompt.txt",
    "content": "你是一个AI知识图谱生成助手，需要根据以下社区节点信息来生成社区摘要\n\n节点信息如下：\n{{$nodes}}\n\n社区摘要：\n"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/create/config.json",
    "content": "{\n  \"schema\": 1,\n  \"description\": \"生成Graph数据\",\n  \"execution_settings\": {\n    \"default\": {\n      \"temperature\": 0,\n      \"response_format\": { \"type\": \"json_object\" }\n    }\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/create/skprompt.txt",
    "content": "你是一个专业的AI知识图谱生成助手，专门负责从文本中精确提取实体和关系，并将其转化为结构化的知识图谱数据。\n\n### 背景知识：知识图谱基础结构\n知识图谱由节点(实体)和边(关系)组成：\n\n节点的数据结构：\n- Id: 唯一标识符，格式为\"node\"+数字，如\"node1\"\n- Name: 节点名称，提取的实体名\n- Type: 节点类型，应尽可能具体，常见类型包括：\n  * Person（人物）\n  * Organization（组织）\n  * Location（地点）\n  * Concept（概念）\n  * Event（事件）\n  * Product（产品）\n  * Time（时间）\n- Desc: 节点的描述，包含实体的重要属性或状态\n\n边的数据结构：\n- Source: 边的起始节点Id\n- Target: 边的目标节点Id\n- Relationship: 边的关系描述，应清晰表达两个节点之间的具体关系\n\n### 提取规则和策略：\n1. 完整性：确保提取文本中所有重要实体和关系\n2. 准确性：实体类型和关系描述应准确反映文本内容\n3. 一致性：同一实体在不同处出现时应使用相同节点ID\n4. 去重处理：相同实体不要创建多个节点\n5. 属性合并：如果文本中多次描述同一实体的不同属性，应合并到同一节点的Desc字段\n\n### 实体识别指南：\n- 人名、组织名、地点名等专有名词通常是重要实体\n- 文本中被反复提及的概念或事物应被识别为实体\n- 实体的Type应尽可能具体而准确\n- 实体的描述(Desc)应包含文本中提及的该实体的重要特征或状态\n\n### 关系提取指南：\n- 关系描述应简洁明确，通常是动词或动词短语\n- 确保关系有明确的方向性，指明哪个实体是Source，哪个是Target\n- 复杂关系可以分解为多个简单关系\n- 隐含关系也应提取，但必须有文本依据\n\n### 特殊情况处理：\n- 同义词或指代：识别文本中的代词或不同表述指向同一实体的情况\n- 时态变化：捕捉实体状态随时间的变化\n- 条件关系：区分确定关系和假设关系\n- 否定关系：正确处理否定表述\n\n### 输入说明：\n用户将输入描述节点及其关系的自然语言文本。系统需根据输入文本提取信息并生成知识图谱数据，格式如下：\n```json\n{\n    \"Nodes\": [节点列表],\n    \"Edges\": [边列表]\n}\n```\n\n### 输出要求：\n- 仅返回JSON格式数据，不包含markdown或其他格式\n- 确保JSON格式正确无误，节点ID从node1开始顺序编号\n- 边的Source和Target必须对应已定义的节点ID\n\n### 示例输入：\nAlice拥有100元，遇到了Bob并转账20元给他。之后，她见到了Charlie并转账30元给他，最后她遇到了David。\n\n### 示例输出：\n{\n    \"Nodes\": [\n        {\n            \"Id\": \"node1\",\n            \"Name\": \"Alice\",\n            \"Type\": \"Person\",\n            \"Desc\": \"最初拥有100元，后转账给Bob和Charlie\"\n        },\n        {\n            \"Id\": \"node2\",\n            \"Name\": \"Bob\",\n            \"Type\": \"Person\",\n            \"Desc\": \"从Alice处收到20元\"\n        },\n        {\n            \"Id\": \"node3\",\n            \"Name\": \"Charlie\",\n            \"Type\": \"Person\",\n            \"Desc\": \"从Alice处收到30元\"\n        },\n        {\n            \"Id\": \"node4\",\n            \"Name\": \"David\",\n            \"Type\": \"Person\",\n            \"Desc\": \"被Alice遇到\"\n        }\n    ],\n    \"Edges\": [\n        {\n            \"Source\": \"node1\",\n            \"Target\": \"node2\",\n            \"Relationship\": \"转账20元给\"\n        },\n        {\n            \"Source\": \"node1\",\n            \"Target\": \"node3\",\n            \"Relationship\": \"转账30元给\"\n        },\n        {\n            \"Source\": \"node1\",\n            \"Target\": \"node4\",\n            \"Relationship\": \"遇到\"\n        }\n    ]\n}\n\n### 更复杂示例输入：\n小明是一名大学生，就读于北京大学计算机系。他的导师张教授是人工智能领域的专家。小明正在开发一个知识图谱项目，该项目获得了科技部5万元的资助。昨天，小明在实验室遇到了同学小红，她也是张教授的学生，正在研究自然语言处理技术。\n\n### 更复杂示例输出：\n{\n    \"Nodes\": [\n        {\n            \"Id\": \"node1\",\n            \"Name\": \"小明\",\n            \"Type\": \"Person\",\n            \"Desc\": \"大学生，就读于北京大学计算机系，开发知识图谱项目\"\n        },\n        {\n            \"Id\": \"node2\",\n            \"Name\": \"北京大学\",\n            \"Type\": \"Organization\",\n            \"Desc\": \"高等教育机构\"\n        },\n        {\n            \"Id\": \"node3\",\n            \"Name\": \"计算机系\",\n            \"Type\": \"Organization\",\n            \"Desc\": \"北京大学的院系\"\n        },\n        {\n            \"Id\": \"node4\",\n            \"Name\": \"张教授\",\n            \"Type\": \"Person\",\n            \"Desc\": \"人工智能领域的专家，小明和小红的导师\"\n        },\n        {\n            \"Id\": \"node5\",\n            \"Name\": \"知识图谱项目\",\n            \"Type\": \"Project\",\n            \"Desc\": \"小明开发的项目，获得科技部5万元资助\"\n        },\n        {\n            \"Id\": \"node6\",\n            \"Name\": \"科技部\",\n            \"Type\": \"Organization\",\n            \"Desc\": \"提供5万元资助\"\n        },\n        {\n            \"Id\": \"node7\",\n            \"Name\": \"小红\",\n            \"Type\": \"Person\",\n            \"Desc\": \"张教授的学生，研究自然语言处理技术\"\n        },\n        {\n            \"Id\": \"node8\",\n            \"Name\": \"实验室\",\n            \"Type\": \"Location\",\n            \"Desc\": \"小明遇到小红的地点\"\n        },\n        {\n            \"Id\": \"node9\",\n            \"Name\": \"自然语言处理\",\n            \"Type\": \"Concept\",\n            \"Desc\": \"小红研究的技术\"\n        }\n    ],\n    \"Edges\": [\n        {\n            \"Source\": \"node1\",\n            \"Target\": \"node3\",\n            \"Relationship\": \"就读于\"\n        },\n        {\n            \"Source\": \"node3\",\n            \"Target\": \"node2\",\n            \"Relationship\": \"属于\"\n        },\n        {\n            \"Source\": \"node4\",\n            \"Target\": \"node1\",\n            \"Relationship\": \"是导师\"\n        },\n        {\n            \"Source\": \"node4\",\n            \"Target\": \"node7\",\n            \"Relationship\": \"是导师\"\n        },\n        {\n            \"Source\": \"node1\",\n            \"Target\": \"node5\",\n            \"Relationship\": \"开发\"\n        },\n        {\n            \"Source\": \"node6\",\n            \"Target\": \"node5\",\n            \"Relationship\": \"资助5万元\"\n        },\n        {\n            \"Source\": \"node1\",\n            \"Target\": \"node7\",\n            \"Relationship\": \"在实验室遇到\"\n        },\n        {\n            \"Source\": \"node8\",\n            \"Target\": \"node1\",\n            \"Relationship\": \"是遇见地点\"\n        },\n        {\n            \"Source\": \"node8\",\n            \"Target\": \"node7\",\n            \"Relationship\": \"是遇见地点\"\n        },\n        {\n            \"Source\": \"node7\",\n            \"Target\": \"node9\",\n            \"Relationship\": \"研究\"\n        }\n    ]\n}\n\n你要生成的内容是：\n{{$input}}\n\n输出："
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/global_summaries/config.json",
    "content": "{\n  \"schema\": 1,\n  \"description\": \"全局总结\",\n  \"execution_settings\": {\n    \"default\": {\n      \"temperature\": 0\n    }\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/global_summaries/skprompt.txt",
    "content": "你是一个AI知识图谱生成助手，需要根据以下社区摘要信息来生成全局摘要\n\n社区摘要信息如下：\n{{$community}}\n\n全局摘要：\n"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/mergedesc/config.json",
    "content": "{\n  \"schema\": 1,\n  \"description\": \"GraphRag问答\",\n  \"execution_settings\": {\n    \"default\": {\n      \"temperature\": 0.3\n    }\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/mergedesc/skprompt.txt",
    "content": "以下2段内容均描述同一节点，将内容进行整合，考虑新旧关系，仅返回整合内容\n\n### 示例输入\n旧的描述:我喜欢吃苹果\n新的描述:我喜欢打篮球\n\n### 示例输出\n我喜欢吃苹果和打篮球\n\n------------------------------------------------\n\n### 示例输入\n旧的描述:我喜欢吃苹果\n新的描述:我不喜欢吃苹果了\n\n### 示例输出\n我不喜欢吃苹果\n\n------------------------------------------------\n\n旧的描述:{{$desc1}}\n新的描述:{{$desc2}}\n\n输出："
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/relationship/config.json",
    "content": "{\n  \"schema\": 1,\n  \"description\": \"判断节点相关性\",\n  \"execution_settings\": {\n    \"default\": {\n      \"temperature\": 0,\n      \"response_format\": { \"type\": \"json_object\" }\n    }\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/relationship/skprompt.txt",
    "content": "你是一个AI知识图谱生成助手，给定2个节点的描述，你需要确定他们是否相关,输出json格式，不需要markdown格式。\n\n### 示例输入\nnode1:Name:苹果;Type:Fruit;Desc:一种水果\nnode2:Name:红色;Type:Color;Desc:一种颜色\n\n### 示例输出\n{\"IsRelationship\":true,\"Edge\": {\"Source\": \"node1\", \"Target\": \"node2\", \"Relationship\": \"苹果是红色\"}}\n\n### 示例输入\nnode1:Name:苹果;Type:Fruit;Desc:一种水果\nnode2:Name:老虎;Type:Animal;Desc:一种动物\n\n### 示例输出\n{\"IsRelationship\":false}\n\n你要生成的内容是：\nnode1:{{$node1}}\nnode2:{{$node2}}\n\n输出："
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/search/config.json",
    "content": "{\n  \"schema\": 1,\n  \"description\": \"GraphRag问答\",\n  \"execution_settings\": {\n    \"default\": {\n      \"temperature\": 0.3\n    }\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/graphPlugins/graph/search/skprompt.txt",
    "content": "你是一个问答助手，需要根据图谱数据回答用户问题。\n\n<Graph>\n{{$graph}}\n</Graph>\n\n回答要求：\n- 如果你不清楚答案，你需要澄清\n- 避免提及你是从<Graph></Graph>获取的知识\n- 保持答案与<Graph></Graph>中描述一致\n\n用户问题: {{$input}}\n输出："
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/appsettings.json",
    "content": "{\n  \"ProSettings\": {\n    \"NavTheme\": \"dark\",\n    \"Layout\": \"side\",\n    \"ContentWidth\": \"Fluid\",\n    \"FixedHeader\": false,\n    \"FixSiderbar\": true,\n    \"Title\": \"Ant Design Pro\",\n    \"PrimaryColor\": \"daybreak\",\n    \"ColorWeak\": false,\n    \"SplitMenus\": false,\n    \"HeaderRender\": true,\n    \"FooterRender\": true,\n    \"MenuRender\": true,\n    \"MenuHeaderRender\": true,\n    \"HeaderHeight\": 48\n  }\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/css/site.css",
    "content": "/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\n/* stylelint-disable no-duplicate-selectors */\n/* stylelint-disable */\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\nhtml,\nbody,\n#root,\n#app,\napp {\n  height: 100%;\n}\n.colorWeak {\n  filter: invert(80%);\n}\n.ant-layout {\n  min-height: 100vh;\n}\ncanvas {\n  display: block;\n}\nbody {\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\nul,\nol {\n  list-style: none;\n}\n.action {\n  cursor: pointer;\n}\n@media (max-width: 480px) {\n  .ant-table {\n    width: 100%;\n    overflow-x: auto;\n  }\n  .ant-table-thead > tr > th,\n  .ant-table-tbody > tr > th,\n  .ant-table-thead > tr > td,\n  .ant-table-tbody > tr > td {\n    white-space: pre;\n  }\n  .ant-table-thead > tr > th > span,\n  .ant-table-tbody > tr > th > span,\n  .ant-table-thead > tr > td > span,\n  .ant-table-tbody > tr > td > span {\n    display: block;\n  }\n}\n@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) {\n  body .ant-design-pro > .ant-layout {\n    min-height: 100vh;\n  }\n}\n"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/activities.json",
    "content": "[\n  {\n    \"id\": \"trend-1\",\n    \"updatedAt\": \"2020-08-26T10:21:19.719Z\",\n    \"user\": {\n      \"name\": \"Qu Lili\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png\"\n    },\n    \"group\": {\n      \"name\": \"Highly Compelling Design Team\",\n      \"link\": \"http://github.com/\"\n    },\n    \"project\": {\n      \"name\": \"June Version\",\n      \"link\": \"http://github.com/\"\n    },\n    \"template\": \"created a new project in @{group} @{project}\"\n  },\n  {\n    \"id\": \"trend-2\",\n    \"updatedAt\": \"2020-08-26T10:21:19.719Z\",\n    \"user\": {\n      \"name\": \"Fu Xiaoxiao\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png\"\n    },\n    \"group\": {\n      \"name\": \"Highly Compelling Design Team\",\n      \"link\": \"http://github.com/\"\n    },\n    \"project\": {\n      \"name\": \"June Version\",\n      \"link\": \"http://github.com/\"\n    },\n    \"template\": \"created a new project in @{group} @{project}\"\n  },\n  {\n    \"id\": \"trend-3\",\n    \"updatedAt\": \"2020-08-26T10:21:19.719Z\",\n    \"user\": {\n      \"name\": \"Lin Dongdong\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png\"\n    },\n    \"group\": {\n      \"name\": \"Second Girls Group\",\n      \"link\": \"http://github.com/\"\n    },\n    \"project\": {\n      \"name\": \"June Version\",\n      \"link\": \"http://github.com/\"\n    },\n    \"template\": \"created a new project in @{group} @{project}\"\n  },\n  {\n    \"id\": \"trend-4\",\n    \"updatedAt\": \"2020-08-26T10:21:19.719Z\",\n    \"user\": {\n      \"name\": \"Zhou Xingxing\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png\"\n    },\n    \"project\": {\n      \"name\": \"Daily iteration in May\",\n      \"link\": \"http://github.com/\"\n    },\n    \"template\": \"updated @{project} to the published state\"\n  },\n  {\n    \"id\": \"trend-5\",\n    \"updatedAt\": \"2020-08-26T10:21:19.719Z\",\n    \"user\": {\n      \"name\": \"Zhu\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png\"\n    },\n    \"project\": {\n      \"name\": \"Engineering Efficiency\",\n      \"link\": \"http://github.com/\"\n    },\n    \"comment\": {\n      \"name\": \"Leave a message\",\n      \"link\": \"http://github.com/\"\n    },\n    \"template\": \"posted a @{comment} on @{project}\"\n  },\n  {\n    \"id\": \"trend-6\",\n    \"updatedAt\": \"2020-08-26T10:21:19.719Z\",\n    \"user\": {\n      \"name\": \"Le Brother\",\n      \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png\"\n    },\n    \"group\": {\n      \"name\": \"Programmers Daily\",\n      \"link\": \"http://github.com/\"\n    },\n    \"project\": {\n      \"name\": \"Brand Iteration\",\n      \"link\": \"http://github.com/\"\n    },\n    \"template\": \"created a new project in @{group} @{project}\"\n  }\n]"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/advanced.json",
    "content": "{\n  \"advancedOperation1\": [\n    {\n      \"key\": \"op1\",\n      \"type\": \"Ordering relationship takes effect\",\n      \"name\": \"Qu Lili\",\n      \"status\": \"agree\",\n      \"updatedAt\": \"2017-10-03  19:23:12\",\n      \"memo\": \"-\"\n    },\n    {\n      \"key\": \"op2\",\n      \"type\": \"Financial Review\",\n      \"name\": \"Fu Xiaoxiao\",\n      \"status\": \"reject\",\n      \"updatedAt\": \"2017-10-03  19:23:12\",\n      \"memo\": \"Not passing the reason\"\n    },\n    {\n      \"key\": \"op3\",\n      \"type\": \"Departmental preliminary review\",\n      \"name\": \"Zhou Maomao\",\n      \"status\": \"agree\",\n      \"updatedAt\": \"2017-10-03  19:23:12\",\n      \"memo\": \"-\"\n    },\n    {\n      \"key\": \"op4\",\n      \"type\": \"Submit Order\",\n      \"name\": \"Lin Dongdong\",\n      \"status\": \"agree\",\n      \"updatedAt\": \"2017-10-03  19:23:12\",\n      \"memo\": \"很棒\"\n    },\n    {\n      \"key\": \"op5\",\n      \"type\": \"Create Order\",\n      \"name\": \"Sweaty\",\n      \"status\": \"agree\",\n      \"updatedAt\": \"2017-10-03  19:23:12\",\n      \"memo\": \"-\"\n    }\n  ],\n  \"advancedOperation2\": [\n    {\n      \"key\": \"op1\",\n      \"type\": \"Order relationship takes effect\",\n      \"name\": \"Qu Lili\",\n      \"status\": \"agree\",\n      \"updatedAt\": \"2017-10-03  19:23:12\",\n      \"memo\": \"-\"\n    }\n  ],\n  \"advancedOperation3\": [\n    {\n      \"key\": \"op1\",\n      \"type\": \"Create Order\",\n      \"name\": \"Sweat tooth\",\n      \"status\": \"agree\",\n      \"updatedAt\": \"2017-10-03  19:23:12\",\n      \"memo\": \"-\"\n    }\n  ]\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/basic.json",
    "content": "{\n  \"basicGoods\": [\n    {\n      \"id\": \"1234561\",\n      \"name\": \"Mineral Water 550ml\",\n      \"barcode\": \"12421432143214321\",\n      \"price\": \"2.00\",\n      \"num\": \"1\",\n      \"amount\": \"2.00\"\n    },\n    {\n      \"id\": \"1234562\",\n      \"name\": \"Herbal tea 300ml\",\n      \"barcode\": \"12421432143214322\",\n      \"price\": \"3.00\",\n      \"num\": \"2\",\n      \"amount\": \"6.00\"\n    },\n    {\n      \"id\": \"1234563\",\n      \"name\": \"Delicious potato chips\",\n      \"barcode\": \"12421432143214323\",\n      \"price\": \"7.00\",\n      \"num\": \"4\",\n      \"amount\": \"28.00\"\n    },\n    {\n      \"id\": \"1234564\",\n      \"name\": \"Specially delicious egg rolls\",\n      \"barcode\": \"12421432143214324\",\n      \"price\": \"8.50\",\n      \"num\": \"3\",\n      \"amount\": \"25.50\"\n    }\n  ],\n  \"basicProgress\": [\n    {\n      \"key\": \"1\",\n      \"time\": \"2017-10-01 14:10\",\n      \"rate\": \"Contact Clients\",\n      \"status\": \"Processing\",\n      \"operator\": \"Pickup Assistant ID1234\",\n      \"cost\": \"5mins\"\n    },\n    {\n      \"key\": \"2\",\n      \"time\": \"2017-10-01 14:05\",\n      \"rate\": \"Pickup Guy Departs\",\n      \"status\": \"Success\",\n      \"operator\": \"Pickup Assistant ID1234\",\n      \"cost\": \"1h\"\n    },\n    {\n      \"key\": \"3\",\n      \"time\": \"2017-10-01 13:05\",\n      \"rate\": \"Pick-up person takes orders\",\n      \"status\": \"Success\",\n      \"operator\": \"Pickup Assistant ID1234\",\n      \"cost\": \"5mins\"\n    },\n    {\n      \"key\": \"4\",\n      \"time\": \"2017-10-01 13:00\",\n      \"rate\": \"Apply For Approval\",\n      \"status\": \"Success\",\n      \"operator\": \"system\",\n      \"cost\": \"1h\"\n    },\n    {\n      \"key\": \"5\",\n      \"time\": \"2017-10-01 12:00\",\n      \"rate\": \"Initiated a Return Request\",\n      \"status\": \"Success\",\n      \"operator\": \"user\",\n      \"cost\": \"5mins\"\n    }\n  ]\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/current_user.json",
    "content": "{\n  \"name\": \"Serati Ma\",\n  \"avatar\": \"https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png\",\n  \"userid\": \"00000001\",\n  \"email\": \"antdesign@alipay.com\",\n  \"signature\": \"Be tolerant to diversity, tolerance is a virtue\",\n  \"title\": \"Interaction Expert\",\n  \"group\": \"Ant Financial Services-XX Business Group-XX Platform Department-XX Technology Department-UED\",\n  \"tags\": [\n    {\n      \"key\": \"0\",\n      \"label\": \"Very thoughtful\"\n    },\n    {\n      \"key\": \"1\",\n      \"label\": \"Focus on Design\"\n    },\n    {\n      \"key\": \"2\",\n      \"label\": \"Spicy ~\"\n    },\n    {\n      \"key\": \"3\",\n      \"label\": \"Long legs\"\n    },\n    {\n      \"key\": \"4\",\n      \"label\": \"Chuan Meizi\"\n    },\n    {\n      \"key\": \"5\",\n      \"label\": \"Have inclusive of all rivers\"\n    }\n  ],\n  \"notifyCount\": 12,\n  \"unreadCount\": 11,\n  \"country\": \"China\",\n  \"geographic\": {\n    \"province\": {\n      \"label\": \"Zhejiang Province\",\n      \"key\": \"330000\"\n    },\n    \"city\": {\n      \"label\": \"Hangzhou City\",\n      \"key\": \"330100\"\n    }\n  },\n  \"address\": \"77 Gongzhuan Road, Xihu District\",\n  \"phone\": \"0752-268888888\"\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/fake_chart_data.json",
    "content": "{\n  \"visitData\": [\n    {\n      \"x\": \"2020-08-25\",\n      \"y\": 7\n    },\n    {\n      \"x\": \"2020-08-26\",\n      \"y\": 5\n    },\n    {\n      \"x\": \"2020-08-27\",\n      \"y\": 4\n    },\n    {\n      \"x\": \"2020-08-28\",\n      \"y\": 2\n    },\n    {\n      \"x\": \"2020-08-29\",\n      \"y\": 4\n    },\n    {\n      \"x\": \"2020-08-30\",\n      \"y\": 7\n    },\n    {\n      \"x\": \"2020-08-31\",\n      \"y\": 5\n    },\n    {\n      \"x\": \"2020-09-01\",\n      \"y\": 6\n    },\n    {\n      \"x\": \"2020-09-02\",\n      \"y\": 5\n    },\n    {\n      \"x\": \"2020-09-03\",\n      \"y\": 9\n    },\n    {\n      \"x\": \"2020-09-04\",\n      \"y\": 6\n    },\n    {\n      \"x\": \"2020-09-05\",\n      \"y\": 3\n    },\n    {\n      \"x\": \"2020-09-06\",\n      \"y\": 1\n    },\n    {\n      \"x\": \"2020-09-07\",\n      \"y\": 5\n    },\n    {\n      \"x\": \"2020-09-08\",\n      \"y\": 3\n    },\n    {\n      \"x\": \"2020-09-09\",\n      \"y\": 6\n    },\n    {\n      \"x\": \"2020-09-10\",\n      \"y\": 5\n    }\n  ],\n  \"visitData2\": [\n    {\n      \"x\": \"2020-08-25\",\n      \"y\": 1\n    },\n    {\n      \"x\": \"2020-08-26\",\n      \"y\": 6\n    },\n    {\n      \"x\": \"2020-08-27\",\n      \"y\": 4\n    },\n    {\n      \"x\": \"2020-08-28\",\n      \"y\": 8\n    },\n    {\n      \"x\": \"2020-08-29\",\n      \"y\": 3\n    },\n    {\n      \"x\": \"2020-08-30\",\n      \"y\": 7\n    },\n    {\n      \"x\": \"2020-08-31\",\n      \"y\": 2\n    }\n  ],\n  \"salesData\": [\n    {\n      \"x\": \"January\",\n      \"y\": 1003\n    },\n    {\n      \"x\": \"February\",\n      \"y\": 878\n    },\n    {\n      \"x\": \"March\",\n      \"y\": 408\n    },\n    {\n      \"x\": \"April\",\n      \"y\": 426\n    },\n    {\n      \"x\": \"May\",\n      \"y\": 357\n    },\n    {\n      \"x\": \"June\",\n      \"y\": 1056\n    },\n    {\n      \"x\": \"July\",\n      \"y\": 369\n    },\n    {\n      \"x\": \"August\",\n      \"y\": 284\n    },\n    {\n      \"x\": \"September\",\n      \"y\": 1173\n    },\n    {\n      \"x\": \"October\",\n      \"y\": 639\n    },\n    {\n      \"x\": \"November\",\n      \"y\": 1117\n    },\n    {\n      \"x\": \"December\",\n      \"y\": 512\n    }\n  ],\n  \"searchData\": [\n    {\n      \"index\": 1,\n      \"keyword\": \"Search Keyword-0\",\n      \"count\": 190,\n      \"range\": 64,\n      \"status\": 1\n    },\n    {\n      \"index\": 2,\n      \"keyword\": \"Search Keyword-1\",\n      \"count\": 347,\n      \"range\": 19,\n      \"status\": 0\n    },\n    {\n      \"index\": 3,\n      \"keyword\": \"Search Keyword-2\",\n      \"count\": 314,\n      \"range\": 35,\n      \"status\": 1\n    },\n    {\n      \"index\": 4,\n      \"keyword\": \"Search Keyword-3\",\n      \"count\": 81,\n      \"range\": 59,\n      \"status\": 1\n    },\n    {\n      \"index\": 5,\n      \"keyword\": \"Search Keyword-4\",\n      \"count\": 235,\n      \"range\": 16,\n      \"status\": 1\n    },\n    {\n      \"index\": 6,\n      \"keyword\": \"Search Keyword-5\",\n      \"count\": 834,\n      \"range\": 46,\n      \"status\": 0\n    },\n    {\n      \"index\": 7,\n      \"keyword\": \"Search Keyword-6\",\n      \"count\": 806,\n      \"range\": 45,\n      \"status\": 1\n    },\n    {\n      \"index\": 8,\n      \"keyword\": \"Search Keywords-7\",\n      \"count\": 116,\n      \"range\": 96,\n      \"status\": 1\n    },\n    {\n      \"index\": 9,\n      \"keyword\": \"Search Keyword-8\",\n      \"count\": 355,\n      \"range\": 44,\n      \"status\": 1\n    },\n    {\n      \"index\": 10,\n      \"keyword\": \"Search keyword-9\",\n      \"count\": 903,\n      \"range\": 91,\n      \"status\": 0\n    },\n    {\n      \"index\": 11,\n      \"keyword\": \"Search Keyword-10\",\n      \"count\": 411,\n      \"range\": 64,\n      \"status\": 0\n    },\n    {\n      \"index\": 12,\n      \"keyword\": \"Search Keyword-11\",\n      \"count\": 266,\n      \"range\": 15,\n      \"status\": 1\n    },\n    {\n      \"index\": 13,\n      \"keyword\": \"Search Keywords-12\",\n      \"count\": 163,\n      \"range\": 59,\n      \"status\": 1\n    },\n    {\n      \"index\": 14,\n      \"keyword\": \"Search Keyword-13\",\n      \"count\": 815,\n      \"range\": 30,\n      \"status\": 1\n    },\n    {\n      \"index\": 15,\n      \"keyword\": \"Search keyword-14\",\n      \"count\": 130,\n      \"range\": 35,\n      \"status\": 1\n    },\n    {\n      \"index\": 16,\n      \"keyword\": \"Search Keyword-15\",\n      \"count\": 342,\n      \"range\": 8,\n      \"status\": 1\n    },\n    {\n      \"index\": 17,\n      \"keyword\": \"Search Keyword-16\",\n      \"count\": 970,\n      \"range\": 90,\n      \"status\": 1\n    },\n    {\n      \"index\": 18,\n      \"keyword\": \"Search Keyword-17\",\n      \"count\": 613,\n      \"range\": 24,\n      \"status\": 0\n    },\n    {\n      \"index\": 19,\n      \"keyword\": \"Search Keyword-18\",\n      \"count\": 807,\n      \"range\": 23,\n      \"status\": 1\n    },\n    {\n      \"index\": 20,\n      \"keyword\": \"Search Keyword-19\",\n      \"count\": 480,\n      \"range\": 21,\n      \"status\": 1\n    },\n    {\n      \"index\": 21,\n      \"keyword\": \"Search Keyword-20\",\n      \"count\": 57,\n      \"range\": 82,\n      \"status\": 0\n    },\n    {\n      \"index\": 22,\n      \"keyword\": \"Search Keyword-21\",\n      \"count\": 513,\n      \"range\": 89,\n      \"status\": 0\n    },\n    {\n      \"index\": 23,\n      \"keyword\": \"Search Keyword-22\",\n      \"count\": 733,\n      \"range\": 62,\n      \"status\": 1\n    },\n    {\n      \"index\": 24,\n      \"keyword\": \"Search Keyword-23\",\n      \"count\": 887,\n      \"range\": 82,\n      \"status\": 1\n    },\n    {\n      \"index\": 25,\n      \"keyword\": \"Search Keyword-24\",\n      \"count\": 668,\n      \"range\": 9,\n      \"status\": 0\n    },\n    {\n      \"index\": 26,\n      \"keyword\": \"Search Keyword-25\",\n      \"count\": 398,\n      \"range\": 99,\n      \"status\": 1\n    },\n    {\n      \"index\": 27,\n      \"keyword\": \"Search Keyword-26\",\n      \"count\": 73,\n      \"range\": 48,\n      \"status\": 1\n    },\n    {\n      \"index\": 28,\n      \"keyword\": \"Search Keyword-27\",\n      \"count\": 63,\n      \"range\": 53,\n      \"status\": 1\n    },\n    {\n      \"index\": 29,\n      \"keyword\": \"Search Keywords-28\",\n      \"count\": 23,\n      \"range\": 32,\n      \"status\": 1\n    },\n    {\n      \"index\": 30,\n      \"keyword\": \"Search Keywords-29\",\n      \"count\": 650,\n      \"range\": 48,\n      \"status\": 0\n    },\n    {\n      \"index\": 31,\n      \"keyword\": \"Search Keyword-30\",\n      \"count\": 752,\n      \"range\": 13,\n      \"status\": 1\n    },\n    {\n      \"index\": 32,\n      \"keyword\": \"Search Keyword-31\",\n      \"count\": 571,\n      \"range\": 0,\n      \"status\": 0\n    },\n    {\n      \"index\": 33,\n      \"keyword\": \"Search Keyword-32\",\n      \"count\": 778,\n      \"range\": 33,\n      \"status\": 1\n    },\n    {\n      \"index\": 34,\n      \"keyword\": \"Search Keyword-33\",\n      \"count\": 537,\n      \"range\": 1,\n      \"status\": 1\n    },\n    {\n      \"index\": 35,\n      \"keyword\": \"Search keyword -34\",\n      \"count\": 467,\n      \"range\": 17,\n      \"status\": 0\n    },\n    {\n      \"index\": 36,\n      \"keyword\": \"Search keyword -35\",\n      \"count\": 106,\n      \"range\": 72,\n      \"status\": 0\n    },\n    {\n      \"index\": 37,\n      \"keyword\": \"Search keyword -36\",\n      \"count\": 984,\n      \"range\": 67,\n      \"status\": 0\n    },\n    {\n      \"index\": 38,\n      \"keyword\": \"Search key word -37\",\n      \"count\": 850,\n      \"range\": 7,\n      \"status\": 1\n    },\n    {\n      \"index\": 39,\n      \"keyword\": \"Search Keyword-38\",\n      \"count\": 475,\n      \"range\": 46,\n      \"status\": 1\n    },\n    {\n      \"index\": 40,\n      \"keyword\": \"Search Keyword-39\",\n      \"count\": 943,\n      \"range\": 38,\n      \"status\": 0\n    },\n    {\n      \"index\": 41,\n      \"keyword\": \"Search Keyword-40\",\n      \"count\": 915,\n      \"range\": 37,\n      \"status\": 1\n    },\n    {\n      \"index\": 42,\n      \"keyword\": \"Search Keyword-41\",\n      \"count\": 852,\n      \"range\": 67,\n      \"status\": 0\n    },\n    {\n      \"index\": 43,\n      \"keyword\": \"Search Keyword-42\",\n      \"count\": 21,\n      \"range\": 29,\n      \"status\": 1\n    },\n    {\n      \"index\": 44,\n      \"keyword\": \"Search Keyword-43\",\n      \"count\": 224,\n      \"range\": 25,\n      \"status\": 0\n    },\n    {\n      \"index\": 45,\n      \"keyword\": \"Search Keyword-44\",\n      \"count\": 904,\n      \"range\": 23,\n      \"status\": 0\n    },\n    {\n      \"index\": 46,\n      \"keyword\": \"Search Keyword-45\",\n      \"count\": 240,\n      \"range\": 39,\n      \"status\": 0\n    },\n    {\n      \"index\": 47,\n      \"keyword\": \"Search Keyword-46\",\n      \"count\": 735,\n      \"range\": 33,\n      \"status\": 0\n    },\n    {\n      \"index\": 48,\n      \"keyword\": \"Search Keyword-47\",\n      \"count\": 612,\n      \"range\": 15,\n      \"status\": 1\n    },\n    {\n      \"index\": 49,\n      \"keyword\": \"Search Keyword-48\",\n      \"count\": 877,\n      \"range\": 62,\n      \"status\": 1\n    },\n    {\n      \"index\": 50,\n      \"keyword\": \"Search Keyword-49\",\n      \"count\": 146,\n      \"range\": 48,\n      \"status\": 1\n    }\n  ],\n  \"offlineData\": [\n    {\n      \"name\": \"Stores 0\",\n      \"cvr\": 0.8\n    },\n    {\n      \"name\": \"Stores 1\",\n      \"cvr\": 0.7\n    },\n    {\n      \"name\": \"Stores 2\",\n      \"cvr\": 0.4\n    },\n    {\n      \"name\": \"Stores 3\",\n      \"cvr\": 0.3\n    },\n    {\n      \"name\": \"Stores 4\",\n      \"cvr\": 0.1\n    },\n    {\n      \"name\": \"Stores 5\",\n      \"cvr\": 0.1\n    },\n    {\n      \"name\": \"Stores 6\",\n      \"cvr\": 0.6\n    },\n    {\n      \"name\": \"Stores 7\",\n      \"cvr\": 0.9\n    },\n    {\n      \"name\": \"Stores 8\",\n      \"cvr\": 0.3\n    },\n    {\n      \"name\": \"Stores 9\",\n      \"cvr\": 0.9\n    }\n  ],\n  \"offlineChartData\": [\n    {\n      \"x\": 1598358002462,\n      \"y1\": 63,\n      \"y2\": 21\n    },\n    {\n      \"x\": 1598359802462,\n      \"y1\": 50,\n      \"y2\": 73\n    },\n    {\n      \"x\": 1598361602462,\n      \"y1\": 35,\n      \"y2\": 99\n    },\n    {\n      \"x\": 1598363402462,\n      \"y1\": 105,\n      \"y2\": 105\n    },\n    {\n      \"x\": 1598365202462,\n      \"y1\": 86,\n      \"y2\": 22\n    },\n    {\n      \"x\": 1598367002462,\n      \"y1\": 90,\n      \"y2\": 47\n    },\n    {\n      \"x\": 1598368802462,\n      \"y1\": 41,\n      \"y2\": 44\n    },\n    {\n      \"x\": 1598370602462,\n      \"y1\": 71,\n      \"y2\": 16\n    },\n    {\n      \"x\": 1598372402462,\n      \"y1\": 63,\n      \"y2\": 72\n    },\n    {\n      \"x\": 1598374202462,\n      \"y1\": 95,\n      \"y2\": 35\n    },\n    {\n      \"x\": 1598376002462,\n      \"y1\": 14,\n      \"y2\": 54\n    },\n    {\n      \"x\": 1598377802462,\n      \"y1\": 48,\n      \"y2\": 65\n    },\n    {\n      \"x\": 1598379602462,\n      \"y1\": 84,\n      \"y2\": 28\n    },\n    {\n      \"x\": 1598381402462,\n      \"y1\": 41,\n      \"y2\": 74\n    },\n    {\n      \"x\": 1598383202462,\n      \"y1\": 37,\n      \"y2\": 38\n    },\n    {\n      \"x\": 1598385002462,\n      \"y1\": 106,\n      \"y2\": 94\n    },\n    {\n      \"x\": 1598386802462,\n      \"y1\": 70,\n      \"y2\": 53\n    },\n    {\n      \"x\": 1598388602462,\n      \"y1\": 48,\n      \"y2\": 89\n    },\n    {\n      \"x\": 1598390402462,\n      \"y1\": 60,\n      \"y2\": 12\n    },\n    {\n      \"x\": 1598392202462,\n      \"y1\": 48,\n      \"y2\": 52\n    }\n  ],\n  \"salesTypeData\": [\n    {\n      \"x\": \"Household Appliance\",\n      \"y\": 4544\n    },\n    {\n      \"x\": \"Food and Drink\",\n      \"y\": 3321\n    },\n    {\n      \"x\": \"Personal Health\",\n      \"y\": 3113\n    },\n    {\n      \"x\": \"Clothing bags\",\n      \"y\": 2341\n    },\n    {\n      \"x\": \"Maternal and Child Products\",\n      \"y\": 1231\n    },\n    {\n      \"x\": \"other\",\n      \"y\": 1231\n    }\n  ],\n  \"salesTypeDataOnline\": [\n    {\n      \"x\": \"Household Appliances\",\n      \"y\": 244\n    },\n    {\n      \"x\": \"Eating wine\",\n      \"y\": 321\n    },\n    {\n      \"x\": \"Note Health\",\n      \"y\": 311\n    },\n    {\n      \"x\": \"Clothing Bags\",\n      \"y\": 41\n    },\n    {\n      \"x\": \"Mother and Baby Products\",\n      \"y\": 121\n    },\n    {\n      \"x\": \"other\",\n      \"y\": 111\n    }\n  ],\n  \"salesTypeDataOffline\": [\n    {\n      \"x\": \"Household Appliances\",\n      \"y\": 99\n    },\n    {\n      \"x\": \"Food and Drink\",\n      \"y\": 188\n    },\n    {\n      \"x\": \"Personal Health\",\n      \"y\": 344\n    },\n    {\n      \"x\": \"Clothing Bags\",\n      \"y\": 255\n    },\n    {\n      \"x\": \"other\",\n      \"y\": 65\n    }\n  ],\n  \"radarData\": [\n    {\n      \"name\": \"personal\",\n      \"label\": \"Quote\",\n      \"value\": 10\n    },\n    {\n      \"name\": \"personal\",\n      \"label\": \"Word of mouth\",\n      \"value\": 8\n    },\n    {\n      \"name\": \"personal\",\n      \"label\": \"Yield\",\n      \"value\": 4\n    },\n    {\n      \"name\": \"personal\",\n      \"label\": \"contribution\",\n      \"value\": 5\n    },\n    {\n      \"name\": \"personal\",\n      \"label\": \"heat\",\n      \"value\": 7\n    },\n    {\n      \"name\": \"team\",\n      \"label\": \"Quote\",\n      \"value\": 3\n    },\n    {\n      \"name\": \"team\",\n      \"label\": \"Word of mouth\",\n      \"value\": 9\n    },\n    {\n      \"name\": \"team\",\n      \"label\": \"Yield\",\n      \"value\": 6\n    },\n    {\n      \"name\": \"team\",\n      \"label\": \"contribution\",\n      \"value\": 3\n    },\n    {\n      \"name\": \"team\",\n      \"label\": \"heat\",\n      \"value\": 1\n    },\n    {\n      \"name\": \"department\",\n      \"label\": \"Quote\",\n      \"value\": 4\n    },\n    {\n      \"name\": \"department\",\n      \"label\": \"Word of mouth\",\n      \"value\": 1\n    },\n    {\n      \"name\": \"department\",\n      \"label\": \"Yield\",\n      \"value\": 6\n    },\n    {\n      \"name\": \"department\",\n      \"label\": \"contribution\",\n      \"value\": 5\n    },\n    {\n      \"name\": \"department\",\n      \"label\": \"heat\",\n      \"value\": 7\n    }\n  ]\n}"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/fake_list.json",
    "content": "﻿[\n  {\n    \"id\": \"fake-list-0\",\n    \"owner\": \"Fu Xiaoxiao\",\n    \"title\": \"Alipay\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png\",\n    \"status\": \"active\",\n    \"percent\": 61,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599562134333,\n    \"createdAt\": 1599562134333,\n    \"subDescription\": \"It's an inner thing, which they can't reach and can't reach\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 194692,\n    \"newUser\": 1107,\n    \"star\": 168,\n    \"like\": 166,\n    \"message\": 20,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-1\",\n    \"owner\": \"Qu Lili\",\n    \"title\": \"Angular\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png\",\n    \"status\": \"exception\",\n    \"percent\": 67,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599554934333,\n    \"createdAt\": 1599554934333,\n    \"subDescription\": \"Hope is a good thing, maybe the best, good things will not die out\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 187530,\n    \"newUser\": 1662,\n    \"star\": 184,\n    \"like\": 134,\n    \"message\": 20,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-2\",\n    \"owner\": \"Lin Dongdong\",\n    \"title\": \"Ant Design\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png\",\n    \"status\": \"normal\",\n    \"percent\": 88,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599547734333,\n    \"createdAt\": 1599547734333,\n    \"subDescription\": \"Life is like a box of chocolates, the results are often unexpected\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 150552,\n    \"newUser\": 1281,\n    \"star\": 114,\n    \"like\": 124,\n    \"message\": 20,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-3\",\n    \"owner\": \"Zhou Xingxing\",\n    \"title\": \"Ant Design Pro\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png\",\n    \"status\": \"active\",\n    \"percent\": 59,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599540534333,\n    \"createdAt\": 1599540534333,\n    \"subDescription\": \"There are so many pubs in the town, but she just walked into my pub\",\n    \"description\": \"In the development process of middle and Taiwan products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 180730,\n    \"newUser\": 1941,\n    \"star\": 109,\n    \"like\": 120,\n    \"message\": 13,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-4\",\n    \"owner\": \"Wu Jiahao\",\n    \"title\": \"Bootstrap\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png\",\n    \"status\": \"exception\",\n    \"percent\": 83,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599533334333,\n    \"createdAt\": 1599533334333,\n    \"subDescription\": \"At that time I only thought about what I wanted, never wanted what I had\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 159357,\n    \"newUser\": 1067,\n    \"star\": 139,\n    \"like\": 179,\n    \"message\": 14,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-5\",\n    \"owner\": \"Zhu Fang You\",\n    \"title\": \"React\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png\",\n    \"status\": \"normal\",\n    \"percent\": 92,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599526134333,\n    \"createdAt\": 1599526134333,\n    \"subDescription\": \"It's an inner thing, which they can't reach and can't reach\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 126480,\n    \"newUser\": 1467,\n    \"star\": 151,\n    \"like\": 171,\n    \"message\": 11,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-6\",\n    \"owner\": \"Fish Sauce\",\n    \"title\": \"Vue\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png\",\n    \"status\": \"active\",\n    \"percent\": 62,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599518934333,\n    \"createdAt\": 1599518934333,\n    \"subDescription\": \"Hope is a good thing, maybe the best, good things will not die out\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 132662,\n    \"newUser\": 1788,\n    \"star\": 114,\n    \"like\": 115,\n    \"message\": 14,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-7\",\n    \"owner\": \"Le Brother\",\n    \"title\": \"Webpack\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png\",\n    \"status\": \"exception\",\n    \"percent\": 98,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599511734333,\n    \"createdAt\": 1599511734333,\n    \"subDescription\": \"Life is like a box of chocolates, the results are often unexpected\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 190515,\n    \"newUser\": 1329,\n    \"star\": 105,\n    \"like\": 192,\n    \"message\": 11,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-8\",\n    \"owner\": \"Tan Xiaoyi\",\n    \"title\": \"Alipay\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png\",\n    \"status\": \"normal\",\n    \"percent\": 73,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599504534333,\n    \"createdAt\": 1599504534333,\n    \"subDescription\": \"There are so many pubs in the town, but she just walked into my pub\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 146120,\n    \"newUser\": 1375,\n    \"star\": 144,\n    \"like\": 114,\n    \"message\": 14,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-9\",\n    \"owner\": \"Zhong Ni\",\n    \"title\": \"Angular\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png\",\n    \"status\": \"active\",\n    \"percent\": 86,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599497334333,\n    \"createdAt\": 1599497334333,\n    \"subDescription\": \"At that time I only thought about what I wanted, never wanted what I had\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 150379,\n    \"newUser\": 1405,\n    \"star\": 174,\n    \"like\": 123,\n    \"message\": 20,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-10\",\n    \"owner\": \"Fu Xiaoxiao\",\n    \"title\": \"Ant Design\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png\",\n    \"status\": \"exception\",\n    \"percent\": 99,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599490134333,\n    \"createdAt\": 1599490134333,\n    \"subDescription\": \"It's an inner thing, which they can't reach and can't reach\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 192197,\n    \"newUser\": 1748,\n    \"star\": 200,\n    \"like\": 141,\n    \"message\": 20,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-11\",\n    \"owner\": \"Qu Lili\",\n    \"title\": \"Ant Design Pro\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png\",\n    \"status\": \"normal\",\n    \"percent\": 55,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599482934333,\n    \"createdAt\": 1599482934333,\n    \"subDescription\": \"Hope is a good thing, maybe the best, good things will not die out\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 125408,\n    \"newUser\": 1937,\n    \"star\": 158,\n    \"like\": 183,\n    \"message\": 17,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-12\",\n    \"owner\": \"Lin Dongdong\",\n    \"title\": \"Bootstrap\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png\",\n    \"status\": \"active\",\n    \"percent\": 62,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599475734333,\n    \"createdAt\": 1599475734333,\n    \"subDescription\": \"Life is like a box of chocolates, the results are often unexpected\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 150702,\n    \"newUser\": 1303,\n    \"star\": 143,\n    \"like\": 101,\n    \"message\": 20,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-13\",\n    \"owner\": \"Zhou Xingxing\",\n    \"title\": \"React\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png\",\n    \"status\": \"exception\",\n    \"percent\": 87,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599468534333,\n    \"createdAt\": 1599468534333,\n    \"subDescription\": \"There are so many pubs in the town, but she just walked into my pub\",\n    \"description\": \"In the development process of middle and Taiwan products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 106681,\n    \"newUser\": 1051,\n    \"star\": 124,\n    \"like\": 194,\n    \"message\": 17,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-14\",\n    \"owner\": \"Wu Jiahao\",\n    \"title\": \"Vue\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png\",\n    \"status\": \"normal\",\n    \"percent\": 74,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599461334333,\n    \"createdAt\": 1599461334333,\n    \"subDescription\": \"At that time I only thought about what I wanted, never wanted what I had\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 192810,\n    \"newUser\": 1574,\n    \"star\": 188,\n    \"like\": 124,\n    \"message\": 16,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-15\",\n    \"owner\": \"Zhu Fang You\",\n    \"title\": \"Webpack\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png\",\n    \"status\": \"active\",\n    \"percent\": 58,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599454134333,\n    \"createdAt\": 1599454134333,\n    \"subDescription\": \"It's an inner thing, which they can't reach and can't reach\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 129396,\n    \"newUser\": 1837,\n    \"star\": 106,\n    \"like\": 160,\n    \"message\": 13,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-16\",\n    \"owner\": \"Fish sauce\",\n    \"title\": \"Alipay\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png\",\n    \"status\": \"exception\",\n    \"percent\": 77,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599446934333,\n    \"createdAt\": 1599446934333,\n    \"subDescription\": \"Hope is a good thing, maybe the best, good things will not die out\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 101826,\n    \"newUser\": 1050,\n    \"star\": 124,\n    \"like\": 111,\n    \"message\": 12,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-17\",\n    \"owner\": \"Le brother\",\n    \"title\": \"Angular\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png\",\n    \"status\": \"normal\",\n    \"percent\": 79,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599439734333,\n    \"createdAt\": 1599439734333,\n    \"subDescription\": \"Life is like a box of chocolates, the results are often unexpected\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 156853,\n    \"newUser\": 1826,\n    \"star\": 118,\n    \"like\": 136,\n    \"message\": 19,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Na\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-18\",\n    \"owner\": \"Tan Xiaoyi\",\n    \"title\": \"Ant Design\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png\",\n    \"status\": \"active\",\n    \"percent\": 77,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599432534333,\n    \"createdAt\": 1599432534333,\n    \"subDescription\": \"There are so many pubs in the town, but she just walked into my pub\",\n    \"description\": \"In the development process of Zhongtai products, different design specifications and implementation methods will appear, but there are often many similar pages and components, and these similar components will be separated into a set of standard specifications.\",\n    \"activeUser\": 101902,\n    \"newUser\": 1352,\n    \"star\": 131,\n    \"like\": 118,\n    \"message\": 12,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  },\n  {\n    \"id\": \"fake-list-19\",\n    \"owner\": \"Zoni\",\n    \"title\": \"Ant Design Pro\",\n    \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png\",\n    \"cover\": \"https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png\",\n    \"status\": \"exception\",\n    \"percent\": 75,\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png\",\n    \"href\": \"https://ant.design\",\n    \"updatedAt\": 1599425334333,\n    \"createdAt\": 1599425334333,\n    \"subDescription\": \"At that time I only thought about what I wanted, never wanted what I had\",\n    \"description\": \"Different design specifications and implementations in the research and development of the MTD product, but there are often many similar pages and components, which will be detached into a standard specification.\",\n    \"activeUser\": 125791,\n    \"newUser\": 1504,\n    \"star\": 174,\n    \"like\": 195,\n    \"message\": 17,\n    \"content\": \"Paragraph: Ant.design, the design platform of Ant Financial, seamlessly connects to the ecosystem of Ant Financial with minimal workload, and provides experience solutions that span design and development. Ant.design, the design platform of Ant Financial, uses the smallestWorkload, seamless access to Ant Financial's ecology, providing experience solutions that span design and development.\",\n    \"members\": [\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png\",\n        \"name\": \"Qu Lili\",\n        \"id\": \"member1\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png\",\n        \"name\": \"Wang Zhaojun\",\n        \"id\": \"member2\"\n      },\n      {\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png\",\n        \"name\": \"Dong Nana\",\n        \"id\": \"member3\"\n      }\n    ]\n  }\n]"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/menu.json",
    "content": "﻿[\n  {\n    \"path\": \"/chat\",\n    \"name\": \"导入与对话\",\n    \"key\": \"chat\",\n    \"icon\": \"wechat\"\n  }\n]"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/notice.json",
    "content": "[\n  {\n    \"id\": \"xxx1\",\n    \"title\": \"Alipay\",\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png\",\n    \"description\": \"It's an inner thing, which they can't reach and can't reach\",\n    \"updatedAt\": \"2020-08-26T10:21:19.719Z\",\n    \"member\": \"Scientific Moving Brick Group\",\n    \"href\": \"\",\n    \"memberLink\": \"\"\n  },\n  {\n    \"id\": \"xxx2\",\n    \"title\": \"Angular\",\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png\",\n    \"description\": \"Hope is a good thing, maybe the best, good things will not die out\",\n    \"updatedAt\": \"2017-07-24T00:00:00.000Z\",\n    \"member\": \"The whole group is Wu Yanzu\",\n    \"href\": \"\",\n    \"memberLink\": \"\"\n  },\n  {\n    \"id\": \"xxx3\",\n    \"title\": \"Ant Design\",\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png\",\n    \"description\": \"There are so many pubs in the town, but she just walked into my pub\",\n    \"updatedAt\": \"2020-08-26T10:21:19.719Z\",\n    \"member\": \"Second Girl Group\",\n    \"href\": \"\",\n    \"memberLink\": \"\"\n  },\n  {\n    \"id\": \"xxx4\",\n    \"title\": \"Ant Design Pro\",\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png\",\n    \"description\": \"At that time I only thought about what I wanted, never wanted what I had\",\n    \"updatedAt\": \"2017-07-23T00:00:00.000Z\",\n    \"member\": \"Programmer's Daily\",\n    \"href\": \"\",\n    \"memberLink\": \"\"\n  },\n  {\n    \"id\": \"xxx5\",\n    \"title\": \"Bootstrap\",\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png\",\n    \"description\": \"Shiver\",\n    \"updatedAt\": \"2017-07-23T00:00:00.000Z\",\n    \"member\": \"Highly Compelling Design Sky Mission\",\n    \"href\": \"\",\n    \"memberLink\": \"\"\n  },\n  {\n    \"id\": \"xxx6\",\n    \"title\": \"React\",\n    \"logo\": \"https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png\",\n    \"description\": \"Life is like a box of chocolates, the results are often unexpected\",\n    \"updatedAt\": \"2017-07-23T00:00:00.000Z\",\n    \"member\": \"Lie to you to learn computer\",\n    \"href\": \"\",\n    \"memberLink\": \"\"\n  }\n]"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/data/notices.json",
    "content": "[\n    {\n        \"id\": \"000000001\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png\",\n        \"title\": \"You have received 14 new weekly reports\",\n        \"datetime\": \"2017-08-09\",\n        \"type\": \"notification\"\n    },\n    {\n        \"id\": \"000000002\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png\",\n        \"title\":\"The Qu Nini you recommended has passed the third round of interview\",\n        \"datetime\": \"2017-08-08\",\n        \"type\": \"notification\"\n    },\n    {\n        \"id\": \"000000003\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png\",\n        \"title\": \"This template can distinguish multiple notification types\",\n        \"datetime\": \"2017-08-07\",\n        \"read\": true,\n        \"type\": \"notification\"\n    },\n    {\n        \"id\": \"000000004\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png\",\n        \"title\": \"The icon on the left is used to distinguish different types\",\n        \"datetime\": \"2017-08-07\",\n        \"type\": \"notification\"\n    },\n    {\n        \"id\": \"000000005\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png\",\n        \"title\": \"The content should not exceed two lines, and it will be automatically truncated when exceeded\",\n        \"datetime\": \"2017-08-07\",\n        \"type\": \"notification\"\n    },\n    {\n        \"id\": \"000000006\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg\",\n        \"title\": \"Qu Lili commented on you\",\n        \"description\": \"Description information description information description information\",\n        \"datetime\": \"2017-08-07\",\n        \"type\": \"message\",\n        \"clickClose\": true\n    },\n    {\n        \"id\": \"000000007\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg\",\n        \"title\": \"Zhu Fangyou replied to you\",\n        \"description\": \"This template is used to remind who has interacted with you, put the avatar of 'who' on the left\",\n        \"datetime\": \"2017-08-07\",\n        \"type\": \"message\",\n        \"clickClose\": true\n    },\n    {\n        \"id\": \"000000008\",\n        \"avatar\": \"https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg\",\n        \"title\": \"Title\",\n        \"description\": \"This template is used to remind who has interacted with you, put the avatar of 'who' on the left\",\n        \"datetime\": \"2017-08-07\",\n        \"type\": \"message\",\n        \"clickClose\": true\n    },\n    {\n        \"id\": \"000000009\",\n        \"title\": \"Task Name\",\n        \"description\": \"The task needs to be started before 20:00 on 2017-01-12\",\n        \"extra\": \"has not started\",\n        \"status\": \"todo\",\n        \"type\": \"event\"\n    },\n    {\n        \"id\": \"000000010\",\n        \"title\": \"Emergency third-party code changes\",\n        \"description\": \"Guan Lin is submitted to 2017-01-06, you need to complete the code change task before 2017-01-07\",\n        \"extra\": \"Expiring soon\",\n        \"status\": \"urgent\",\n        \"type\": \"event\"\n    },\n    {\n        \"id\": \"000000011\",\n        \"title\": \"Information Security Exam\",\n        \"description\": \"Assign Zhuer to complete the update and release before 2017-01-09\",\n        \"extra\": \"It took 8 days\",\n        \"status\": \"doing\",\n        \"type\": \"event\"\n    },\n    {\n        \"id\": \"000000012\",\n        \"title\": \"ABCD Version release\",\n        \"description\": \"Guanlin submitted on 2017-01-06, the code change task must be completed before 2017-01-07\",\n        \"extra\": \"processing\",\n        \"status\": \"processing\",\n        \"type\": \"event\"\n    }\n]"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/index.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n  <meta name=\"keywords\" content=\"antd,umi,umijs,ant design,脚手架,布局, Ant Design,项目,Pro,admin,控制台,主页,开箱即用,中后台,解决方案,组件库\" />\n  <meta name=\"description\" content=\"An out-of-box UI solution for enterprise applications as a React boilerplate.\" />\n  <meta name=\"description\" content=\"开箱即用的中台前端/设计解决方案。\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0\" />\n  <title>Ant Design Pro Blazor</title>\n  <link rel=\"icon\" href=\"favicon.ico\" type=\"image/x-icon\" />\n  <base href=\"/\" />\n  <link href=\"_content/AntDesign/css/ant-design-blazor.css\" rel=\"stylesheet\" />\n  <link href=\"_content/AntDesign.ProLayout/css/ant-design-pro-layout-blazor.css\" rel=\"stylesheet\" />\n  <link href=\"./css/site.css\" rel=\"stylesheet\" />\n  <link href=\"GraphRag.Net.Web.styles.css\" rel=\"stylesheet\" />\n</head>\n\n<body>\n    <noscript>Out-of-the-box mid-stage front/design solution!</noscript>\n    <div id=\"app\">\n        <style>\n            html,\n            body,\n            #app {\n                height: 100%;\n                margin: 0;\n                padding: 0;\n            }\n\n            #app {\n                background-repeat: no-repeat;\n                background-size: 100% auto;\n            }\n\n            .page-loading-warp {\n                padding: 98px;\n                display: flex;\n                justify-content: center;\n                align-items: center;\n            }\n\n            .ant-spin {\n                -webkit-box-sizing: border-box;\n                box-sizing: border-box;\n                margin: 0;\n                padding: 0;\n                color: rgba(0, 0, 0, 0.65);\n                font-size: 14px;\n                font-variant: tabular-nums;\n                line-height: 1.5;\n                list-style: none;\n                -webkit-font-feature-settings: 'tnum';\n                font-feature-settings: 'tnum';\n                position: absolute;\n                display: none;\n                color: #1890ff;\n                text-align: center;\n                vertical-align: middle;\n                opacity: 0;\n                -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n                transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n                transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n                transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);\n            }\n\n            .ant-spin-spinning {\n                position: static;\n                display: inline-block;\n                opacity: 1;\n            }\n\n            .ant-spin-dot {\n                position: relative;\n                display: inline-block;\n                font-size: 20px;\n                width: 20px;\n                height: 20px;\n            }\n\n            .ant-spin-dot-item {\n                position: absolute;\n                display: block;\n                width: 9px;\n                height: 9px;\n                background-color: #1890ff;\n                border-radius: 100%;\n                -webkit-transform: scale(0.75);\n                -ms-transform: scale(0.75);\n                transform: scale(0.75);\n                -webkit-transform-origin: 50% 50%;\n                -ms-transform-origin: 50% 50%;\n                transform-origin: 50% 50%;\n                opacity: 0.3;\n                -webkit-animation: antSpinMove 1s infinite linear alternate;\n                animation: antSpinMove 1s infinite linear alternate;\n            }\n\n                .ant-spin-dot-item:nth-child(1) {\n                    top: 0;\n                    left: 0;\n                }\n\n                .ant-spin-dot-item:nth-child(2) {\n                    top: 0;\n                    right: 0;\n                    -webkit-animation-delay: 0.4s;\n                    animation-delay: 0.4s;\n                }\n\n                .ant-spin-dot-item:nth-child(3) {\n                    right: 0;\n                    bottom: 0;\n                    -webkit-animation-delay: 0.8s;\n                    animation-delay: 0.8s;\n                }\n\n                .ant-spin-dot-item:nth-child(4) {\n                    bottom: 0;\n                    left: 0;\n                    -webkit-animation-delay: 1.2s;\n                    animation-delay: 1.2s;\n                }\n\n            .ant-spin-dot-spin {\n                -webkit-transform: rotate(45deg);\n                -ms-transform: rotate(45deg);\n                transform: rotate(45deg);\n                -webkit-animation: antRotate 1.2s infinite linear;\n                animation: antRotate 1.2s infinite linear;\n            }\n\n            .ant-spin-lg .ant-spin-dot {\n                font-size: 32px;\n                width: 32px;\n                height: 32px;\n            }\n\n                .ant-spin-lg .ant-spin-dot i {\n                    width: 14px;\n                    height: 14px;\n                }\n\n            @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {\n                .ant-spin-blur {\n                    background: #fff;\n                    opacity: 0.5;\n                }\n            }\n\n            @-webkit-keyframes antSpinMove {\n                to {\n                    opacity: 1;\n                }\n            }\n\n            @keyframes antSpinMove {\n                to {\n                    opacity: 1;\n                }\n            }\n\n            @-webkit-keyframes antRotate {\n                to {\n                    -webkit-transform: rotate(405deg);\n                    transform: rotate(405deg);\n                }\n            }\n\n            @keyframes antRotate {\n                to {\n                    -webkit-transform: rotate(405deg);\n                    transform: rotate(405deg);\n                }\n            }\n        </style>\n        <div style=\"\n          display: flex;\n          justify-content: center;\n          align-items: center;\n          flex-direction: column;\n          min-height: 420px;\n          height: 100%;\n        \">\n            <img src=\"./pro_icon.svg\" alt=\"logo\" width=\"256\" />\n            <div class=\"page-loading-warp\">\n                <div class=\"ant-spin ant-spin-lg ant-spin-spinning\">\n                    <span class=\"ant-spin-dot ant-spin-dot-spin\">\n                        <i class=\"ant-spin-dot-item\"></i><i class=\"ant-spin-dot-item\"></i><i class=\"ant-spin-dot-item\"></i><i class=\"ant-spin-dot-item\"></i>\n                    </span>\n                </div>\n            </div>\n            <div style=\"display: flex; justify-content: center; align-items: center;\">\n                <img src=\"https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg\" width=\"32\"\n                     style=\"margin-right: 8px;\" />\n                GraphRag.Net.Web  <div class=\"loading-progress-text\"></div>\n            </div>\n        </div>\n    </div>\n\n    <script type=\"text/javascript\" src=\"https://unpkg.com/@antv/g2plot@2.4.17/dist/g2plot.min.js\"></script>\n    <script src=\"_content/AntDesign/js/ant-design-blazor.js\"></script>\n    <script src=\"_content/AntDesign.Charts/ant-design-charts-blazor.js\"></script>\n    <script src=\"_framework/blazor.webassembly.js\"></script>\n\n    <script src=\"./js/vue2.js\"></script>\n    <script src=\"./js/screenfull.min.js\"></script>\n    <script src=\"./js/html2canvas.min.js\"></script>\n    <script src=\"./js/relation-graph.umd.js\"></script>\n</body>\n\n</html>"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/js/relation-graph.umd.js",
    "content": "(function(){ try {var elementStyle = document.createElement('style'); elementStyle.appendChild(document.createTextNode(\"@charset \\\"UTF-8\\\";.c-mini-graph[data-v-46ea246f]{height:100px;width:100px;position:absolute;margin-left:60px;margin-top:100px;z-index:999}.c-fixedLayout[data-v-46ea246f]{position:fixed;top:100px}.c-mini-canvas[data-v-46ea246f]{background-color:#aacbff;border:#7BA8FF solid 1px;opacity:.8;position:relative}.c-mini-view[data-v-46ea246f]{background-color:#f5a565;border:#C03639 solid 1px;opacity:.5;color:#fff;font-size:14px;text-align:center;display:flex;align-items:center;justify-content:center;position:absolute}.c-mini-node[data-v-46ea246f]{position:absolute;width:2px;height:2px;background-color:#000;border-radius:1px}.rg-icon[data-v-412be0f2]{width:16px;height:16px;vertical-align:-3px;fill:currentColor;overflow:hidden}.c-mini-toolbar[data-v-412be0f2]{width:44px;position:absolute;margin-top:170px;margin-right:10px;z-index:999;border:#bbbbbb solid 1px;background-color:#fff;box-shadow:0 0 8px #ccc;box-sizing:border-box}.c-fixedLayout[data-v-412be0f2]{position:fixed;top:100px}.c-mb-button[data-v-412be0f2]{height:44px;width:42px;margin-top:0;background-color:#fff;border-top:#efefef solid 1px;opacity:1;text-align:center;padding-top:3px;cursor:pointer;color:#999;font-size:18px;float:left;box-sizing:border-box;line-height:21px}.c-mb-button .c-mb-text[data-v-412be0f2]{display:inline-block;height:14px;width:42px;font-size:12px;line-height:12px;margin-top:24px;margin-left:-28px;position:absolute;color:#262626}.c-mb-button-on[data-v-412be0f2]{background-color:#2e74b5;border-top:#2E4E8F solid 1px;color:#fff}.c-mb-button[data-v-412be0f2]:hover{background-color:#2e4e8f;border-top:#2E4E8F solid 1px;color:#fff}.c-mb-button:hover .c-mb-text[data-v-412be0f2],.c-mb-button-on .c-mb-text[data-v-412be0f2]{color:#fff}.c-mb-button .c-mb-child-panel[data-v-412be0f2]{height:46px;position:absolute;margin-top:-26px;background-color:#fff;display:none;border:#bbbbbb solid 1px;box-shadow:0 0 8px #ccc;box-sizing:border-box}.c-mb-button:hover .c-mb-child-panel[data-v-412be0f2]{display:block}.c-mb-button .c-mb-button[data-v-412be0f2]{height:44px;width:42px;margin:0;border:none}.c-mb-button-c .c-mb-text[data-v-412be0f2]{color:#262626!important}.c-mb-button-c:hover .c-mb-text[data-v-412be0f2],.c-mb-button-on .c-mb-text[data-v-412be0f2]{color:#fff!important}.c-loading-icon[data-v-412be0f2]{animation:turn-data-v-412be0f2 1s linear infinite}@keyframes turn-data-v-412be0f2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.relation-graph{box-sizing:border-box;position:relative}.relation-graph .rel-map svg.rg-icon{height:100%;width:100%}.relation-graph .rel-background{position:absolute;left:0;top:0;width:100%;height:100%;z-index:0}.relation-graph .rel-watermark{position:absolute;z-index:1200;overflow:visible;min-height:100px;min-width:100px;height:var(--mv-height);width:var(--mv-width);box-sizing:border-box}.relation-graph .rel-watermark div{box-sizing:border-box}.relation-graph .rel-watermark.rel-watermark-top{left:calc((100% - var(--mv-width)) / 2);top:10px}.relation-graph .rel-watermark.rel-watermark-bottom{left:calc((100% - var(--mv-width)) / 2);bottom:10px}.relation-graph .rel-watermark.rel-watermark-left{left:10px;top:calc((100% - var(--mv-height)) / 2)}.relation-graph .rel-watermark.rel-watermark-right{right:10px;top:calc((100% - var(--mv-height)) / 2)}.relation-graph .rel-watermark.rel-watermark-tl{left:10px;top:10px}.relation-graph .rel-watermark.rel-watermark-tr{right:10px;top:10px}.relation-graph .rel-watermark.rel-watermark-bl{left:10px;bottom:10px}.relation-graph .rel-watermark.rel-watermark-br{right:10px;bottom:10px}.relation-graph .rel-lines-svg{overflow:visible;width:10px;height:10px;position:absolute;left:0;top:0}.relation-graph .rel-linediv{overflow:visible;position:absolute;z-index:40;width:100%;top:0;left:0;--stroke: url(#lineStyle);--markerEnd: url(#arrow-default);--markerStart: url(#start-arrow-default);--markerEndChecked: url(#arrow-checked);--markerStartChecked: url(#start-arrow-checked);pointer-events:none}.relation-graph .rel-linediv svg{overflow:visible}.relation-graph .rel-linediv-el-lines{z-index:80;pointer-events:none}.relation-graph .rel-lines-svg-el-lines{overflow:visible;width:10px;height:10px;position:absolute;left:0;top:0}.relation-graph .rel-link-peel{pointer-events:auto}.relation-graph .rel-map{background-color:#fff;overflow:hidden;cursor:default;user-select:none;opacity:.01;transition:none}.relation-graph .rel-map-ready{opacity:1;transition:opacity .5s ease}.relation-graph .rel-map-background-norepeat{background-repeat:no-repeat;background-position:right bottom}.relation-graph .rel-nodediv-for-webkit{position:absolute;width:100%;top:0;left:0;z-index:50}.relation-graph .rel-map-canvas{position:relative;top:0;left:0;border:0px;z-index:3;overflow:visible}.relation-graph .rel-canvas-slot{overflow:visible;position:absolute;margin-top:0;margin-left:0}.relation-graph .rel-canvas-slot-behind{z-index:30;overflow:visible}.relation-graph .rel-canvas-slot-above{z-index:70;overflow:visible}.relation-graph .rel-map ::v-deep img{-webkit-user-drag:none;-webkit-user-select:none}.relation-graph .c-rg-line-text{fill:#888;font-size:12px;paint-order:stroke}.relation-graph .c-rg-line-text-checked{stroke:#fd8b374d;stroke-width:2}.relation-graph .c-rg-line{fill-rule:nonzero;stroke-linecap:round}.relation-graph .c-rg-line-bg{stroke:#fff;opacity:.01;fill:none;fill-rule:nonzero;stroke-linecap:round}.relation-graph .rg-line-dashtype-1{stroke-dasharray:2,2,2;stroke-dashoffset:3px;stroke-linecap:butt;stroke-linejoin:bevel}.relation-graph .rg-line-dashtype-2{stroke-dasharray:5,5,5;stroke-dashoffset:3px;stroke-linecap:butt;stroke-linejoin:bevel}.relation-graph .rg-line-dashtype-3{stroke-dasharray:9,9,9;stroke-dashoffset:3px;stroke-linecap:butt;stroke-linejoin:bevel}.relation-graph .rg-line-dashtype-4{stroke-dasharray:5,5,15;stroke-dashoffset:3px;stroke-linecap:butt;stroke-linejoin:bevel}@keyframes ACTRGLineChecked{0%{stroke-dashoffset:352px;stroke-dasharray:5,5,5}50%{stroke-dasharray:5,5,5;stroke-dashoffset:3px}to{stroke-dashoffset:352px;stroke-dasharray:5,5,5}}@keyframes rg-line-anm2{0%{stroke-dashoffset:0;stroke-dasharray:4,4,4}to{stroke-dashoffset:10px;stroke-dasharray:20,20,20}}@keyframes rg-line-anm3{0%{stroke-opacity:1}50%{stroke-opacity:.2}to{stroke-opacity:1}}@keyframes rg-line-anm4{0%{stroke-dasharray:0,100%}to{stroke-dasharray:100%,0}}.relation-graph .rg-line-anm-1{animation:ACTRGLineChecked 10s infinite}.relation-graph .rg-line-anm-2{animation:rg-line-anm2 3s infinite}.relation-graph .rg-line-anm-3{animation:rg-line-anm3 1s infinite}.relation-graph .rg-line-anm-4{animation:rg-line-anm4 3s infinite}.relation-graph .c-rg-line-checked{z-index:100}.relation-graph .c-rg-line-checked-bg{stroke:#fd8b374d;stroke-linecap:round}@keyframes deform1{0%{stroke-dashoffset:0}to{stroke-dashoffset:100%}}.relation-graph .rg-icon{width:19px;height:19px;vertical-align:0px;fill:currentColor;overflow:hidden}.relation-graph .el-icon-remove,.relation-graph .el-icon-circle-plus{cursor:pointer}.relation-graph .relation-graph-node{position:absolute}.relation-graph .rel-node-peel{padding:8px;position:absolute;font-size:14px;box-sizing:border-box}.relation-graph .rel-node-peel-checked{z-index:100}.relation-graph .rel-node{text-align:center;border-style:solid;border-width:0px;box-sizing:border-box}.relation-graph .rg-center-items{display:flex;place-items:center}.relation-graph .rel-node-shape-0{width:80px;height:80px;border-radius:50%}.relation-graph .rel-node-shape-1{border-radius:5px}.relation-graph img,.relation-graph svg,.relation-graph video,.relation-graph canvas,.relation-graph audio,.relation-graph iframe,.relation-graph embed,.relation-graph object{display:unset;vertical-align:unset}.relation-graph .c-node-text{height:100%;width:100%;display:flex;align-items:center;justify-content:center;box-sizing:border-box;padding:0}.relation-graph .rel-node-shape-1 .c-node-text{padding-left:5px;padding-right:5px}.relation-graph .rel-node-type-button{border-radius:25px;color:#00f;cursor:pointer}.relation-graph .rel-node-checked{transition:background-color .2s ease,outline .2s ease,color .2s ease,-webkit-box-shadow .2s ease;box-shadow:0 0 0 8px #fd8b374d}.relation-graph .rel-node-dragging{z-index:400}.relation-graph .rel-node-selected{box-shadow:0 0 0 2px #d603f6cc;border-radius:5px;z-index:400}.relation-graph .rel-editing-referline{position:absolute;z-index:999;pointer-events:none;width:100%;height:100%;left:0;top:0}.relation-graph .rel-editing-referline .rel-editing-referline-v{width:16px;height:100%;position:absolute;top:0;display:flex;place-items:center;justify-content:center;transform:translate(-8px);border-top:rgb(214,3,246) solid 2px;border-bottom:rgb(214,3,246) solid 2px}.relation-graph .rel-editing-referline .rel-editing-referline-v .referline{width:1px;height:100%;border-left:rgb(214,3,246) dashed 2px;display:flex;place-items:center;justify-content:center;font-size:12px}.relation-graph .rel-editing-referline .rel-editing-referline-v .referline>div{width:70px;height:20px;line-height:20px;background-color:#d603f6;text-align:center;border-radius:5px;padding-left:5px;padding-right:5px;color:#fff}.relation-graph .rel-editing-referline .rel-editing-referline-h{height:16px;width:100%;position:absolute;left:0;display:flex;place-items:center;justify-content:center;transform:translateY(-8px);border-left:rgb(214,3,246) solid 2px;border-right:rgb(214,3,246) solid 2px}.relation-graph .rel-editing-referline .rel-editing-referline-h .referline{height:1px;width:100%;border-top:rgb(214,3,246) dashed 2px;display:flex;place-items:center;justify-content:center;font-size:12px}.relation-graph .rel-editing-referline .rel-editing-referline-h .referline>div{height:20px;line-height:20px;width:70px;background-color:#d603f6;text-align:center;border-radius:5px;color:#fff}.relation-graph .rel-editing-line-ctrl{position:absolute;z-index:500;pointer-events:none;width:100%;height:100%;left:0;top:0}.relation-graph .rel-editing-line-ctrl .rel-line-ctrl-dot{pointer-events:auto;width:10px;height:10px;background-color:#d603f6;box-shadow:0 0 0 1px #700281;position:absolute;border-radius:50%;cursor:move;z-index:1}.relation-graph .rel-editing-line-ctrl .rel-line-ctrl-text{pointer-events:auto;background-color:#d603f6;box-shadow:0 0 0 1px #700281;position:absolute;border-radius:3px;cursor:move;z-index:1;font-size:12px;line-height:12px;white-space:nowrap;color:#fff;display:flex;place-items:center;justify-content:center;box-sizing:border-box}.relation-graph .rel-editing-line-ctrl .rel-line-ctrl-text .rel-line-text-input{white-space:nowrap;pointer-events:auto;background-color:transparent;color:#d603f6;border-radius:3px;width:100%;padding-left:5px;padding-right:5px;height:100%;font-size:12px;line-height:100%;text-align:left;border-width:0px;box-sizing:border-box}.relation-graph .rel-editing-line-ctrl .rel-line-ctrl-text-editing{background-color:#faf191}.relation-graph .rel-editing-ctrl,.relation-graph .rel-editing-connect-ctrl{position:absolute;z-index:500;box-shadow:0 0 0 2px #d603f6cc;border-radius:0;pointer-events:none}.relation-graph .rel-editing-bar{user-select:none;pointer-events:none;position:absolute;border-radius:5px;padding:3px;box-sizing:border-box;display:flex;place-items:center;justify-content:center;flex-wrap:wrap;gap:5px}.relation-graph .rel-editing-bar .rel-gee-icon{background-color:#d603f680;pointer-events:auto;min-width:20px;min-height:20px;border-radius:5px;box-sizing:border-box;display:flex;place-items:center;justify-content:center;cursor:pointer}.relation-graph .rel-editing-bar .rel-gee-icon:hover{background-color:#d603f6;color:#fff}.relation-graph .rel-editing-line-handle{pointer-events:auto}.relation-graph .rel-editing-bar-top{width:110px;height:30px;left:calc((100% - 110px)/2);top:-40px}.relation-graph .rel-editing-bar-bottom{width:110px;height:30px;left:calc((100% - 110px)/2);bottom:-40px}.relation-graph .rel-editing-bar-left{width:30px;height:110px;left:-40px;top:calc((100% - 110px)/2)}.relation-graph .rel-editing-bar-right{width:30px;height:110px;right:-40px;top:calc((100% - 110px)/2)}.relation-graph .rel-editing-bar-tl{width:30px;height:30px;right:calc(100% + 10px);top:-40px}.relation-graph .rel-editing-bar-tr{width:30px;height:30px;left:calc(100% + 10px);top:-40px}.relation-graph .rel-editing-bar-bl{width:30px;height:30px;right:calc(100% + 10px);bottom:-40px}.relation-graph .rel-editing-bar-br{width:30px;height:30px;left:calc(100% + 10px);bottom:-40px}.relation-graph .rel-resize-ctl{position:relative;height:100%;width:100%}.relation-graph .rel-resize-ctl .rel-resize-ctl-handler{pointer-events:auto;width:10px;height:10px;background-color:#d603f6;border:#460172 solid 1px;position:absolute;border-radius:50%}.relation-graph .rel-resize-ctl .rel-resize-ctl-tl{cursor:nwse-resize;left:-7px;top:-7px}.relation-graph .rel-resize-ctl .rel-resize-ctl-tr{cursor:nesw-resize;right:-7px;top:-7px}.relation-graph .rel-resize-ctl .rel-resize-ctl-bl{cursor:nesw-resize;left:-7px;bottom:-7px}.relation-graph .rel-resize-ctl .rel-resize-ctl-br{cursor:nwse-resize;right:-7px;bottom:-7px}.relation-graph .rel-resize-ctl .rel-resize-ctl-t{cursor:n-resize;top:-7px;left:calc((100% - 12px)/2)}.relation-graph .rel-resize-ctl .rel-resize-ctl-b{cursor:s-resize;bottom:-7px;left:calc((100% - 12px)/2)}.relation-graph .rel-resize-ctl .rel-resize-ctl-l{cursor:w-resize;left:-7px;top:calc((100% - 12px)/2)}.relation-graph .rel-resize-ctl .rel-resize-ctl-r{cursor:e-resize;right:-7px;top:calc((100% - 12px)/2)}.relation-graph .rel-editing-connect-ctrl{position:absolute;z-index:1400;box-shadow:0 0 0 2px #ef6705cc;border-radius:0;pointer-events:none}.relation-graph .rel-connect-ctl-handler{pointer-events:auto;background-color:#ef6705;border:#723001 solid 1px;position:absolute;border-radius:3px;z-index:20}.relation-graph .rel-connect-ctl-handler:hover{background-color:#fff}.relation-graph .rel-connect-ctl-center{width:20px;height:20px;border-radius:50%;cursor:cell;top:calc((100% - 22px)/2);left:calc((100% - 22px)/2)}.relation-graph .rel-connect-ctl-t{width:20px;height:10px;cursor:cell;top:-7px;left:calc((100% - 22px)/2)}.relation-graph .rel-connect-ctl-b{width:20px;height:10px;cursor:cell;bottom:-7px;left:calc((100% - 22px)/2)}.relation-graph .rel-connect-ctl-l{width:10px;height:20px;cursor:cell;left:-7px;top:calc((100% - 22px)/2)}.relation-graph .rel-connect-ctl-r{width:10px;height:20px;cursor:cell;right:-7px;top:calc((100% - 22px)/2)}.relation-graph .rel-connect-ctl-lr{width:100%;height:20px;cursor:cell;right:0;top:calc((100% - 22px)/2);z-index:11;opacity:.7}.relation-graph .rel-connect-ctl-tb{width:20px;height:100%;cursor:cell;top:0;left:calc((100% - 22px)/2);z-index:10;opacity:.7}.relation-graph .rel-miniview{position:absolute;overflow:hidden;z-index:1100;min-height:100px;min-width:100px;height:var(--mv-height);width:var(--mv-width);border:#cccccc solid 1px;border-radius:5px;box-shadow:1px 1px 4px 1px #cccccc8c;display:flex;place-items:center;justify-content:center;background-color:#fff}.relation-graph .rel-miniview canvas{background-color:#fff;border:#cccccc solid 1px;opacity:.7}.relation-graph .rel-miniview .rel-mv-canvas-reset{cursor:pointer}.relation-graph .rel-miniview .rel-mv-canvas-reset:hover{background-color:#bbf54794}.relation-graph .rel-miniview .rel-mv-visible-area{z-index:2;position:absolute;border:rgb(214,3,246) solid 1px;cursor:move;background-color:#d603f64d}.relation-graph .rel-miniview.rel-miniview-top{left:calc((100% - var(--mv-width)) / 2);top:10px}.relation-graph .rel-miniview.rel-miniview-bottom{left:calc((100% - var(--mv-width)) / 2);bottom:10px}.relation-graph .rel-miniview.rel-miniview-left{left:10px;top:calc((100% - var(--mv-height)) / 2)}.relation-graph .rel-miniview.rel-miniview-right{right:10px;top:calc((100% - var(--mv-height)) / 2)}.relation-graph .rel-miniview.rel-miniview-tl{left:10px;top:10px}.relation-graph .rel-miniview.rel-miniview-tr{right:10px;top:10px}.relation-graph .rel-miniview.rel-miniview-bl{left:10px;bottom:10px}.relation-graph .rel-miniview.rel-miniview-br{right:10px;bottom:10px}.relation-graph .rel-node-flashing{animation:ACTRGNodeFlashing 2s infinite}.relation-graph .rel-node-vtree-2{transform-origin:0 0;transform:rotate(30deg) translate(0)}.relation-graph .rel-node-vtree{width:130px;height:45px;text-align:left}.relation-graph .c-btn-open-close{position:absolute;height:100%;width:19px;display:flex;align-items:center;justify-content:center;user-select:none;pointer-events:none;cursor:pointer}.relation-graph .c-btn-open-close span{width:19px;height:19px;display:inline-block;text-align:center;border-radius:15px;color:#fff;cursor:pointer;font-size:19px;line-height:16px;background-size:100% 100%;pointer-events:all}.relation-graph .c-expanded{background-image:url(data:image/svg+xml;%20charset=utf8,%3Csvg%20t=%221606310217820%22%20viewBox=%220%200%201024%201024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20p-id=%223373%22%20width=%2232%22%20height=%2232%22%3E%3Cpath%20d=%22M853.333333%20480H544V170.666667c0-17.066667-14.933333-32-32-32s-32%2014.933333-32%2032v309.333333H170.666667c-17.066667%200-32%2014.933333-32%2032s14.933333%2032%2032%2032h309.333333V853.333333c0%2017.066667%2014.933333%2032%2032%2032s32-14.933333%2032-32V544H853.333333c17.066667%200%2032-14.933333%2032-32s-14.933333-32-32-32z%22%20p-id=%223374%22%20fill=%22white%22%3E%3C/path%3E%3C/svg%3E)}.relation-graph .c-collapsed{background-image:url(data:image/svg+xml;%20charset=utf8,%3Csvg%20t=%221606310454619%22%20class=%22icon%22%20viewBox=%220%200%201024%201024%22%20version=%221.1%22%20xmlns=%22http://www.w3.org/2000/svg%22%20p-id=%223662%22%20width=%22128%22%20height=%22128%22%3E%3Cpath%20d=%22M853.333333%20554.666667H170.666667c-23.466667%200-42.666667-19.2-42.666667-42.666667s19.2-42.666667%2042.666667-42.666667h682.666666c23.466667%200%2042.666667%2019.2%2042.666667%2042.666667s-19.2%2042.666667-42.666667%2042.666667z%22%20p-id=%223663%22%20fill=%22white%22%3E%3C/path%3E%3C/svg%3E)}.relation-graph .c-expand-positon-left{margin-top:-8px;margin-left:-25px}.relation-graph .c-expand-positon-right{height:100%;width:100%;justify-content:center}.relation-graph .c-expand-positon-right span{margin-top:-18px;margin-right:-18px;margin-left:100%}.relation-graph .c-expand-positon-bottom{height:100%;width:100%;margin-top:7px;margin-left:-8px;align-items:flex-end;justify-content:center}.relation-graph .c-expand-positon-top{height:18px;width:100%;margin-top:-20px;margin-left:-6px;align-items:flex-end;justify-content:center}@keyframes ACTRGNodeInit{0%{box-shadow:0 0 15px #fd8b37}50%{box-shadow:0 0 1px #2e4e8f}to{box-shadow:0 0 15px #fd8b37}to{box-shadow:0 0 15px #fd8b37}}@keyframes ACTRGNodeFlashing{0%{box-shadow:0 0 15px #fd8b37}40%{box-shadow:0 0 1px #2e4e8f}70%{box-shadow:0 0 8px #fd8b37}to{box-shadow:0 0 #fd8b37}}.relation-graph .rel-diy-node{padding:0}.relation-graph .c-setting-panel{--height: 300px;--width: 200px;width:300px;height:200px;position:absolute;margin-left:10px;margin-top:5px;font-size:12px;color:#3a5bb2;padding:60px 10px 10px;overflow:hidden;box-shadow:0 0 5px #999;border-radius:5px;z-index:1000;background-color:#fff;border:#999999 solid 1px}.relation-graph .c-setting-panel-button{height:35px;width:35px;font-size:8px;line-height:35px;text-align:center;border-radius:50%;position:absolute;margin-left:25px;margin-top:20px;background-color:#3a5bb2;color:#fff;cursor:pointer;z-index:1001;box-shadow:0 0 8px #999}.relation-graph .c-setting-panel-button:hover{box-shadow:0 0 20px #ffa20a;border:#ffffff solid 1px;color:#ffa20a;-moz-transform:rotate(-89deg) translateX(-190px);animation-timing-function:linear;animation:flashButton 2s infinite}.relation-graph .c-fixedLayout{position:fixed;top:125px}@keyframes flashButton{0%{box-shadow:0 0 8px #2e4e8f}30%{box-shadow:0 0 20px #ffa20a}to{box-shadow:0 0 8px #2e4e8f}}.relation-graph .c-debug-tools-row{text-align:left}.relation-graph .rel-operate{position:absolute;top:0;left:0;width:100%;height:100%;z-index:180}.relation-graph .rel-operate .rel-node{cursor:move}.relation-graph .rel-selection{position:absolute;background-color:#d603f633;border:rgb(214,3,246) solid 1px}.relation-graph .rel-graph-loading{position:absolute;z-index:1600;left:0;top:0;height:100%;width:100%;background-color:#fff}.relation-graph .rel-graph-loading .c-graph-loading-icon{width:16px;height:16px;vertical-align:-3px;fill:currentColor;overflow:hidden;animation:turn 1s linear infinite}.relation-graph .rel-graph-loading .rel-graph-loading-message{position:absolute;width:200px;height:30px;line-height:30px;text-align:center;left:calc((100% - 200px)/2);top:calc((100% - 30px)/2);border-radius:5px;background-color:#00000080;color:#fff;display:flex;place-items:center;justify-content:center;gap:8px}.relation-graph .rel-graph-loading-hide{display:none}@keyframes slowHide{0%{opacity:1}to{opacity:0;display:none}}.relation-graph .rel-easy-view{overflow:visible;height:100%;width:100%;background-color:transparent;position:absolute;left:0;top:0}.relation-graph .rel-easy-view canvas{opacity:0;width:100%;height:100%}.relation-graph .rel-easy-view-active canvas{opacity:1}.relation-graph .rel-toolbar{position:absolute;z-index:300;background-color:#dcdcdc33;color:#999;box-shadow:0 0 2px #ccc;box-sizing:border-box;border-radius:5px;padding:3px}.relation-graph .rel-toolbar .rg-icon{flex-grow:1;width:16px;height:16px;fill:currentColor;overflow:hidden}.relation-graph .rel-toolbar .c-mb-button svg{margin:auto}.relation-graph .rel-toolbar .c-mb-button-on{color:#2e74b5}.relation-graph .rel-toolbar .c-mb-button:hover{background-color:#dcdcdc80}.relation-graph .rel-toolbar .c-loading-icon{animation:turn 1s linear infinite}@keyframes turn{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.relation-graph .rel-toolbar .c-current-zoom{margin-top:0;height:20px;color:#262626;font-size:10px;text-align:center;line-height:20px;border-radius:3px;cursor:pointer}.relation-graph .rel-toolbar .c-current-zoom:hover{background-color:#dcdcdc80}.relation-graph .rel-toolbar .c-mb-button{height:40px;margin-top:0;opacity:1;text-align:center;cursor:pointer;font-size:18px;box-sizing:border-box;display:flex;align-items:center;justify-items:center;border-radius:3px}.relation-graph .rel-toolbar-v{width:45px}.relation-graph .rel-toolbar-h{height:45px}.relation-graph .rel-toolbar-h .c-mb-button{width:40px;height:100%;float:left}.relation-graph .rel-toolbar-h .c-current-zoom{width:40px;height:100%;float:left;line-height:40px}.relation-graph .rel-toolbar-h-right{right:15px}.relation-graph .rel-toolbar-h-left{left:15px}.relation-graph .rel-toolbar-h-center{left:calc((100% - 260px)/2)}.relation-graph .rel-toolbar-v-top{top:15px}.relation-graph .rel-toolbar-v-bottom{bottom:15px}.relation-graph .rel-toolbar-v-center{top:calc((100% - 260px)/2)}.relation-graph .rel-xs-toolbar{background-color:#fff;color:#333}.relation-graph .rel-xs-toolbar .c-current-zoom{margin-top:0;height:20px;color:#262626;font-size:10px;border-radius:3px;cursor:pointer}.relation-graph .rel-xs-toolbar .c-current-zoom:hover{background-color:#dcdcdc80}.relation-graph .rel-xs-toolbar .c-mb-button{height:25px}.relation-graph .rel-xs-toolbar.rel-toolbar-v{width:31px}.relation-graph .rel-xs-toolbar.rel-toolbar-h{height:31px}.relation-graph .rel-xs-toolbar.rel-toolbar-h .c-mb-button{width:25px;height:100%;float:left}.relation-graph .rel-xs-toolbar.rel-toolbar-h .c-current-zoom{width:45px;height:100%;float:left;line-height:25px}.relation-graph .rel-xs-toolbar.rel-toolbar-h-right{right:10px}.relation-graph .rel-xs-toolbar.rel-toolbar-h-left{left:10px}.relation-graph .rel-xs-toolbar.rel-toolbar-h-center{left:calc((100% - 160px)/2)}.relation-graph .rel-xs-toolbar.rel-toolbar-v-top{top:10px}.relation-graph .rel-xs-toolbar.rel-toolbar-v-bottom{bottom:10px}.relation-graph .rel-xs-toolbar.rel-toolbar-v-center{top:calc((100% - 160px)/2)}\")); document.head.appendChild(elementStyle);} catch(e) {console.error('vite-plugin-css-injected-by-js', e);} })();(function(P,I){typeof exports==\"object\"&&typeof module!=\"undefined\"?I(exports,require(\"vue\"),require(\"screenfull\"),require(\"html2canvas\")):typeof define==\"function\"&&define.amd?define([\"exports\",\"vue\",\"screenfull\",\"html2canvas\"],I):(P=typeof globalThis!=\"undefined\"?globalThis:P||self,I(P.RelationGraph={},P.Vue,P.screenfull,P.html2canvas))})(this,function(P,I,j,gt){\"use strict\";var Fs=Object.defineProperty,Us=Object.defineProperties;var js=Object.getOwnPropertyDescriptors;var Oe=Object.getOwnPropertySymbols;var Xs=Object.prototype.hasOwnProperty,Ys=Object.prototype.propertyIsEnumerable;var Rt=(P,I,j)=>I in P?Fs(P,I,{enumerable:!0,configurable:!0,writable:!0,value:j}):P[I]=j,Re=(P,I)=>{for(var j in I||(I={}))Xs.call(I,j)&&Rt(P,j,I[j]);if(Oe)for(var j of Oe(I))Ys.call(I,j)&&Rt(P,j,I[j]);return P},De=(P,I)=>Us(P,js(I));var v=(P,I,j)=>(Rt(P,typeof I!=\"symbol\"?I+\"\":I,j),j);var C=(P,I,j)=>new Promise((gt,lt)=>{var _t=Y=>{try{ut(j.next(Y))}catch(pt){lt(pt)}},ot=Y=>{try{ut(j.throw(Y))}catch(pt){lt(pt)}},ut=Y=>Y.done?gt(Y.value):Promise.resolve(Y.value).then(_t,ot);ut((j=j.apply(P,I)).next())});const lt=e=>e&&typeof e==\"object\"&&\"default\"in e?e:{default:e};function _t(e){if(e&&e.__esModule)return e;const s=Object.create(null,{[Symbol.toStringTag]:{value:\"Module\"}});if(e){for(const t in e)if(t!==\"default\"){const o=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(s,t,o.get?o:{enumerable:!0,get:()=>e[t]})}}return s.default=e,Object.freeze(s)}const ot=lt(I),ut=_t(j),Y=lt(j),pt=_t(gt),Dt=lt(gt),Vt=\"2.2.2\";(function(e){var s,t,o,n,i,a,l='<svg><symbol id=\"icon-iconset0444\" viewBox=\"0 0 1024 1024\"><path d=\"M960 682.666667l-106.666667 0C844.8 569.6 763.733333 42.666667 64 42.666667 51.2 42.666667 42.666667 51.2 42.666667 64c0 12.8 8.533333 21.333333 21.333333 21.333333 219.733333 0 377.6 106.666667 465.066667 315.733333 51.2 123.733333 64 236.8 66.133333 281.6L490.666667 682.666667c-12.8 0-21.333333 8.533333-21.333333 21.333333 0 6.4 2.133333 10.666667 6.4 14.933333l234.666667 256c4.266667 4.266667 8.533333 6.4 14.933333 6.4 6.4 0 10.666667-2.133333 14.933333-6.4l234.666667-256c4.266667-4.266667 6.4-8.533333 6.4-14.933333C981.333333 691.2 972.8 682.666667 960 682.666667zM725.333333 928 539.733333 725.333333 618.666667 725.333333c12.8 0 21.333333-8.533333 21.333333-21.333333l0-21.333333c-4.266667-87.466667-38.4-396.8-273.066667-554.666667C755.2 251.733333 804.266667 588.8 810.666667 682.666667l0 21.333333c0 12.8 8.533333 21.333333 21.333333 21.333333l78.933333 0L725.333333 928z\"  ></path></symbol><symbol id=\"icon-iconset0445\" viewBox=\"0 0 1024 1024\"><path d=\"M974.933333 305.066667l-234.666667-256C736 44.8 731.733333 42.666667 725.333333 42.666667c-6.4 0-10.666667 2.133333-14.933333 6.4l-234.666667 256C471.466667 309.333333 469.333333 313.6 469.333333 320c0 12.8 8.533333 21.333333 21.333333 21.333333l104.533333 0c-2.133333 44.8-14.933333 157.866667-66.133333 281.6C441.6 832 283.733333 938.666667 64 938.666667c-12.8 0-21.333333 8.533333-21.333333 21.333333 0 12.8 8.533333 21.333333 21.333333 21.333333 699.733333 0 780.8-526.933333 789.333333-640l106.666667 0c12.8 0 21.333333-8.533333 21.333333-21.333333C981.333333 313.6 979.2 309.333333 974.933333 305.066667zM832 298.666667c-12.8 0-21.333333 8.533333-21.333333 21.333333l0 21.333333c-6.4 93.866667-55.466667 430.933333-443.733333 554.666667 234.666667-157.866667 268.8-467.2 273.066667-554.666667l0-21.333333c0-12.8-8.533333-21.333333-21.333333-21.333333l-78.933333 0L725.333333 96l185.6 202.666667L832 298.666667z\"  ></path></symbol><symbol id=\"icon-yuanquanfenxiang\" viewBox=\"0 0 1024 1024\"><path d=\"M751.148705 578.773799c-61.987796 0-117.066229 30.121018-151.388942 76.488045L398.287145 536.382317c1.991354-10.171664 3.046383-20.673855 3.046383-31.419594 0-18.776645-3.196809-36.817534-9.058306-53.621245l193.486736-107.492176c31.949666 58.566884 94.104261 98.391914 165.386748 98.391914 103.803157 0 188.254571-84.450391 188.254571-188.254571S854.951863 65.73105 751.148705 65.73105c-103.804181 0-188.255595 84.450391-188.255595 188.254571 0 14.246469 1.600451 28.125571 4.613064 41.4746L368.032074 406.279167c-29.841655-39.193651-76.976162-64.544015-129.927141-64.544015-90.004897 0-163.228595 73.223698-163.228595 163.228595 0 90.003873 73.223698 163.228595 163.228595 163.228595 60.882626 0 114.078175-33.510208 142.134161-83.049484L575.173808 700.16452c-7.925507 20.788465-12.280698 43.325761-12.280698 66.86385 0 103.803157 84.450391 188.254571 188.255595 188.254571 103.803157 0 188.254571-84.450391 188.254571-188.254571S854.951863 578.773799 751.148705 578.773799zM751.148705 116.89636c75.590606 0 137.089261 61.498656 137.089261 137.089261s-61.498656 137.089261-137.089261 137.089261c-75.591629 0-137.090285-61.498656-137.090285-137.089261S675.557076 116.89636 751.148705 116.89636zM238.105956 617.026008c-61.791321 0-112.063285-50.27094-112.063285-112.063285 0-61.791321 50.27094-112.063285 112.063285-112.063285s112.063285 50.27094 112.063285 112.063285C350.168218 566.755068 299.897278 617.026008 238.105956 617.026008zM751.148705 904.117632c-75.591629 0-137.090285-61.498656-137.090285-137.089261s61.498656-137.089261 137.090285-137.089261c75.590606 0 137.089261 61.498656 137.089261 137.089261S826.739311 904.117632 751.148705 904.117632z\"  ></path></symbol><symbol id=\"icon-hj2\" viewBox=\"0 0 1024 1024\"><path d=\"M963.66 256.607c0-0.244 0-0.607-0.126-0.851 0-0.369 0-0.614-0.119-0.978 0-0.369-0.119-0.733-0.119-1.104 0-0.244 0-0.487-0.126-0.725 0-0.369-0.119-0.859-0.244-1.222 0-0.244-0.119-0.369-0.119-0.613-0.126-0.365-0.126-0.852-0.245-1.216 0-0.244-0.126-0.369-0.126-0.613-0.119-0.365-0.244-0.734-0.364-1.222-0.126-0.244-0.126-0.49-0.244-0.609l-0.369-1.095c-0.119-0.245-0.119-0.49-0.244-0.734-0.121-0.369-0.245-0.613-0.365-0.978-0.126-0.244-0.244-0.613-0.369-0.851-0.119-0.244-0.238-0.613-0.364-0.859-0.119-0.364-0.244-0.607-0.364-0.977l-0.371-0.734c-0.119-0.364-0.364-0.725-0.487-0.971-0.119-0.245-0.244-0.371-0.364-0.614-0.244-0.364-0.369-0.733-0.614-1.097-0.119-0.126-0.244-0.369-0.364-0.487l-0.733-1.097c-0.119-0.126-0.244-0.369-0.365-0.487-0.244-0.369-0.487-0.733-0.733-0.978-0.126-0.244-0.244-0.369-0.487-0.613-0.245-0.238-0.49-0.607-0.734-0.851-0.244-0.245-0.487-0.49-0.607-0.734-0.244-0.244-0.369-0.487-0.614-0.733-0.851-0.972-1.829-1.83-2.681-2.682-0.245-0.244-0.49-0.369-0.734-0.614-0.244-0.244-0.487-0.487-0.733-0.607-0.245-0.244-0.614-0.487-0.859-0.733-0.238-0.121-0.364-0.365-0.607-0.49-0.365-0.244-0.734-0.487-0.978-0.733-0.119-0.119-0.364-0.244-0.487-0.365l-1.097-0.733c-0.119-0.119-0.364-0.244-0.487-0.364-0.365-0.244-0.734-0.369-1.097-0.614-0.244-0.119-0.369-0.244-0.613-0.364-0.365-0.126-0.734-0.369-0.972-0.487l-0.734-0.369c-0.369-0.121-0.613-0.245-0.977-0.365-0.244-0.126-0.614-0.244-0.859-0.369-0.244-0.119-0.607-0.238-0.851-0.364-0.365-0.119-0.609-0.244-0.978-0.364-0.244-0.126-0.487-0.126-0.733-0.245l-1.097-0.369c-0.244-0.119-0.487-0.119-0.609-0.244-0.369-0.119-0.733-0.244-1.22-0.364-0.245 0-0.371-0.126-0.614-0.126-0.364-0.119-0.851-0.244-1.216-0.244-0.244 0-0.487-0.121-0.613-0.121-0.364-0.126-0.852-0.126-1.222-0.244-0.244 0-0.482-0.126-0.725-0.126-0.369 0-0.734-0.119-1.104-0.119-0.364 0-0.607 0-0.978-0.126-0.244 0-0.607 0-0.851-0.119h-242.407c-21.604 0-39.062 17.456-39.062 39.062 0 21.604 17.458 39.055 39.062 39.055h146.102l-3.171 3.177-217.27 217.265 0.369 0.369-49.676 49.676-155.87-155.87c-7.694-7.689-17.827-11.472-27.953-11.472-10.13-0.126-20.263 3.659-27.952 11.472l-282.446 282.322c-15.258 15.258-15.258 40.041 0 55.298 15.258 15.258 40.033 15.258 55.291 0l255.108-255.11 155.746 155.751c7.813 7.815 17.945 11.593 28.076 11.474 10.126 0.119 20.382-3.659 28.070-11.474l182.964-182.969c0.734-0.734 1.347-1.342 1.956-2.075l111.564-111.564v146.109c0 21.604 17.451 39.060 39.055 39.060s39.062-17.456 39.062-39.060v-235.085c0-0.244 0.126-0.49 0.126-0.614 0-0.244 0.119-0.487 0.119-0.733 0-0.364 0.119-0.734 0.119-1.097s0-0.607 0.126-0.977c0-0.245 0-0.609 0.119-0.852-0.122-1.466-0.122-2.807-0.122-4.030v0zM963.66 256.607z\"  ></path></symbol><symbol id=\"icon-circleyuanquan\" viewBox=\"0 0 1024 1024\"><path d=\"M150.1184 150.1184C250.2656 50.0736 370.8928 0 512 0c141.1072 0 261.7344 50.0736 361.8816 150.1184C973.9264 250.2656 1024 370.8928 1024 512c0 141.2096-50.0736 261.8368-150.1184 361.8816C773.7344 973.9264 653.1072 1024 512 1024c-141.1072 0-261.7344-50.0736-361.8816-150.1184C50.0736 773.8368 0 653.2096 0 512 0 370.8928 50.0736 250.2656 150.1184 150.1184zM512 41.8816c-85.2992 0-164.1472 20.8896-236.3392 62.7712C203.4688 146.432 146.432 203.4688 104.6528 275.6608 62.7712 347.9552 41.8816 426.7008 41.8816 512c0 129.6384 45.9776 240.4352 137.8304 332.288C271.5648 936.2432 382.3616 982.1184 512 982.1184c129.6384 0 240.4352-45.8752 332.288-137.8304C936.2432 752.4352 982.1184 641.6384 982.1184 512c0-129.6384-45.9776-240.3328-137.8304-332.288C752.4352 87.7568 641.6384 41.8816 512 41.8816zM512 256c-36.1472 0-70.144 7.0656-102.1952 20.8896C377.856 290.9184 349.4912 309.3504 324.9152 332.288c-22.9376 24.576-41.472 52.9408-55.3984 84.8896S248.6272 483.328 248.6272 519.3728c0 36.1472 6.9632 70.144 20.8896 102.1952s32.4608 60.3136 55.3984 84.8896C349.4912 729.4976 377.856 747.9296 409.8048 761.856 441.856 775.7824 475.8528 782.7456 512 782.7456c36.1472 0 70.144-6.9632 102.1952-20.8896C646.144 747.9296 674.5088 729.4976 699.0848 706.4576c22.9376-24.576 41.472-52.9408 55.3984-84.8896s20.8896-66.048 20.8896-102.1952c0-36.0448-6.9632-70.144-20.8896-102.1952S722.0224 356.9664 699.0848 332.288C674.5088 309.3504 646.144 290.9184 614.1952 276.8896 582.144 263.0656 548.1472 256 512 256z\"  ></path></symbol><symbol id=\"icon-bhjlink\" viewBox=\"0 0 1024 1024\"><path d=\"M901.920618 465.785468c-50.993571 0-94.522533 32.698367-110.688942 78.273953L702.244627 544.059421c1.764013-10.590222 2.890616-21.423121 2.890616-32.694527 0-72.177856-40.480145-134.923579-99.898281-166.857822l34.099901-112.776268c8.829281 2.126492 18.1347 3.327588 27.724265 3.327588 64.833817 0 117.472367-52.597848 117.472367-117.589097C784.532727 52.594008 731.894177 0 667.06036 0c-64.911381 0-117.509229 52.594008-117.509229 117.470063 0 49.305587 30.248562 91.349307 73.177745 108.842756l-33.419485 110.692013c-22.548956-9.588797-47.462473-14.807112-73.540224-14.807112-49.18732 0-93.841349 18.658451-127.540374 49.309426L213.348053 196.583401l-1.886119 2.008226c19.940183-21.103648 32.256788-49.588197 32.256788-81.003297 0-64.872983-52.517212-117.470063-117.470063-117.470063-64.913685 0-117.511533 52.59708-117.511533 117.470063 0 65.034255 52.59708 117.592169 117.511533 117.592169 31.412796 0 59.898881-12.358075 80.921125-32.335888l-6.179038 6.056931 174.960609 174.879973c-30.729308 33.66293-49.506025 78.47516-49.506025 127.661712 0 43.008283 14.401627 82.685138 38.593258 114.501114l-149.845117 120.999625c-21.503757-28.044506-55.285722-46.218372-93.357532-46.218372-64.874519 0-117.430897 52.719186-117.430897 117.592169 0 64.833049 52.556378 117.470063 117.430897 117.470063 64.872983 0 117.549163-52.637014 117.549163-117.470063 0-20.541499-5.335813-39.878062-14.602834-56.68956l151.369526-122.203792c34.584487 37.633303 84.29095 61.384123 139.618142 61.384123 28.082136 0 54.602234-6.057699 78.553492-17.091805l52.716114 119.514383c-35.585143 20.222026-59.497236 58.335306-59.497236 102.106945 0 64.912149 52.637014 117.549163 117.592169 117.549163 64.872983 0 117.388659-52.637014 117.388659-117.549163 0-64.833049-52.516444-117.513069-117.388659-117.513069-15.047485 0-29.248673 2.929782-42.446133 7.903885l-52.798286-120.034294c42.807844-24.554878 75.182898-65.518073 88.46253-114.221576l88.222926 0c-1.405374 7.018422-1.96522 14.241123-1.96522 21.743362 0 64.872983 52.557914 117.509997 117.387123 117.509997 64.995089 0 117.596009-52.637014 117.596009-117.509997C1019.508947 518.383316 966.994039 465.785468 901.920618 465.785468L901.920618 465.785468zM901.920618 465.785468\"  ></path></symbol><symbol id=\"icon-lianjie_connecting5\" viewBox=\"0 0 1024 1024\"><path d=\"M801.25952 251.74016l-28.9792-28.99968-150.79424 150.8352-35.1232-35.10272-99.14368 99.16416 99.14368 99.16416 99.16416-99.16416-35.10272-35.1232zM487.19872 476.8768l-29.94176 29.94176-19.61984-19.61984-99.16416 99.16416 35.10272 35.1232-150.8352 150.79424 28.95872 28.95872 150.8352-150.79424 35.10272 35.10272 99.14368-99.14368-19.61984-19.64032 29.96224-29.96224-59.92448-59.92448z m-15.48288 44.4416l15.4624-15.4624 30.98624 30.98624-15.4624 15.44192-30.98624-30.96576z\" fill=\"\" ></path></symbol><symbol id=\"icon-xiazai\" viewBox=\"0 0 1024 1024\"><path d=\"M840.5 900.3h-657c-16.5 0-29.9 13.4-29.9 29.9s13.4 29.9 29.9 29.9h657.1c16.5 0 29.9-13.4 29.9-29.9-0.1-16.6-13.5-29.9-30-29.9zM631.5 123.7V541.8H763.1L512 769.9l-251.2-228h131.7V123.7h239m0-59.7h-239c-33 0-59.7 26.7-59.7 59.7v358.4H183.5c-26.6 0-39.9 32.2-21.1 51l328.5 298.2c5.8 5.8 13.5 8.7 21.1 8.7s15.3-2.9 21.1-8.7l328.5-298.2c18.8-18.8 5.5-51-21.1-51H691.2V123.7c0-33-26.7-59.7-59.7-59.7z\"  ></path></symbol><symbol id=\"icon-ico_reset\" viewBox=\"0 0 1024 1024\"><path d=\"M925.97087933 277.33133334a479.997 479.997 0 1 0 54.33566 255.9984H916.05094133a415.9974 415.9974 0 1 1-64.191599-255.9984h74.047537z\"  ></path><path d=\"M978.64255033 61.01268534L725.33213333 371.09074734h297.59814z\"  ></path></symbol><symbol id=\"icon-fangda\" viewBox=\"0 0 1024 1024\"><path d=\"M768 448a320 320 0 1 0-320 320 320 320 0 0 0 320-320z m64 0A384 384 0 1 1 448 64a384 384 0 0 1 384 384z\"  ></path><path d=\"M681.28 726.72a32 32 0 0 1 45.44-45.44l160 160a32 32 0 0 1-45.44 45.44zM320 480a32 32 0 0 1 0-64h256a32 32 0 0 1 0 64z\"  ></path><path d=\"M480 576a32 32 0 0 1-64 0V320a32 32 0 0 1 64 0z\"  ></path></symbol><symbol id=\"icon-zidong\" viewBox=\"0 0 1024 1024\"><path d=\"M131.3 363.3c-19.2 47.3-28.9 97.3-28.9 148.7 0 51.3 9.7 101.3 28.9 148.7 7 17.2 15.1 33.8 24.3 49.7l15.8-49.1 42.8 13.8-39.8 123.8-42.8-13.9-80.9-26 13.8-42.8 52.3 16.8c-98-168.4-74.8-387.9 69.4-532.1C342.4 44.7 586.9 30.5 759.1 158.3l-32.2 32.2c-25.1-18-52.1-32.9-80.9-44.6-47.3-19.2-97.3-28.9-148.7-28.9-51.3 0-101.3 9.7-148.7 28.9-49 19.9-92.9 49.1-130.6 86.8s-66.9 81.7-86.7 130.6z m828.3-60.2l13.8-42.8-80.9-26-42.8-13.8-39.8 123.8 42.8 13.8 15-46.7c9.8 16.6 18.4 34 25.8 52.1 19.2 47.3 28.9 97.3 28.9 148.7 0 51.3-9.7 101.3-28.9 148.7-19.9 49-49.1 92.9-86.8 130.6C768.9 829 725 858.2 676 878.1c-47.3 19.2-97.3 28.9-148.7 28.9-51.3 0-101.3-9.7-148.7-28.9-28.8-11.7-55.9-26.6-80.9-44.6l-32.2 32.2c126.3 93.7 382.6 147.7 572.9-42.6 145.8-145.8 167.9-368.6 66.1-537.7l55.1 17.7zM474 241.2L295 730.4h64.8l50.5-148.2h195.3l54 148.2h70.3L539.6 241.2H474z m-45.9 288.3L479.8 386c11-30.9 19.4-62.1 25.4-93.4 6.9 26 17.9 59.9 32.8 101.5l48.2 135.5H428.1z\" fill=\"\" ></path></symbol><symbol id=\"icon-quanping\" viewBox=\"0 0 1024 1024\"><path d=\"M795.5 192H581c-19.6 0-35.6 15.7-36 35.3-0.4 20.3 16.4 36.7 36.7 36.7h128.4L581 393.1c-14 14-14 36.9 0 50.9s36.9 14 50.9 0L760 315.9v129c0 19.6 15.8 35.6 35.3 36 20.2 0.4 36.7-16.4 36.7-36.7V228.5c0-20.1-16.3-36.5-36.5-36.5zM442.2 760H313.8L443 630.9c14-14 14-36.9 0-50.9s-36.9-14-50.9 0L264 708.1V579c0-19.6-15.8-35.6-35.3-36-20.2-0.4-36.7 16.4-36.7 36.7v215.6c0 20.3 16.4 36.7 36.7 36.7H443c19.6 0 35.6-15.7 36-35.3 0.3-20.3-16.5-36.7-36.8-36.7z\"  ></path><path d=\"M838 136c27.6 0 50 22.4 50 50v652c0 27.6-22.4 50-50 50H186c-27.6 0-50-22.4-50-50V186c0-27.6 22.4-50 50-50h652m0-72H186c-16.4 0-32.4 3.2-47.5 9.6-14.5 6.1-27.6 14.9-38.8 26.1-11.2 11.2-20 24.2-26.1 38.8-6.4 15.1-9.6 31.1-9.6 47.5v652c0 16.4 3.2 32.4 9.6 47.5 6.1 14.5 14.9 27.6 26.1 38.8 11.2 11.2 24.2 20 38.8 26.1 15.1 6.4 31.1 9.6 47.5 9.6h652c16.4 0 32.4-3.2 47.5-9.6 14.5-6.1 27.6-14.9 38.8-26.1 11.2-11.2 20-24.2 26.1-38.8 6.4-15.1 9.6-31.1 9.6-47.5V186c0-16.4-3.2-32.4-9.6-47.5-6.1-14.5-14.9-27.6-26.1-38.8-11.2-11.2-24.2-20-38.8-26.1-15.1-6.4-31.1-9.6-47.5-9.6z\"  ></path></symbol><symbol id=\"icon-lianjieliu\" viewBox=\"0 0 1024 1024\"><path d=\"M280.224 425.856h348.608a29.536 29.536 0 1 0 0-59.072H280.224c-52.448 0-93.152-34.304-93.152-73.856s40.704-73.856 93.152-73.856h140.128C432.096 258.816 468.448 288 512 288s79.904-29.184 91.648-68.928h178.08a29.536 29.536 0 1 0 0-59.072h-179.584C588.896 122.784 553.728 96 512 96s-76.896 26.784-90.112 64H280.224C197.184 160 128 218.272 128 292.928s69.184 132.928 152.224 132.928z\"  ></path><path d=\"M895.936 415.2A96 96 0 1 0 800 512c30.656 0 57.632-14.624 75.2-36.992 10.56 12.064 16.832 26.56 16.832 41.92 0 39.552-40.704 73.856-93.152 73.856H306.016A95.584 95.584 0 0 0 224 544a95.68 95.68 0 0 0-95.232 88.352C89.888 656.224 64 695.424 64 740.928c0 74.656 69.184 132.928 152.224 132.928h241.728A95.808 95.808 0 0 0 544 928a96 96 0 1 0 0-192 95.904 95.904 0 0 0-94.272 78.752H216.224c-52.448 0-93.152-34.304-93.152-73.856 0-17.504 8.32-33.792 21.76-46.72A95.808 95.808 0 0 0 224 736a95.68 95.68 0 0 0 95.008-86.144h479.84c83.072 0 152.224-58.272 152.224-132.928 0.032-41.536-21.824-77.568-55.136-101.728z\"  ></path></symbol><symbol id=\"icon-shuaxin\" viewBox=\"0 0 1024 1024\"><path d=\"M512 919.552c-224.768 0-407.552-182.784-407.552-407.552 0-8.704 0.512-17.408 1.024-26.112l71.68 4.608c-0.512 7.168-0.512 14.336-0.512 21.504 0 185.344 150.528 335.872 335.872 335.872 86.528 0 168.448-32.768 230.912-92.16l49.152 52.224C716.288 880.128 616.96 919.552 512 919.552zM919.552 512h-71.68c0-11.776-0.512-23.552-2.048-35.328-17.92-171.52-161.28-300.544-334.336-300.544-67.584 0-132.096 19.968-187.904 57.344L284.16 174.08c67.072-45.568 145.92-69.632 227.84-69.632 209.408 0 384 156.672 405.504 365.056 1.536 13.824 2.048 28.16 2.048 42.496z\" fill=\"#707070\" ></path><path d=\"M140.288 290.816L28.16 491.52c-3.072 5.12 1.024 11.776 6.656 11.776H258.56c6.144 0 9.728-6.144 6.656-11.776L153.6 290.816c-3.072-5.632-10.752-5.632-13.312 0zM870.4 675.84L758.272 475.136c-3.072-5.12 1.024-11.776 6.656-11.776h223.744c6.144 0 9.728 6.144 6.656 11.776L883.712 675.84c-2.56 5.12-10.24 5.12-13.312 0zM270.336 202.24a35.84 35.84 0 1 0 71.68 0 35.84 35.84 0 1 0-71.68 0zM728.576 784.896a35.84 35.84 0 1 0 71.68 0 35.84 35.84 0 1 0-71.68 0z\" fill=\"#707070\" ></path></symbol><symbol id=\"icon-resize-\" viewBox=\"0 0 1024 1024\"><path d=\"M410.816 673.514667L230.997333 853.333333H384v85.333334H85.333333V640h85.333334v153.002667l179.818666-179.84 60.330667 60.373333z m-53.632-256L170.666667 230.997333V384H85.333333V85.333333h298.666667v85.333334h-153.002667l186.517334 186.517333-60.330667 60.330667z m234.666667-45.696L793.002667 170.666667H640V85.333333h298.666667v298.666667h-85.333334v-153.002667l-201.152 201.173334-60.330666-60.373334z m67.029333 226.709333L853.333333 793.002667V640h85.333334v298.666667H640v-85.333334h153.002667l-194.474667-194.453333 60.352-60.352z\"  ></path></symbol><symbol id=\"icon-guanxitu\" viewBox=\"0 0 1024 1024\"><path d=\"M209.003789 401.084632l29.749895-44.948211 107.843369 71.464421-29.749895 44.894316zM682.469053 546.600421l-14.551579-51.846737 124.496842-35.031579 14.551579 51.846737zM315.068632 812.840421l-40.367158-35.678316 85.692631-96.902737 40.421053 35.732211zM597.962105 390.251789l-46.672842-26.947368 43.11579-74.64421 46.672842 26.947368zM615.639579 728.764632l41.121684-34.816 83.536842 98.735157-41.121684 34.816z\" fill=\"#444A5C\" ></path><path d=\"M501.221053 765.305263c-118.568421 0-215.578947-97.010526-215.578948-215.578947s97.010526-215.578947 215.578948-215.578948 215.578947 97.010526 215.578947 215.578948-97.010526 215.578947-215.578947 215.578947z m0-377.263158c-91.621053 0-161.684211 70.063158-161.684211 161.684211s70.063158 161.684211 161.684211 161.68421 161.684211-70.063158 161.68421-161.68421-75.452632-161.684211-161.68421-161.684211zM167.073684 452.715789c-59.284211 0-107.789474-48.505263-107.789473-107.789473s48.505263-107.789474 107.789473-107.789474 107.789474 48.505263 107.789474 107.789474-48.505263 107.789474-107.789474 107.789473z m0-161.68421c-32.336842 0-53.894737 21.557895-53.894737 53.894737s21.557895 53.894737 53.894737 53.894737 53.894737-21.557895 53.894737-53.894737-26.947368-53.894737-53.894737-53.894737zM253.305263 948.547368c-59.284211 0-107.789474-48.505263-107.789474-107.789473s48.505263-107.789474 107.789474-107.789474 107.789474 48.505263 107.789474 107.789474-48.505263 107.789474-107.789474 107.789473z m0-161.68421c-32.336842 0-53.894737 21.557895-53.894737 53.894737s21.557895 53.894737 53.894737 53.894737 53.894737-21.557895 53.894737-53.894737-21.557895-53.894737-53.894737-53.894737zM856.926316 576.673684c-59.284211 0-107.789474-48.505263-107.789474-107.789473s48.505263-107.789474 107.789474-107.789474 107.789474 48.505263 107.789473 107.789474-48.505263 107.789474-107.789473 107.789473z m0-161.68421c-32.336842 0-53.894737 21.557895-53.894737 53.894737s21.557895 53.894737 53.894737 53.894736 53.894737-21.557895 53.894737-53.894736-21.557895-53.894737-53.894737-53.894737zM662.905263 350.315789C592.842105 350.315789 528.168421 291.031579 528.168421 215.578947s59.284211-134.736842 134.736842-134.736842 134.736842 59.284211 134.736842 134.736842-59.284211 134.736842-134.736842 134.736842z m0-215.578947c-43.115789 0-80.842105 37.726316-80.842105 80.842105s37.726316 80.842105 80.842105 80.842106 80.842105-37.726316 80.842105-80.842106-32.336842-80.842105-80.842105-80.842105zM749.136842 921.6c-43.115789 0-80.842105-37.726316-80.842105-80.842105s37.726316-80.842105 80.842105-80.842106 80.842105 37.726316 80.842105 80.842106-37.726316 80.842105-80.842105 80.842105z m0-107.789474c-16.168421 0-26.947368 10.778947-26.947368 26.947369s10.778947 26.947368 26.947368 26.947368 26.947368-10.778947 26.947369-26.947368-10.778947-26.947368-26.947369-26.947369z\" fill=\"#444A5C\" ></path></symbol><symbol id=\"icon-tupian\" viewBox=\"0 0 1024 1024\"><path d=\"M938.666667 553.92V768c0 64.8-52.533333 117.333333-117.333334 117.333333H202.666667c-64.8 0-117.333333-52.533333-117.333334-117.333333V256c0-64.8 52.533333-117.333333 117.333334-117.333333h618.666666c64.8 0 117.333333 52.533333 117.333334 117.333333v297.92z m-64-74.624V256a53.333333 53.333333 0 0 0-53.333334-53.333333H202.666667a53.333333 53.333333 0 0 0-53.333334 53.333333v344.48A290.090667 290.090667 0 0 1 192 597.333333a286.88 286.88 0 0 1 183.296 65.845334C427.029333 528.384 556.906667 437.333333 704 437.333333c65.706667 0 126.997333 16.778667 170.666667 41.962667z m0 82.24c-5.333333-8.32-21.130667-21.653333-43.648-32.917333C796.768 511.488 753.045333 501.333333 704 501.333333c-121.770667 0-229.130667 76.266667-270.432 188.693334-2.730667 7.445333-7.402667 20.32-13.994667 38.581333-7.68 21.301333-34.453333 28.106667-51.370666 13.056-16.437333-14.634667-28.554667-25.066667-36.138667-31.146667A222.890667 222.890667 0 0 0 192 661.333333c-14.464 0-28.725333 1.365333-42.666667 4.053334V768a53.333333 53.333333 0 0 0 53.333334 53.333333h618.666666a53.333333 53.333333 0 0 0 53.333334-53.333333V561.525333zM320 480a96 96 0 1 1 0-192 96 96 0 0 1 0 192z m0-64a32 32 0 1 0 0-64 32 32 0 0 0 0 64z\"  ></path></symbol><symbol id=\"icon-juhejiedian\" viewBox=\"0 0 1024 1024\"><path d=\"M533.333333 725.333333a64 64 0 1 1-64 64 64 64 0 0 1 64-64m0-85.333333a149.333333 149.333333 0 1 0 149.333334 149.333333 149.333333 149.333333 0 0 0-149.333334-149.333333z\" fill=\"#666666\" ></path><path d=\"M533.333333 277.333333m-106.666666 0a106.666667 106.666667 0 1 0 213.333333 0 106.666667 106.666667 0 1 0-213.333333 0Z\" fill=\"#666666\" ></path><path d=\"M277.333333 320m-106.666666 0a106.666667 106.666667 0 1 0 213.333333 0 106.666667 106.666667 0 1 0-213.333333 0Z\" fill=\"#666666\" ></path><path d=\"M789.333333 320m-106.666666 0a106.666667 106.666667 0 1 0 213.333333 0 106.666667 106.666667 0 1 0-213.333333 0Z\" fill=\"#666666\" ></path><path d=\"M512 341.333333h42.666667v384h-42.666667z\" fill=\"#666666\" ></path><path d=\"M741.290667 357.504l30.165333 30.165333-225.066667 225.066667-30.165333-30.165333z\" fill=\"#666666\" ></path><path d=\"M558.08 582.016l-30.165333 30.165333-228.693334-228.693333 30.165334-30.165333z\" fill=\"#666666\" ></path></symbol><symbol id=\"icon-ziyuan\" viewBox=\"0 0 1024 1024\"><path d=\"M236.615854 752.86913h-0.484162A241.500139 241.500139 0 0 1 0.538332 527.733676a238.78883 238.78883 0 0 1 64.684079-180.011531 242.081134 242.081134 0 0 1 149.025146-74.367324 298.534454 298.534454 0 0 1 596.003751 25.951097V300.95207a221.262156 221.262156 0 0 1 213.031398 233.075715 222.714643 222.714643 0 0 1-221.262156 209.1581h-3.098639a27.500417 27.500417 0 0 1 0-54.904001h2.711309A167.520145 167.520145 0 0 0 968.378705 531.219644a166.261323 166.261323 0 0 0-166.16449-175.363573 151.058627 151.058627 0 0 0-18.204502 1.065157 27.500417 27.500417 0 0 1-30.211725-30.308558 240.822312 240.822312 0 0 0 1.549319-27.306752 243.727285 243.727285 0 0 0-487.357738 0 27.500417 27.500417 0 0 1-27.403584 27.500417 185.627813 185.627813 0 0 0-185.240484 197.538205A186.30564 186.30564 0 0 0 237.100016 697.965129a27.500417 27.500417 0 0 1-0.484162 54.904001z\"  ></path><path d=\"M513.266174 1021.869686a27.500417 27.500417 0 0 1-27.500417-27.403584v-484.162268a27.500417 27.500417 0 1 1 54.904001 0v484.162268a27.403584 27.403584 0 0 1-27.403584 27.403584z\"  ></path><path d=\"M513.266174 1024a27.500417 27.500417 0 0 1-19.366491-8.037094L342.260061 864.129619a27.500417 27.500417 0 1 1 38.732981-38.732981L513.266174 957.766602l130.530147-130.336483a27.500417 27.500417 0 0 1 38.732981 38.732982L532.632664 1015.962906a27.403584 27.403584 0 0 1-19.36649 8.037094z\"  ></path></symbol><symbol id=\"icon-add-select\" viewBox=\"0 0 1024 1024\"><path d=\"M544 213.333333v266.666667H810.666667v64H544V810.666667h-64V544H213.333333v-64h266.666667V213.333333z\"  ></path></symbol><symbol id=\"icon-sami-select\" viewBox=\"0 0 1024 1024\"><path d=\"M810.666667 480v64H213.333333v-64z\"  ></path></symbol><symbol id=\"icon-icon_shuaxin\" viewBox=\"0 0 1024 1024\"><path d=\"M512 938.666667c-55.371852 0-109.226667-10.903704-159.857778-32.237037-48.924444-20.66963-92.823704-50.251852-130.465185-87.988149-37.736296-37.736296-67.318519-81.635556-87.988148-130.465185-21.428148-50.631111-32.237037-104.391111-32.237037-159.857777s10.903704-109.226667 32.237037-159.857778c20.66963-48.924444 50.251852-92.823704 87.988148-130.465185 37.736296-37.736296 81.635556-67.318519 130.465185-87.988149 50.631111-21.428148 104.391111-32.237037 159.857778-32.237037 63.81037 0 125.060741 14.222222 181.854815 42.382223 54.139259 26.832593 102.684444 66.085926 140.325926 113.682963 7.300741 9.197037 5.783704 22.660741-3.508148 29.961481-9.197037 7.300741-22.660741 5.783704-29.961482-3.508148-70.257778-88.936296-175.502222-139.946667-288.711111-139.946667-202.808889 0-367.881481 165.072593-367.881481 367.881482s165.072593 367.881481 367.881481 367.881481 367.881481-165.072593 367.881481-367.881481c0-11.757037 9.576296-21.333333 21.333334-21.333334S922.548148 516.361481 922.548148 528.118519c0 55.371852-10.903704 109.226667-32.237037 159.857777-20.66963 48.924444-50.251852 92.823704-87.988148 130.465185-37.736296 37.736296-81.635556 67.318519-130.465185 87.988149-50.631111 21.428148-104.485926 32.237037-159.857778 32.237037z\"  ></path><path d=\"M817.398519 308.242963c-11.757037 0-21.333333-9.576296-21.333334-21.333333V106.666667c0-11.757037 9.576296-21.333333 21.333334-21.333334s21.333333 9.576296 21.333333 21.333334v180.242963c0 11.757037-9.481481 21.333333-21.333333 21.333333z\"  ></path><path d=\"M817.398519 308.242963H637.155556c-11.757037 0-21.333333-9.576296-21.333334-21.333333s9.576296-21.333333 21.333334-21.333334h180.242963c11.757037 0 21.333333 9.576296 21.333333 21.333334s-9.481481 21.333333-21.333333 21.333333z\"  ></path></symbol><symbol id=\"icon-lianjiezhong\" viewBox=\"0 0 1024 1024\"><path d=\"M883.396923 298.141538a99.721846 99.721846 0 0 1-142.414769 0 103.187692 103.187692 0 0 1 0-144.423384 99.721846 99.721846 0 0 1 142.414769 0 103.187692 103.187692 0 0 1 0 144.423384zM285.144615 760.438154a87.276308 87.276308 0 0 0-124.652307 0 90.269538 90.269538 0 0 0 0 126.385231c34.422154 34.894769 90.230154 34.894769 124.652307 0a90.269538 90.269538 0 0 0 0-126.424616z m482.579693 108.307692a64.472615 64.472615 0 0 1 0-90.269538 62.345846 62.345846 0 0 1 89.00923 0c24.576 24.930462 24.576 65.378462 0 90.269538a62.345846 62.345846 0 0 1-89.00923 0zM294.006154 298.141538a103.187692 103.187692 0 0 0 0-144.423384 99.721846 99.721846 0 0 0-142.454154 0 103.187692 103.187692 0 0 0 0 144.423384 99.721846 99.721846 0 0 0 142.454154 0z m324.214154-196.01723c0 56.438154-45.095385 102.163692-100.745846 102.163692-55.611077 0-100.706462-45.725538-100.706462-102.163692C416.768 45.725538 461.863385 0 517.474462 0c55.650462 0 100.745846 45.725538 100.745846 102.124308zM517.474462 870.793846c-41.747692 0-75.539692 34.264615-75.539693 76.603077 0 42.299077 33.831385 76.603077 75.539693 76.603077 41.747692 0 75.539692-34.264615 75.539692-76.603077 0-42.299077-33.792-76.603077-75.539692-76.603077z m416.768-294.990769c-27.805538 0-50.333538-22.843077-50.333539-51.042462 0-28.199385 22.528-51.042462 50.333539-51.042461 27.844923 0 50.412308 22.843077 50.372923 51.042461 0 28.199385-22.567385 51.081846-50.372923 51.081847zM201.452308 524.8c0-56.398769-45.095385-102.124308-100.745846-102.124308C45.095385 422.596923 0 468.283077 0 524.760615c0 56.398769 45.095385 102.124308 100.706462 102.124308 55.650462 0 100.745846-45.686154 100.745846-102.124308z\"  ></path></symbol><symbol id=\"icon-loading\" viewBox=\"0 0 1024 1024\"><path d=\"M563.2 819.2a102.4 102.4 0 1 1 0 204.8 102.4 102.4 0 0 1 0-204.8z m-320.4608-153.6a128 128 0 1 1 0 256 128 128 0 0 1 0-256z m592.7936 25.6a102.4 102.4 0 1 1 0 204.8 102.4 102.4 0 0 1 0-204.8zM947.2 477.1328a76.8 76.8 0 1 1 0 153.6 76.8 76.8 0 0 1 0-153.6zM128 307.2a128 128 0 1 1 0 256 128 128 0 0 1 0-256z m782.6432-40.6016a51.2 51.2 0 1 1 0 102.4 51.2 51.2 0 0 1 0-102.4zM409.6 0a153.6 153.6 0 1 1 0 307.2 153.6 153.6 0 0 1 0-307.2z m384 153.6a25.6 25.6 0 1 1 0 51.2 25.6 25.6 0 0 1 0-51.2z\" fill=\"#555555\" ></path></symbol><symbol id=\"icon-tupushujuyuan\" viewBox=\"0 0 1024 1024\"><path d=\"M851.456 588.288c-13.312 0-25.6 2.048-37.888 5.12l-90.112-155.648 55.296-31.744c18.944 17.92 44.032 29.184 72.192 29.184 57.344 0 103.936-46.592 103.936-103.936s-46.592-103.936-103.936-103.936c-57.344 0-103.936 46.592-103.936 103.936 0 5.12 0.512 10.24 1.536 15.36l-58.368 33.792-82.944-143.872c26.112-25.088 41.984-59.904 41.984-98.816 0-75.776-61.44-137.216-137.216-137.216s-137.216 61.44-137.216 137.216c0 38.912 15.872 73.728 41.984 98.816l-84.992 146.944-56.832-32.768c1.024-6.144 2.048-12.8 2.048-19.456 0-57.344-46.592-103.936-103.936-103.936-57.344 0-103.936 46.592-103.936 103.936s46.592 103.936 103.936 103.936c26.624 0 51.2-10.24 69.12-26.624l56.32 32.768-88.064 152.576c-11.776-3.584-24.576-5.12-37.888-5.12-75.776 0-137.216 61.44-137.216 137.216s61.44 137.216 137.216 137.216c64.512 0 118.272-44.544 133.12-103.936h173.056v61.44c-40.96 13.824-70.656 52.736-70.656 98.816 0 57.344 46.592 103.936 103.936 103.936s103.936-46.592 103.936-103.936c0-46.08-29.696-84.48-70.656-98.816v-61.44h173.056c14.848 59.904 69.12 103.936 133.12 103.936 75.776 0 137.216-61.44 137.216-137.216s-61.44-137.728-137.216-137.728z m-410.112-450.048c0-38.912 31.744-70.656 70.656-70.656s70.656 31.744 70.656 70.656c0 13.824-4.096 26.624-10.752 37.376-12.288 19.456-33.28 32.256-57.856 33.28h-5.12c-24.576-1.024-45.568-13.824-57.856-33.28-6.144-10.752-9.728-24.064-9.728-37.376z m32.768 132.096c11.776 3.584 24.576 5.12 37.888 5.12s25.6-2.048 37.888-5.12l82.944 143.872-124.416 72.192-118.784-68.608 84.48-147.456z m-301.568 526.336c-38.912 0-70.656-31.744-70.656-70.656 0-38.912 31.744-70.656 70.656-70.656h2.56c24.576 1.024 45.568 13.824 57.856 33.28 1.024 1.536 1.536 2.56 2.56 4.096 5.12 9.728 8.192 20.992 8.192 33.28 0 11.776-3.072 23.552-8.192 33.28-12.288 22.016-35.84 37.376-62.976 37.376z m133.12-103.936c-6.144-25.6-19.456-48.128-37.888-65.536l88.064-152.576 122.88 70.656v146.944h-173.056z m239.616-151.552l120.832-69.632 90.112 155.648c-18.432 17.408-31.744 39.936-37.888 65.536h-173.056v-151.552z m306.176 255.488c-27.136 0-50.688-15.36-62.464-37.376-5.12-9.728-8.192-21.504-8.192-33.28 0-12.288 3.072-23.552 8.192-33.28 0.512-1.536 1.536-3.072 2.56-4.096 12.288-19.456 33.28-32.768 57.856-33.28h2.56c38.912 0 70.656 31.744 70.656 70.656-0.512 38.912-32.256 70.656-71.168 70.656z\"  ></path></symbol><symbol id=\"icon-jiedian\" viewBox=\"0 0 1024 1024\"><path d=\"M882.1914 744.849921c-60.501005 0-112.097749 38.645092-131.425292 92.560342H244.912146c-80.468136 0-145.955927-62.61964-145.955926-139.570043 0-77.000371 65.487791-139.570043 145.955926-139.570043h136.312143c19.497433 53.585462 70.934281 91.950735 131.205434 91.950735 60.241173 0 111.688014-38.375266 131.205434-91.950735h136.452052C914.210763 558.280171 1023.340425 453.92743 1023.340425 325.660102S914.210763 93.040033 780.077216 93.040033H273.093982c-19.197627-54.165089-70.944274-93.040033-131.595182-93.040033C64.508422 0 1.928757 62.569672 1.928757 139.560049c0 76.950403 62.579665 139.570043 139.570043 139.570043 60.640915 0 112.377569-38.894931 131.585189-93.040033h506.993227c80.468136 0 145.955927 62.61964 145.955927 139.570043 0 77.000371-65.487791 139.570043-145.955927 139.570043H644.414655c-18.887826-54.734722-70.924287-94.139324-131.974938-94.139325-61.090625 0-113.097105 39.394609-131.974938 94.139325H244.912146c-134.133547 0-243.263209 104.352741-243.263209 232.620069 0 128.267328 109.129663 232.620069 243.263209 232.620069h505.524174c19.057717 54.394941 70.9043 93.529717 131.75508 93.529717 76.950403 0 139.570043-62.61964 139.570043-139.570043 0.009994-77.000371-62.61964-139.580036-139.570043-139.580036zM141.428845 207.036558c-37.166045 0-67.376574-30.230515-67.376574-67.376573 0-37.166045 30.210528-67.376574 67.376574-67.376574 37.146058 0 67.376574 30.210528 67.376573 67.376574 0 37.146058-30.230515 67.376574-67.376573 67.376573z m371.000878 236.257725c37.146058 0 67.376574 30.210528 67.376574 67.376574 0 37.146058-30.230515 67.376574-67.376574 67.376573-37.166045 0-67.376574-30.230515-67.376574-67.376573 0.009994-37.176039 30.210528-67.376574 67.376574-67.376574z m369.761677 508.502254c-37.166045 0-67.376574-30.230515-67.376574-67.376573 0-37.166045 30.210528-67.376574 67.376574-67.376574 37.146058 0 67.376574 30.210528 67.376574 67.376574 0 37.146058-30.230515 67.376574-67.376574 67.376573z\"  ></path></symbol><symbol id=\"icon-shitujiedianxianshi\" viewBox=\"0 0 1367 1024\"><path d=\"M1235.403267 512.03593a130.596433 130.596433 0 0 0-42.68749 7.796802l-193.295715-290.430872A149.113837 149.113837 0 1 0 724.647767 149.48464a151.777744 151.777744 0 0 0 37.229729 97.849864l-194.920048 357.873209a220.519548 220.519548 0 0 0-55.162374-8.511508 207.914718 207.914718 0 0 0-114.807909 34.046035L240.401393 443.683967a126.763005 126.763005 0 0 0-75.564005-182.380192 127.737605 127.737605 0 1 0 12.99467 239.816633l157.625345 188.422713A213.307506 213.307506 0 1 0 643.23616 643.282096l190.956674-350.856087a164.187654 164.187654 0 0 0 39.56877 6.172468 143.591102 143.591102 0 0 0 60.555162-12.99467l192.516034 288.026859a121.760057 121.760057 0 0 0-18.582377 64.973349 128.127445 128.127445 0 1 0 127.152844-126.568085zM129.621832 448.362048a68.157044 68.157044 0 1 1 68.157044-68.092071A68.157044 68.157044 0 0 1 129.621832 448.362048z m528.948039 365.670011a145.86517 145.86517 0 1 1-145.86517-145.86517 145.86517 145.86517 0 0 1 145.86517 145.86517z m215.12676-577.937944a87.389155 87.389155 0 1 1 87.389155-87.389155 87.389155 87.389155 0 0 1-87.389155 87.389155z m365.085251 474.305451a68.157044 68.157044 0 1 1 68.222017-68.416937 68.157044 68.157044 0 0 1-68.222017 68.157044z\"  ></path></symbol><symbol id=\"icon-shituxianshiquanbujiedian\" viewBox=\"0 0 1367 1024\"><path d=\"M1235.403267 512.03593a130.596433 130.596433 0 0 0-42.68749 7.796802l-193.295715-290.430872A149.113837 149.113837 0 1 0 724.647767 149.48464a151.777744 151.777744 0 0 0 37.229729 97.849864l-194.920048 357.873209a220.519548 220.519548 0 0 0-55.162374-8.511508 207.914718 207.914718 0 0 0-114.807909 34.046035L240.401393 443.683967a126.763005 126.763005 0 0 0-75.564005-182.380192 127.737605 127.737605 0 1 0 12.99467 239.816633l157.625345 188.422713A213.307506 213.307506 0 1 0 643.23616 643.282096l190.956674-350.856087a164.187654 164.187654 0 0 0 39.56877 6.172468 143.591102 143.591102 0 0 0 60.555162-12.99467l192.516034 288.026859a121.760057 121.760057 0 0 0-18.582377 64.973349 128.127445 128.127445 0 1 0 127.152844-126.568085zM129.621832 448.362048a68.157044 68.157044 0 1 1 68.157044-68.092071A68.157044 68.157044 0 0 1 129.621832 448.362048z m528.948039 365.670011a145.86517 145.86517 0 1 1-145.86517-145.86517 145.86517 145.86517 0 0 1 145.86517 145.86517z m215.12676-577.937944a87.389155 87.389155 0 1 1 87.389155-87.389155 87.389155 87.389155 0 0 1-87.389155 87.389155z m365.085251 474.305451a68.157044 68.157044 0 1 1 68.222017-68.416937 68.157044 68.157044 0 0 1-68.222017 68.157044z\"  ></path></symbol><symbol id=\"icon-suoxiao\" viewBox=\"0 0 1024 1024\"><path d=\"M768 448a320 320 0 1 0-320 320 320 320 0 0 0 320-320z m64 0A384 384 0 1 1 448 64a384 384 0 0 1 384 384z\"  ></path><path d=\"M681.28 726.72a32 32 0 0 1 45.44-45.44l160 160a32 32 0 0 1-45.44 45.44zM288 480a32 32 0 0 1 0-64h320a32 32 0 0 1 0 64z\"  ></path></symbol><symbol id=\"icon-lianjie\" viewBox=\"0 0 1024 1024\"><path d=\"M922.243 97.755c11.49 11.489 11.673 30.002 0.547 41.713l-0.547 0.562-109.119 109.1c57.22 78.348 42.673 195.388-35.778 273.839l-92.83 92.585c-11.572 11.54-30.264 11.653-41.97 0.253l-45.746-44.55-18.089 18.086a29.891 29.891 0 0 1-7.171 5.3l48.764 47.489c11.947 11.638 12.06 30.804 0.248 42.585l-95.875 95.629c-77.416 77.417-192.412 92.603-270.72 38.004L144.04 928.245c-11.676 11.673-30.606 11.673-42.282 0-11.49-11.489-11.673-30.002-0.547-41.713l0.547-0.562 109.677-109.657c-55.981-78.335-41.131-194.413 36.833-272.377l92.831-92.585c11.571-11.54 30.263-11.653 41.969-0.254l42.587 41.474a29.935 29.935 0 0 1 3.678-4.741l0.548-0.562 19.54-19.538-44.11-42.957c-11.828-11.522-12.057-30.422-0.6-42.23l0.351-0.355 95.875-95.63c76.927-76.926 190.96-92.408 269.23-39.03L879.961 97.755c11.676-11.673 30.606-11.673 42.282 0zM362.451 474.49l-71.916 71.727-1.884 1.911c-61.822 63.545-67.916 156.289-16.185 208.02C324.72 808.4 418.82 801.655 482.43 738.044l74.422-74.234-194.401-189.32z m129.807-5.04l-20.096 20.094a30.035 30.035 0 0 1-4.643 3.8l63.25 61.595a29.82 29.82 0 0 1 5.113-7.308l0.547-0.561 17.532-17.531-61.703-60.089z m260.889-198.691c-52.254-52.254-146.353-45.509-209.964 18.102l-74.422 74.234 194.4 189.322 71.939-71.75 1.862-1.888c61.822-63.545 67.916-156.29 16.185-208.02z\" fill=\"#333333\" ></path></symbol><symbol id=\"icon-xiantiao\" viewBox=\"0 0 1024 1024\"><path d=\"M827.076923 157.538462a39.384615 39.384615 0 1 1-14.375385 76.051692L233.590154 812.701538a39.384615 39.384615 0 1 1-22.291692-22.291692L790.409846 211.298462A39.384615 39.384615 0 0 1 827.076923 157.538462z\" fill=\"#333333\" ></path></symbol></svg>',r=(r=document.getElementsByTagName(\"script\"))[r.length-1].getAttribute(\"data-injectcss\");if(r&&!e.__iconfont__svg__cssinject__){e.__iconfont__svg__cssinject__=!0;try{document.write(\"<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>\")}catch(c){console&&console.log(c)}}function h(){i||(i=!0,o())}s=function(){var c,p,d,g;(g=document.createElement(\"div\")).innerHTML=l,l=null,(d=g.getElementsByTagName(\"svg\")[0])&&(d.setAttribute(\"aria-hidden\",\"true\"),d.style.position=\"absolute\",d.style.width=0,d.style.height=0,d.style.overflow=\"hidden\",c=d,(p=document.body).firstChild?(g=c,(d=p.firstChild).parentNode.insertBefore(g,d)):p.appendChild(c))},document.addEventListener?~[\"complete\",\"loaded\",\"interactive\"].indexOf(document.readyState)?setTimeout(s,0):(t=function(){document.removeEventListener(\"DOMContentLoaded\",t,!1),s()},document.addEventListener(\"DOMContentLoaded\",t,!1)):document.attachEvent&&(o=s,n=e.document,i=!1,(a=function(){try{n.documentElement.doScroll(\"left\")}catch(c){return void setTimeout(a,50)}h()})(),n.onreadystatechange=function(){n.readyState==\"complete\"&&(n.onreadystatechange=null,h())})})(window);const Ve=e=>(e=e.replace(\"#\",\"\"),e=e.replace(\"(\",\"\"),e=e.replace(\")\",\"\"),e=e.replace(/,/,\"-\"),e),tt=e=>{try{if(\"touches\"in e&&e.touches||\"targetTouches\"in e&&e.targetTouches)return!0}catch(s){}return!1},kt=e=>tt(e)?{clientX:e.touches[0].clientX,clientY:e.touches[0].clientY}:{clientX:e.clientX,clientY:e.clientY},u=(...e)=>{typeof window!=\"undefined\"&&window.relationGraphDebug&&console.log(\"[relation-graph:debug]\",...e)},K=(...e)=>{console.warn(\"[relation-graph]\",...e)},Mt=(e,s,t)=>e?e.classList.contains(s)?e:e.classList.contains(t)?null:Mt(e.parentElement,s,t):null,mt=e=>C(this,null,function*(){return new Promise((s,t)=>{setTimeout(()=>{s()},e)})}),Z=e=>typeof e==\"string\"?Number.parseInt(e):e,Ne=()=>{const e=\"l\",s=\"o\",t=\"g\",o=new Date().getFullYear(),n=[];return o>1&&n.push(e),o>201&&n.push(s),o>1113&&n.push(t),n.join(\"\")},Ge=()=>{const e=\"c\",s=\"o\",t=\"n\",o=\"s\",n=\"o\",i=\"l\",a=\"e\",l=new Date().getFullYear(),r=[];return l>1&&r.push(e),l>21&&r.push(s),l>35&&r.push(t),l>55&&r.push(o),l>189&&r.push(n),l>231&&r.push(i),l>1234&&r.push(a),r.join(\"\")},Nt=e=>e.replace(/-/g,\"\").replace(/\\*/g,\"-\"),Be=e=>{const s=Ge(),t=Ne(),o=\"r-e-l-a-t-i-o-n*g-r-a-p-h\",n=\"h-t-t-p-s-:-/-/-g-i-t-h-u-b-.-c-o-m-/-s-e-e-k-s-d-r-e-a-m-/-r-e-l-a-t-i-o-n-*-g-r-a-p-h\";window&&window[s]&&window[s][t](`%c ${Nt(o)} %c Version v${Vt}(${e}) %c More info: ${Nt(n)} %c`,\"background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px;  color: #fff\",\"background:#41b883 ; padding: 1px; border-radius: 0 3px 3px 0;  color: #fff\",\"background:#fff ; padding: 1px; border-radius: 0 3px 3px 0;  color: #41b883\",\"background:transparent\"),ut||console.error(\"[relation-graph]Please introduce component screenfull, for example:https://cdnjs.cloudflare.com/ajax/libs/screenfull.js/5.1.0/screenfull.min.js\"),pt||console.error(\"[relation-graph]Please introduce component html2canvas, for example:https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js\")},x={getDescendantNodes(e){const s=[];return e.lot&&e.lot.childs&&e.lot.childs.forEach(t=>{s.push(t);const o=x.getDescendantNodes(t);s.push(...o)}),s},analysisNodes(e,s,t,o){s.length>o.max_length&&(o.max_length=s.length),t>o.max_deep&&(o.max_deep=t);const n={level:t,all_size:s.length,all_strength:0};t===0&&s.forEach(a=>{a.lot.parent=void 0});const i=[];s.forEach(a=>{e.push(a),a.targetNodes&&a.targetNodes.forEach(l=>{e.includes(l)||(e.push(l),l.lot.parent=a,i.push(l))})}),n.all_strength>o.max_strength&&(o.max_strength=n.all_strength),i.length>0&&x.analysisNodes(e,i,t+1,o)},analysisNodes4Didirectional(e,s,t,o,n){s.length>o.max_length&&(o.max_length=s.length),t>o.max_deep&&(o.max_deep=t);const i={level:t,all_size:s.length,all_strength:0},a=[];s.forEach(r=>{r.lot||(r.lot={childs:[]}),r.lot.eached=!0,r.lot.subling=i,r.lot.level=t,e.push(r)});let l=0;s.forEach(r=>{let h=0;if(n===0){let c=0;r.targetNodes.forEach(p=>{p.lot||(p.lot={eached:!1,childs:[]}),p.lot.eached||(x.isAllowShowNode(p)?(p.lot.eached=!0,p.lot.parent=r,p.lot.index_of_parent=c++,r.lot.childs.push(p),a.push(p),h++):r.lot.childs.push(p))})}else if(n===-1){let c=0;r.targetFrom.forEach(p=>{p.lot||(p.lot={eached:!1,childs:[]}),p.lot.eached||(x.isAllowShowNode(p)?(p.lot.eached=!0,p.lot.parent=r,p.lot.index_of_parent=c++,r.lot.childs.push(p),a.push(p),h++):r.lot.childs.push(p))})}else{let c=0;r.targetTo.forEach(p=>{p.lot||(p.lot={eached:!1,childs:[]}),p.lot.eached||(x.isAllowShowNode(p)?(p.lot.eached=!0,p.lot.parent=r,p.lot.index_of_parent=c++,r.lot.childs.push(p),a.push(p),h++):r.lot.childs.push(p))})}r.lot.strength=h>0?h:1,i.all_strength+=r.lot.strength,r.lot.strength_plus=i.all_strength,r.lot.index_of_level=l,r.lot.childs_size=h,l++}),i.all_strength>o.max_strength&&(o.max_strength=i.all_strength),a.length>0?x.analysisNodes4Didirectional(e,a,t+(n===-1?-1:1),o,n):(e.forEach(r=>{r.lot.childs_size>0&&(r.lot.strengthWithChilds=0)}),e.forEach(r=>{r.lot.childs_size===0&&(r.lot.strengthWithChilds=1,x.conductStrengthToParents(r))}),x.analysisDataTree([e[0]],0,n))},conductStrengthToParents(e){e.lot.parent&&Math.abs(e.lot.level)-1===Math.abs(e.lot.parent.lot.level)&&(e.lot.parent.lot.strengthWithChilds+=1,x.conductStrengthToParents(e.lot.parent))},analysisDataTree(e,s,t=1){const o=[];let n=0;e.forEach(i=>{(i.lot.level===0||t===(i.lot.level<0?-1:1))&&(i.lot.childs_size>0&&i.lot.childs.forEach(a=>{o.push(a)}),i.lot.parent&&n<i.lot.parent.lot.strengthWithChilds_from&&(n=i.lot.parent.lot.strengthWithChilds_from),i.lot.strengthWithChilds_from=n,n+=i.lot.strengthWithChilds)}),o.length>0&&x.analysisDataTree(o,s+t,t)},conductStrengthToParents4Folder(e){e.lot.parent&&(e.lot.parent.lot.strengthWithChilds+=1,x.conductStrengthToParents4Folder(e.lot.parent))},analysisDataFolder(e,s,t){const o=[];let n=0,i;e.forEach(a=>{(a.lot.level===0||t===(a.lot.level<0?-1:1))&&(a.lot.childs_size>0&&a.lot.childs.forEach(l=>{o.push(l)}),a.lot.parent&&(i?i!==a.lot.parent&&(i=a.lot.parent,n=i.lot.strengthWithChilds_from):(i=a.lot.parent,n=i.lot.strengthWithChilds_from)),a.lot.strengthWithChilds_from=1+n,n+=a.lot.strengthWithChilds)}),o.length>0&&x.analysisDataFolder(o,s+t,t)},isAllowShowNode(e,s=0){return s>15?!0:(!e.lot||!e.lot.parent||x.isAllowShowNode(e.lot.parent,s+1)&&e.lot.parent.expanded!==!1)&&e.isShow&&e.isHide!==!0},getNodeWidth(e,s){return e.el.offsetWidth||e.width||s&&s.defaultNodeWidth||50},getNodeHeight(e,s){return e.el.offsetHeight||e.height||s&&s.defaultNodeHeight||50},getNodeXByLotX(e,s){return(s.offset_x||0)+this.getNodeXByCenterX(e,s,s.lot.x||0)},getNodeYByLotY(e,s){return(s.offset_y||0)+this.getNodeYByCenterY(e,s,s.lot.y||0)},getNodeXByCenterX(e,s,t){return s.alignItems===\"right\"?t-x.getNodeWidth(s,e):s.alignItems===\"left\"?t:t-x.getNodeWidth(s,e)/2},getNodeYByCenterY(e,s,t){return s.alignItems===\"top\"?t:s.alignItems===\"bottom\"?t-x.getNodeHeight(s,e):t-x.getNodeHeight(s,e)/2},getCenterXByNodeX(e,s,t){return t+x.getNodeHeight(s,e)/2},getCenterYByNodeY(e,s,t){return t+x.getNodeHeight(s,e)/2},getLotXByNodeX(e,s){const t=s.offset_x||0;return this.getCenterXByNodeX(e,s,s.x||0)-t},getLotYByNodeY(e,s){const t=s.offset_y||0;return this.getCenterYByNodeY(e,s,s.y||0)-t},isRectangleOverlap(e,s){const t=e.x+F,o=s.x+F,n=e.el.offsetWidth-F*2,i=s.el.offsetWidth-F*2,a=e.y+F,l=s.y+F,r=e.el.offsetHeight-F*2,h=s.el.offsetHeight-F*2;return!(o>=t+n||o+i<=t||l>=a+r||l+h<=a)},isXOverlap(e,s,t,o){return!(s>=e+t||s+o<=e)},isYOverlap(e,s,t,o){return!(s>=e+t||s+o<=e)},shapesOverlap(e,s,t=1,o=1){return this.isRectangleOverlap(e,s)},getNoOverlapLimitedPosition(e,s,t,o){const n=e.x+F,i=e.y+F,a=s+F,l=o.x+F,r=e.el.offsetWidth-F*2,h=o.el.offsetWidth-F*2,c=t+F,p=o.y+F,d=e.el.offsetHeight-F*2,g=o.el.offsetHeight-F*2;let f=e.x,m=e.y;const _=this.isXOverlap(n,l,r,h),y=this.isYOverlap(i,p,d,g);return _?c<p?(f=s,m=p-d-F):c>p&&(f=s,m=p+g-F):y&&(a<l?(f=l-r-F,m=t):a>l&&(f=l+h-F,m=t)),{x:f,y:m}},flatNodeData(e,s,t,o){e.forEach(n=>{t.push(n),s&&o.push({from:s.id,to:n.id});const i=n.childs||n.children;i&&i.length>0&&this.flatNodeData(i,n,t,o)})}},F=8,Te=Object.freeze(Object.defineProperty({__proto__:null,RGNodesAnalytic:x,default:x},Symbol.toStringTag,{value:\"Module\"}));var $=(e=>(e.onNodeClick=\"onNodeClick\",e.onNodeExpand=\"onNodeExpand\",e.onNodeCollapse=\"onNodeCollapse\",e.onLineClick=\"onLineClick\",e.onImageDownload=\"onImageDownload\",e.onImageSaveAsFile=\"onImageSaveAsFile\",e.onNodeDragStart=\"onNodeDragStart\",e.onNodeDragEnd=\"onNodeDragEnd\",e.onNodeDragging=\"onNodeDragging\",e.onCanvasDragEnd=\"onCanvasDragEnd\",e.onContextmenu=\"onContextmenu\",e.onFullscreen=\"onFullscreen\",e.onCanvasClick=\"onCanvasClick\",e.onCanvasSelectionEnd=\"onCanvasSelectionEnd\",e.onZoomEnd=\"onZoomEnd\",e.viewResize=\"viewResize\",e.nodeDragStart=\"nodeDragStart\",e.nodeDragging=\"nodeDragging\",e.nodeDragEnd=\"nodeDragEnd\",e.fullscreen=\"fullscreen\",e.onResizeStart=\"onResizeStart\",e.onResizeEnd=\"onResizeEnd\",e.onLineVertexDropped=\"onLineVertexDropped\",e.beforeChangeLayout=\"beforeChangeLayout\",e))($||{});const ft=(e,s)=>{if(e.id===void 0)throw console.log(\"node must has id:\",e),new Error(\"node must has option[id]:\");const t={id:e.id,text:e.text!==void 0?e.text:\"\",type:e.type!==void 0?e.type:\"node\",isShow:!0,isHide:e.isHide!==void 0?e.isHide:!1,expanded:e.expanded!==void 0?e.expanded:!0,junctionPoint:e.junctionPoint!==void 0?e.junctionPoint:void 0,alignItems:e.alignItems!==void 0?e.alignItems:void 0,selected:e.selected!==void 0?e.selected:!1,flashing:void 0,dragging:!1,styleClass:e.styleClass!==void 0?e.styleClass:\"\",className:e.className!==void 0?e.className:\"\",targetNodes:[],targetFrom:[],targetTo:[],nodeShape:e.nodeShape!==void 0?e.nodeShape:void 0,borderWidth:e.borderWidth!==void 0?e.borderWidth:void 0,borderColor:e.borderColor!==void 0?e.borderColor:void 0,fontColor:e.fontColor!==void 0?e.fontColor:void 0,color:e.color!==void 0?e.color:void 0,opacity:e.opacity!==void 0?e.opacity:1,fixed:e.fixed!==void 0?e.fixed:!1,width:e.width!==void 0?e.width:void 0,height:e.height!==void 0?e.height:void 0,force_weight:e.force_weight,x:e.x!==void 0?e.x:0,y:e.y!==void 0?e.y:0,Fx:0,Fy:0,offset_x:e.offset_x!==void 0?e.offset_x:0,offset_y:e.offset_y!==void 0?e.offset_y:0,expandHolderPosition:e.expandHolderPosition!==void 0?e.expandHolderPosition:void 0,innerHTML:e.innerHTML!==void 0?e.innerHTML:void 0,html:e.html!==void 0?e.html:void 0,disableDefaultClickEffect:e.disableDefaultClickEffect!==void 0?e.disableDefaultClickEffect:void 0,disableDrag:e.disableDrag!==void 0?e.disableDrag:!1,singleNode:!1,invisiable:!1,zIndex:0,data:e.data!==void 0?e.data:{}};return t.lot={childs:[],parent:void 0,eached:!1,strength:0},t.el===void 0&&(t.el={offsetWidth:50,offsetHeight:50},s&&(s.defaultNodeWidth&&(t.el.offsetWidth=s.defaultNodeWidth+16),s.defaultNodeHeight&&(t.el.offsetHeight=s.defaultNodeHeight+16))),t.width&&(t.el.offsetWidth=t.width),t.height&&(t.el.offsetHeight=t.height),t},Ae=[\"Fx\",\"Fy\",\"appended\",\"dragging\",\"el\",\"targetFrom\",\"targetNodes\",\"targetTo\",\"type\",\"lot\",\"seeks_id\"],yt=e=>{if(!e)return;const s={};return Object.keys(e).forEach(t=>{Ae.includes(t)||e[t]!==void 0&&(s[t]=e[t])}),s},Ie=Object.freeze(Object.defineProperty({__proto__:null,json2Node:ft,transNodeToJson:yt,default:{json2Node:ft,transNodeToJson:yt}},Symbol.toStringTag,{value:\"Module\"})),ht=e=>{if(e.from===void 0)throw console.log(\"error,line must has option[from]:\",e),new Error(\"error,line must has option[from]:\");if(e.to===void 0)throw console.log(\"error,line must has option[to]:\",e),new Error(\"error,line must has option[to]:\");if(typeof e.from!=\"string\")throw console.log(\"error line from, must be string:\",e),new TypeError(\"error line from, must be string:\");if(typeof e.to!=\"string\")throw console.log(\"error line to, must be string:\",e),new TypeError(\"error line to, must be string:\");const s={from:e.from,to:e.to,text:e.text!==void 0?e.text:\"\",textOffset_x:e.textOffset_x!==void 0?e.textOffset_x:void 0,textOffset_y:e.textOffset_y!==void 0?e.textOffset_y:void 0,color:e.color!==void 0?e.color:void 0,opacity:e.opacity!==void 0?e.opacity:1,fontColor:e.fontColor!==void 0?e.fontColor:void 0,lineWidth:e.lineWidth!==void 0?e.lineWidth:void 0,lineShape:e.lineShape!==void 0?e.lineShape:void 0,styleClass:e.styleClass!==void 0?e.styleClass:void 0,className:e.className!==void 0?e.className:void 0,isHide:e.isHide!==void 0?e.isHide:!1,arrow:e.arrow!==void 0?e.arrow:void 0,animation:e.animation!==void 0?e.animation:0,dashType:e.dashType!==void 0?e.dashType:0,disableDefaultClickEffect:e.disableDefaultClickEffect!==void 0?e.disableDefaultClickEffect:!1,showStartArrow:e.showStartArrow!==void 0?e.showStartArrow:!1,showEndArrow:e.showEndArrow!==void 0?e.showEndArrow:!0,useTextPath:e.useTextPath!==void 0?e.useTextPath:void 0,placeText:e.placeText!==void 0?e.placeText:void 0,textAnchor:e.textAnchor!==void 0?e.textAnchor:void 0,forDisplayOnly:e.forDisplayOnly||e.from===e.to,fromJunctionPoint:e.fromJunctionPoint,toJunctionPoint:e.toJunctionPoint,force_elastic:e.force_elastic,polyLineStartDistance:e.polyLineStartDistance,isHideArrow:e.isHideArrow!==void 0?e.isHideArrow:void 0,hidden:!1,lineDirection:e.lineDirection!==void 0?e.lineDirection:void 0,reverseText:e.reverseText!==void 0?e.reverseText:void 0,data:e.data!==void 0?e.data:{}};return s.isHideArrow&&(s.showEndArrow=!1,s.isHideArrow=!1),s},He=[\"arrow\",\"id\",\"reverseText\",\"isReverse\"],St=e=>{if(!e)return;const s={};return Object.keys(e).forEach(t=>{He.includes(t)||e[t]!==void 0&&(s[t]=e[t])}),s},vt=(e,s)=>{!e||e.relations.forEach(t=>{const o=St(t);o&&s.push(o)})},et={border:\"border\",ltrb:\"ltrb\",tb:\"tb\",lr:\"lr\",left:\"left\",right:\"right\",top:\"top\",bottom:\"bottom\"},We=Object.freeze(Object.defineProperty({__proto__:null,json2Line:ht,transLineToJson:St,transLinkToJson:vt,JUNCTION_POINT_STYLE:et,default:{json2Line:ht,transLinkToJson:vt}},Symbol.toStringTag,{value:\"Module\"}));class ct{constructor(s,t,o){v(this,\"graphOptions\");v(this,\"layoutOptions\");v(this,\"graphInstance\");v(this,\"allNodes\",[]);v(this,\"isMainLayouer\",!0);v(this,\"requireLinks\",!1);v(this,\"allLinks\",[]);v(this,\"rootNode\");v(this,\"currentAnimationStep\",1);v(this,\"allAnimationStep\",30);this.layoutOptions=s,this.graphOptions=t,this.graphInstance=o}setLinks(s){u(\"setLinks:\",s.length),this.allLinks=s}refresh(){this.placeNodes(this.allNodes,this.rootNode)}placeNodes(s,t){this.allNodes=s,this.rootNode=t}snapshotBeforeAnimation(){this.allNodes.forEach(s=>{!x.isAllowShowNode(s)||(s.lot.to_x=x.getNodeXByLotX(this.graphOptions,s),s.lot.to_y=x.getNodeYByLotY(this.graphOptions,s),s.lot.from_x=s.x||0,s.lot.from_y=s.y||0,s.lot.placed=!0)})}animationLayout(s=!0){return C(this,null,function*(){s&&this.snapshotBeforeAnimation();const t=this.rootNode;t&&u(\"debug0910:create rootNode coordinates:2.1\",t.x,t.y),this.currentAnimationStep=1,this.allAnimationStep=10,u(\"[LayoutAnimationEffect]start play...\");let o=!1;return new Promise((n,i)=>{this.playAnimation(()=>{o||(o=!0,u(\"[LayoutAnimationEffect]played!\"),this.allNodes.forEach(a=>{!x.isAllowShowNode(a)||(a.lot.from_x=a.x,a.lot.from_y=a.y,a.x=a.lot.to_x,a.y=a.lot.to_y)}),n())})})})}playAnimation(s){if(u(\"[LayoutAnimationEffect]\",this.currentAnimationStep,this.allAnimationStep),this.currentAnimationStep>this.allAnimationStep){s();return}this.allNodes.forEach(t=>{if(!t.lot.placed)return;const{from_x:o,from_y:n,to_x:i,to_y:a}=t.lot;if(o!==void 0&&n!==void 0&&i!==void 0&&a!==void 0){const l=(i-o)/this.allAnimationStep,r=(a-n)/this.allAnimationStep,h=Math.floor(o+this.currentAnimationStep*l),c=Math.floor(n+this.currentAnimationStep*r);(t.x!==h||t.y!==c)&&(t.x=h,t.y=c)}}),this.currentAnimationStep++,this.graphInstance&&this.graphInstance.dataUpdated(),requestAnimationFrame(this.playAnimation.bind(this,s))}}class Gt extends ct{constructor(t,o,n){super(t,o,n);v(this,\"enableGatherNodes\",!1);v(this,\"layoutOptions\");v(this,\"levelDistanceArr\",[]);this.layoutOptions=t,u(\"new SeeksBidirectionalTreeLayouter:\",this.layoutOptions),this.layoutOptions.from||(this.layoutOptions.from=\"left\"),this.layoutOptions.levelDistance&&(typeof this.layoutOptions.levelDistance==\"string\"?this.levelDistanceArr=this.layoutOptions.levelDistance.split(\",\").map(i=>Number.parseInt(i)):Array.isArray(this.layoutOptions.levelDistance)&&(this.levelDistanceArr=this.layoutOptions.levelDistance)),this.enableGatherNodes=this.layoutOptions.enableGatherNodes}refresh(){return C(this,null,function*(){u(\"SeeksBidirectionalTreeLayouter:refresh:nodes:\",this.allNodes.length),yield this.placeNodes(this.allNodes,this.rootNode)})}analysisNodes4Didirectional(t,o,n,i,a){u(`${a} level ${n} size: ${o.length}`),o.length>i.max_length&&(i.max_length=o.length),n>i.max_deep&&(i.max_deep=n);const l={level:n,all_size:o.length,all_strength:0},r=[];o.forEach(c=>{c.lot||(c.lot={childs:[]}),c.lot.eached=!0,c.lot.subling=l,c.lot.level=n,t.push(c)});let h=0;o.forEach(c=>{let p=0,d=a===-1?c.targetFrom:c.targetTo;n!==0&&(d=c.targetNodes);let g=0;d.forEach(f=>{f.lot||(f.lot={eached:!1,childs:[]}),f.lot.eached||(f.lot.parent=c,x.isAllowShowNode(f)?(f.lot.eached=!0,f.lot.index_of_parent=g++,c.lot.childs.push(f),r.push(f),p++):c.lot.childs.push(f))}),c.lot.strength=p>0?p:1,l.all_strength+=c.lot.strength,c.lot.strength_plus=l.all_strength,c.lot.index_of_level=h,c.lot.childs_size=p,h++}),l.all_strength>i.max_strength&&(i.max_strength=l.all_strength),r.length>0?this.analysisNodes4Didirectional(t,r,n+a,i,a):(t.forEach(c=>{c.lot.childs_size>0&&(c.lot.strengthWithChilds=0)}),t.forEach(c=>{c.lot.childs_size===0&&(c.lot.strengthWithChilds=1,x.conductStrengthToParents(c))}),x.analysisDataTree([t[0]],0,a))}placeNodes(t,o){return C(this,null,function*(){if(u(\"SeeksBidirectionalTreeLayouter:placeNodes\"),o)u(\"layout by root:\",o);else{console.error(\"root is null\");return}u(\"allNodes:\",t.length),this.rootNode=o;let n=[];this.allNodes&&this.allNodes.length>0?(n.push(this.rootNode),n=x.getDescendantNodes(this.rootNode),u(\"groupNodes:\",n.length)):n=t,n.forEach(a=>{a.lot.eached=!1,a.lot.notLeafNode=!1,a.lot.childs=[],a.lot.parent=void 0,a.lot.index_of_parent=0,a.lot.strength=0,a.lot.strengthWithChilds_from=0,a.lot.strengthWithChilds=0,a.lot.placed=!1}),this.allNodes=t;let i={max_deep:1,max_length:1,max_strength:1};n=[],x.analysisNodes(n,[this.rootNode],0,i),n.forEach(a=>{a.lot.eached=!1,a.lot.notLeafNode=!1,a.lot.childs=[],a.lot.parent=void 0,a.lot.index_of_parent=0,a.lot.strength=0,a.lot.strengthWithChilds_from=0,a.lot.strengthWithChilds=0,a.lot.placed=!1}),u(\"groupNodes:\",n.length),n=[],i={max_deep:1,max_length:1,max_strength:1},this.analysisNodes4Didirectional(n,[this.rootNode],0,i,-1),u(\"groupNodes:L:\",n.length),this.placeNodesPosition(this.rootNode,n,i),n=[],i={max_deep:1,max_length:1,max_strength:1},this.analysisNodes4Didirectional(n,[this.rootNode],0,i,1),u(\"groupNodes:R:\",n.length),this.placeNodesPosition(this.rootNode,n,i),this.graphOptions.useAnimationWhenExpanded?(u(\"Play layout animation.....\"),yield this.animationLayout(),u(\"create rootNode coordinates:3\",o.x,o.y)):(this.allNodes.forEach(a=>{if(a.fixed===!0){a.lot.placed=!0;return}!x.isAllowShowNode(a)||(Number.isNaN(a.lot.x)&&(u(\"bad lot x:\",a.text,a.lot.x),a.lot.x=0),Number.isNaN(a.lot.y)&&(u(\"bad lot y:\",a.text,a.lot.y),a.lot.y=0),a.x=x.getNodeXByLotX(this.graphOptions,a),a.y=x.getNodeYByLotY(this.graphOptions,a),a.lot.placed=!0)}),u(\"create rootNode coordinates:1\",o.x,o.y))})}placeNodesPosition(t,o,n){if(t.fixed!==!0){const i=this.layoutOptions.centerOffset_x||0,a=this.layoutOptions.centerOffset_y||0;t.lot.x=i,t.lot.y=a,this.layoutOptions.fixedRootNode?(t.lot.x=x.getLotXByNodeX(this.graphOptions,t),t.lot.y=x.getLotYByNodeY(this.graphOptions,t)):this.layoutOptions.from===\"top\"?t.lot.y-=this.graphOptions.viewSize.height/2-100:this.layoutOptions.from===\"bottom\"?t.lot.y+=this.graphOptions.viewSize.height/2-200:this.layoutOptions.from===\"right\"?t.lot.x+=this.graphOptions.viewSize.width/2-100:t.lot.x-=this.graphOptions.viewSize.width/2-100,u(\"debug0910:Graph center:\",t.lot.x,t.lot.y,{_center_offset_x:i,_center_offset_y:a})}else t.origin_x===void 0&&(t.origin_x=t.x,t.origin_y=t.y),t.lot.x=t.origin_x,t.lot.y=t.origin_y,u(\"\\u56FA\\u5B9A\\u4F4D\\u7F6E\\u7684rootNode:\",t.text,t.x,t.y);t.lot.placed=!0,this.placeRelativePosition(t,o,n)}placeRelativePosition(t,o,n){const i=this.graphOptions.viewSize;if(this.layoutOptions.from===\"left\"||this.layoutOptions.from===\"right\"){const a=Z(this.layoutOptions.min_per_height)||80,l=Z(this.layoutOptions.max_per_height)||400,r=Z(this.layoutOptions.min_per_width)||430,h=Z(this.layoutOptions.max_per_width)||650,c=a||Math.min(80,l||80),p=l||Math.min(400,a||400),d=r||Math.min(430,h||430),g=h||Math.min(650,r||650);let f=Math.round((i.width-10)/(n.max_deep+2));f<d&&(f=d),f>g&&(f=g);let m=Math.round(i.height/(n.max_strength+1));m<c&&(m=c),m>p&&(m=p),o.forEach(_=>{_.fixed!==!0&&_.lot.placed!==!0&&_!==t&&(this.layoutOptions.from===\"right\"?_.lot.x=t.lot.x-this.getLevelDistance(_,_.lot.subling.level,f):_.lot.x=t.lot.x+this.getLevelDistance(_,_.lot.subling.level,f))}),o.forEach(_=>{_.fixed!==!0&&_.lot.level!==0&&(this.layoutOptions.layoutExpansionDirection===\"left\"||this.layoutOptions.layoutExpansionDirection===\"top\"?_.lot.y=t.lot.y-m*_.lot.strengthWithChilds_from:this.layoutOptions.layoutExpansionDirection===\"right\"||this.layoutOptions.layoutExpansionDirection===\"bottom\"?_.lot.y=t.lot.y+m*_.lot.strengthWithChilds_from:_.lot.y=t.lot.y+m*(n.max_strength/-2+_.lot.strengthWithChilds_from+_.lot.strengthWithChilds/2))}),this.gatherNodes(o,\"h\",m)}else{const a=Z(this.layoutOptions.min_per_height)||350,l=Z(this.layoutOptions.max_per_height)||400,r=Z(this.layoutOptions.min_per_width)||250,h=Z(this.layoutOptions.max_per_width)||500,c=a||Math.min(350,l||350),p=l||Math.min(400,a||400),d=r||Math.min(250,h||250),g=h||Math.min(500,r||500);let f=Math.round((i.width-10)/(n.max_strength+2));f<d&&(f=d),f>g&&(f=g);let m=Math.round((i.height-10)/(n.max_deep+2));m<c&&(m=c),m>p&&(m=p),o.forEach(_=>{_.fixed!==!0&&_.lot.placed!==!0&&_!==t&&(this.layoutOptions.from===\"bottom\"?_.lot.y=t.lot.y-this.getLevelDistance(_,_.lot.subling.level,m):_.lot.y=t.lot.y+this.getLevelDistance(_,_.lot.subling.level,m))}),o.forEach(_=>{_.fixed!==!0&&_.lot.level!==0&&(this.layoutOptions.layoutExpansionDirection===\"left\"||this.layoutOptions.layoutExpansionDirection===\"top\"?_.lot.x=t.lot.x-f*_.lot.strengthWithChilds_from:this.layoutOptions.layoutExpansionDirection===\"right\"||this.layoutOptions.layoutExpansionDirection===\"bottom\"?_.lot.x=t.lot.x+f*_.lot.strengthWithChilds_from:_.lot.x=t.lot.x+f*(n.max_strength/-2+_.lot.strengthWithChilds_from+_.lot.strengthWithChilds/2))}),this.gatherNodes(o,\"v\",f)}}gatherNodes(t,o,n){if(!this.enableGatherNodes)return;const i={};t.forEach(a=>{const l=a.lot.level+\"\";i[l]||(i[l]=[]),i[l].push(a),a.lot.movedNodeSizeBefore=1,a.lot.movedNodeSizeAfter=1}),t.forEach(a=>{if(a.fixed!==!0&&a.lot.level!==0){const l=a.lot.level+\"\",r=i[l];if(a.lot.strengthWithChilds===1&&a.lot.childs_size<=1){const h=this.getBloomingNearByParent(a,a.lot.parent,r,o);h&&(o===\"h\"?a.lot.y-h.lot.y>0?(a.lot.y=h.lot.y+n*h.lot.movedNodeSizeAfter,h.lot.movedNodeSizeAfter++):(a.lot.y=h.lot.y-n*h.lot.movedNodeSizeBefore,h.lot.movedNodeSizeBefore++):a.lot.x-h.lot.x>0?(a.lot.x=h.lot.x+n*h.lot.movedNodeSizeAfter,h.lot.movedNodeSizeAfter++):(a.lot.x=h.lot.x-n*h.lot.movedNodeSizeBefore,h.lot.movedNodeSizeBefore++))}}})}getBloomingNearByParent(t,o,n,i){let a=9999,l;for(const r of n)if(r.lot.childs_size>1&&r.lot.parent===o){const h=i===\"h\"?r.lot.y-o.lot.y:r.lot.x-o.lot.x;Math.abs(h)<a&&(a=Math.abs(h),l=r)}if(l&&l!==t)return l}getLevelDistance(t,o,n){const i=Math.abs(o);if(this.levelDistanceArr&&this.levelDistanceArr.length>0){let a=0;for(let l=0;l<i;l++){const r=l>=this.levelDistanceArr.length?this.levelDistanceArr[this.levelDistanceArr.length-1]:this.levelDistanceArr[l];a+=r}return o>0?a:a*-1}else return o*n}}function Fe(e,s,t,o,n,i,a,l,r){const h=n-e,c=i-s,p=Math.sqrt(h*h+c*c),d=r*c/p,g=-(r*h)/p,f=e+d,m=s+g,_=e-t/2,y=e+t/2,M=s-o/2,S=s+o/2;let z=[];if(h!==0){let D=(_-f)/h,V=m+D*c;V>=M&&V<=S&&z.push({x:_,y:V});let w=(y-f)/h,b=m+w*c;b>=M&&b<=S&&z.push({x:y,y:b})}if(c!==0){let D=(M-m)/c,V=f+D*h;V>=_&&V<=y&&z.push({x:V,y:M});let w=(S-m)/c,b=f+w*h;b>=_&&b<=y&&z.push({x:b,y:S})}let X=null,U=1/0;return z.forEach(D=>{const V=Math.sqrt((D.x-n)**2+(D.y-i)**2);V<U&&(U=V,X=D)}),X}const q={getRectPoint(e,s,t,o,n,i,a,l,r=!1,h=1,c=1,p=14){const d=c-(h-1)/2,g=e+n/2,f=s+i/2,m=t+a/2,_=o+l/2;if(h>1){const w=p*d,b=Fe(g,f,n,i,m,_,a,l,w);if(b)return b}const y=g<m?1:-1,M=f<_?1:-1;if(_===f)return{x:g+y*n/2,y:f};const S=Math.abs((m-g)/(_-f)),z=n/i;let X=0,U=0;S<z?(X=y*i/2*S+M*z,U=M*i/2):(X=y*n/2,U=M*n/2/S+y*z);const D=g+X,V=f+U;return{x:D,y:V}},getRectPointBasic(e,s,t,o,n,i,a,l){const r=e+n/2,h=s+i/2,c=t+a/2,p=o+l/2;let d=p===h?0:(c-r)/(p-h);d===0&&(d=(c-r)/(p-h+1));const g=n/l;let f=0,m=0,_=\"1\";return-1*g<d&&d<g?(_=\"2\",h<p?(f=i/2*d,m=i/2):(f=-1*i/2*d,m=-1*i/2)):(r<c?(f=1*n/2,m=1*n/2/d):(f=-1*n/2,m=-1*n/2/d),_=\"3\"),{x:r+f,y:h+m,_case:_}},getRectJoinPoint(e,s,t,o,n,i,a,l){const r=e+n/2,h=s+i/2,c=t+a/2,p=o+l/2,d=Math.round(Math.atan2(p-h,c-r)*180/3.14)+135;return d>=0&&d<90?{x:e+n/2,y:s-5}:d>=90&&d<180?{x:e+n+5,y:s+i/2}:d>=180&&d<270?{x:e+n/2,y:s+i+5}:{x:e-5,y:s+i/2}},getRectHJoinPoint(e,s,t,o,n,i,a){const l=i/2;return e+n<t?{x:e+n+5,y:s+l}:e+n<t+a?{x:e-5,y:s+l}:{x:e-5,y:s+l}},getRectLeftJoinPoint(e,s,t,o,n,i,a){const l=i/2;return{x:e,y:s+l}},getRectRightJoinPoint(e,s,t,o,n,i,a){const l=i/2;return{x:e+n,y:s+l}},getRectTopJoinPoint(e,s,t,o,n,i,a){return{x:e+n/2,y:s}},getRectBottomJoinPoint(e,s,t,o,n,i,a,l,r,h,c,p,d=14,g){return g!==void 0?{x:e+g,y:s+i}:{x:e+n/2,y:s+i}},getRectVJoinPoint(e,s,t,o,n,i,a,l){const r=n/2;return s+i<o?{y:s+i+5,x:e+r}:s+i<o+l?{y:s-5,x:e+r}:{y:s-5,x:e+r}},getBorderPoint(e,s,t,o,n,i,a,l,r){return r===0?this.getCirclePoint(e,s,t,o,n,i,a,l):this.getRectPoint(e,s,t,o,n,i,a,l)},getBorderPoint4MultiLine(e,s,t,o,n,i,a,l,r,h,c,p,d=14){return r===0?this.getCirclePoint4MultiLine(e,s,t,o,n,i,a,l,h,c,p,d):this.getRectPoint(e,s,t,o,n,i,a,l,h,c,p,d)},getCirclePoint(e,s,t,o,n,i,a,l){const r=t+a/2,h=o+l/2,c=e+n/2,p=s+i/2,d=r-c;if(d===0)return{x:c,y:p-i/2*(h<p?1:-1)};const f=(h-p)/d,m=Math.sqrt(1/(1/(n/2)**2+f**2/(i/2)**2))*(r<c?1:-1),_=f*m;return{x:c-m,y:p-_}},getCirclePoint4MultiLine(e,s,t,o,n,i,a,l,r,h,c,p,d=0){let g=t+a/2;const f=o+l/2;let m=e+n/2;const _=s+i/2;let y=g-m;y>-1&&y<1&&(g=g-2,m=m+2,y=-4);const z=(c-(h-1)/2)*p,X=f-_,U=Math.sqrt(y**2+X**2)*z/y,D=X/y,V=n/2,w=i/2,b=m<g?-1:1,N=(-1*V**2*D*U+V*w*Math.sqrt(Math.abs(w**2+D**2*V**2-U**2))/b)/(w**2+V**2*D**2),R=D*N+U;return{x:m-N,y:_-R}},getCirclePointBasic(e,s,t,o,n,i,a,l,r){const h=e+n/2,c=s+i/2,p=t+a/2,d=o+l/2,g=p-h,f=d-c,m=Math.sqrt(g*g+f*f),_=m-r,y=_*g/m*-1,M=_*f/m*-1;return{x:p+y,y:d+M}},getCirclePointPlus(e,s,t,o,n,i,a,l){const r=e+n/2,h=s+i/2,c=t+a/2,p=o+l/2,d=c-r,g=p-h,f=Math.sqrt(d*d+g*g),m=(f-n/2)*d/f*-1,_=(f-i/2)*g/f*-1;return{x:c+m,y:p+_}},getOvalPoint(e,s,t,o,n,i=180){const a=o*(360/n),l=(180-i+a)*Math.PI/180;return{x:e+t*Math.sin(l),y:s+t*Math.cos(l)*-1}},getAngleType(e,s){if(e>=0&&s>=0)return 1;if(e<0&&s>=0)return 2;if(e<0&&s<0)return 3;if(e>=0&&s<0)return 4},getTextAngle(e,s,t,o){let n=Math.atan2(o-s,t-e)*180/Math.PI;return n<0&&(n+=360),n>90&&n<=270&&(n+=180),n>=360&&(n-=360),Math.round(n)},getTreePointFromTop(e,s,t,o,n,i){return e?{x:e-300+Math.max(600/((n===1?2:n)-1),80)*o,y:s+t}:{x:(i.canvas_width-i.node_width)/2,y:(i.canvas_height-i.node_height)/2-200}},getTreePointFromRight(e,s,t,o,n,i){return e?{x:e-t,y:s-200+Math.max(400/((n===1?2:n)-1),80)*o}:{x:(i.canvas_width-i.node_width)/2+300,y:(i.canvas_height-i.node_height)/2}},getTreePointFromBottom(e,s,t,o,n,i){return e?{x:e-300+Math.max(600/((n===1?2:n)-1),80)*o,y:s-t}:{x:(i.canvas_width-i.node_width)/2,y:(i.canvas_height-i.node_height)/2+200}},getTreePointFromLeft(e,s,t,o,n,i){return e?{x:e+t,y:s-200+Math.max(400/((n===1?2:n)-1),80)*o}:{x:(i.canvas_width-i.node_width)/2-300,y:(i.canvas_height-i.node_height)/2}}};class dt extends ct{constructor(t,o,n){super(t,o,n);v(this,\"layoutOptions\");v(this,\"fastStart\",!1);v(this,\"maxLayoutTimes\",300);v(this,\"byNode\",!0);v(this,\"byLine\",!0);v(this,\"lockX\",!1);v(this,\"lockY\",!1);v(this,\"force_node_repulsion\",1);v(this,\"force_line_elastic\",1);v(this,\"justLayoutSingleNode\",!1);v(this,\"layoutTimes\",0);v(this,\"prev10\",[]);v(this,\"visibleNodes\",[]);v(this,\"viewUpdate\");v(this,\"calcNodeMap\",new WeakMap);v(this,\"forCalcNodes\",[]);v(this,\"_graphEventHandler\");v(this,\"maxVaildLineLength\",300);v(this,\"minVaildLineLength\",30);v(this,\"zeroEffectNodeDistance\",400);v(this,\"minNodeDistance\",30);v(this,\"maxMoveSpeed\",100);this.layoutOptions=t,this.layoutOptions.fastStart!==void 0&&(this.fastStart=this.layoutOptions.fastStart),this.layoutOptions.maxLayoutTimes!==void 0&&(this.maxLayoutTimes=this.layoutOptions.maxLayoutTimes),this.layoutOptions.byNode!==void 0&&(this.byNode=this.layoutOptions.byNode),this.layoutOptions.byLine!==void 0&&(this.byLine=this.layoutOptions.byLine),this.layoutOptions.force_node_repulsion!==void 0&&(this.force_node_repulsion=this.layoutOptions.force_node_repulsion),this.layoutOptions.force_line_elastic!==void 0&&(this.force_line_elastic=this.layoutOptions.force_line_elastic),this.layoutOptions.force_x_coefficient===void 0&&(this.layoutOptions.force_x_coefficient=1),this.layoutOptions.force_y_coefficient===void 0&&(this.layoutOptions.force_y_coefficient=1),this.layoutOptions.disableLiveChanges===void 0&&(this.layoutOptions.disableLiveChanges=!1),this.requireLinks=!0}refresh(){this.placeNodes(this.allNodes,this.rootNode)}placeNodes(t,o){if(u(\"!!!SeeksForceLayouter.placeNodes\"),o)u(\"layout by root:\",o);else{u(\"root is null:\",o);return}if(this.allNodes=t,this.rootNode=o,this.layoutOptions.fixedRootNode){if(!Number.isNaN(o.x)&&o.x!==void 0)o.lot.x=x.getLotXByNodeX(this.graphOptions,o),o.lot.y=x.getLotYByNodeY(this.graphOptions,o);else{const i=this.layoutOptions.centerOffset_x||0,a=this.layoutOptions.centerOffset_y||0;o.lot.x=0+i,o.lot.y=0+a}const n=this.easyAnalysisNodes(o);this.easyPlaceRelativePosition(o,n),n.forEach(i=>{if(i.fixed===!0||!x.isAllowShowNode(i))return;const a=i.offset_x||0,l=i.offset_y||0;i.x=i.lot.x+a-x.getNodeWidth(i,this.graphOptions)/2,i.y=i.lot.y+l-x.getNodeHeight(i,this.graphOptions)/2,i.lot.placed=!0})}else this.fastStart?(u(\"!!!initNodesPosition fastStart\"),this.allNodes.forEach(n=>{n.fixed!==!0&&(n.lot.placed||(n.x||(n.x=Math.floor(Math.random()*200)-100),n.x||(n.y=Math.floor(Math.random()*200)-100),n.lot.placed=!0))})):(u(\"!!!initNodesPosition.....\"),this.easyPlaceGroupNodes(this.rootNode).forEach(i=>{if(i.fixed===!0||!x.isAllowShowNode(i))return;const a=i.offset_x||0,l=i.offset_y||0;i.x=i.lot.x+a-x.getNodeWidth(i,this.graphOptions)/2,i.y=i.lot.y+l-x.getNodeHeight(i,this.graphOptions)/2,i.lot.placed=!0}));if(u(\"Start Auto Layout.....\"),this.updateVisibleNodes(),this.isMainLayouer&&this.graphOptions.autoLayouting){u(\"!!!autoLayouting.....\");return}this.autoLayout(!0)}easyPlaceGroupNodes(t){if(u(\"[layout canvasOffset]\",this.graphOptions.viewSize,this.graphOptions.canvasSize),t){t.fixed?(t.origin_x===void 0&&(t.origin_x=t.x,t.origin_y=t.y),t.lot.x=t.origin_x,t.lot.y=t.origin_y,u(\"root fixed position:\",t.lot.x,t.lot.y)):this.layoutOptions.fixedRootNode?(t.lot.x=x.getLotXByNodeX(this.graphOptions,t),t.lot.y=x.getLotYByNodeY(this.graphOptions,t)):(t.lot.x=0,t.lot.y=0,u(\"root position:\",t.lot.x,t.lot.y));const o=this.easyAnalysisNodes(t);return this.easyPlaceRelativePosition(t,o),o}return[]}easyAnalysisNodes(t){this.allNodes.forEach(i=>{i.lot.eached=!1,i.lot.notLeafNode=!1,i.lot.childs=[],i.lot.parent=void 0,i.lot.index_of_parent=0,i.lot.strength=0,i.lot.placed=!1});const o=[],n={max_deep:1,max_length:1,max_strength:1};return x.analysisNodes4Didirectional(o,[t],0,n,0),o}easyPlaceRelativePosition(t,o){o.forEach(i=>{if(i.lot.subling.level===1){const a=i.lot.subling;if(a){const l=q.getOvalPoint(t.lot.x,t.lot.y,a.level*50,i.lot.strength_plus-i.lot.strength/2,a.all_strength,this.layoutOptions.startAngle);i.lot.x=l.x,i.lot.y=l.y}}}),o.forEach(i=>{const a=i.lot.subling;if(a&&a.level>1){const l=i.lot.parent.lot.strength_plus-i.lot.parent.lot.strength,h=(i.lot.parent.lot.strength_plus-l)/(i.lot.parent.lot.childs.length+1)*(i.lot.index_of_parent+1),c=q.getOvalPoint(t.lot.x,t.lot.y,(a.level-1)*(100+(a.level-1)*60)+50,l+h,i.lot.parent.lot.subling.all_strength,this.layoutOptions.startAngle);i.lot.x=c.x,i.lot.y=c.y}})}updateVisibleNodes(t){this.visibleNodes=[],t&&(this.allNodes=t),this.allNodes.forEach(o=>{x.isAllowShowNode(o)&&(o.lot?o.lot.placed=!0:(u(\"node miss lot:\",o.text),o.lot={placed:!0,childs:[]}),this.visibleNodes.push(o))}),this.resetCalcNodes(),this.connectToGraphInstance(),u(\"visibleNodes:\",this.visibleNodes.length)}autoLayout(t=!1){this.layoutTimes=0,this.updateVisibleNodes(),u(\"Layout set viewUpdate:\",this.viewUpdate),this.doForceLayout(0)}layoutFinished(){this.isMainLayouer&&(this.graphOptions.autoLayouting=!1),u(\"Layout finished\"),this.layoutOptions.disableLiveChanges&&(this.visibleNodes.forEach(t=>{if(t.fixed)return;const o=this.calcNodeMap.get(t);o&&(t.x=o.x,t.y=o.y)}),this.viewUpdate&&this.viewUpdate(),u(\"Layout apply finished\")),this.disConnectToGraphInstance()}resetCalcNodes(){u(\"resetCalcNodes:\",this.visibleNodes.length),this.forCalcNodes=[],this.calcNodeMap=new WeakMap,this.visibleNodes.forEach(t=>{const o={rgNode:t,Fx:0,Fy:0,x:t.x,y:t.y,ignoreForce:t.dragging||this.justLayoutSingleNode&&!t.singleNode,force_weight:t.force_weight||1,forceCenterOffset_X:(t.width||t.el.offsetWidth||60)/2,forceCenterOffset_Y:(t.height||t.el.offsetHeight||60)/2,fixed:t.fixed||!1};this.forCalcNodes.push(o),this.calcNodeMap.set(t,o)})}doForceLayout(t){if(this.graphOptions.instanceDestroyed){u(\"stop layout:instanceDestroyed\"),this.layoutFinished();return}let o=\"0\";if(t>0?(this.prev10.length>=10&&(this.prev10.splice(0,1),o=(1e3/((this.prev10[this.prev10.length-1]-this.prev10[0])/10)).toFixed(1)),this.prev10.push(t)):this.visibleNodes.length===0&&this.updateVisibleNodes(),u(\"this.layoutTimes:\",this.layoutTimes,\"of\",this.maxLayoutTimes,\"Current refresh rate:\",o,\"Hz\",this.visibleNodes.length),this.layoutTimes>this.maxLayoutTimes){this.layoutFinished();return}this.isMainLayouer&&(this.graphOptions.autoLayouting=!0),this.layoutTimes++,this.calcNodesPosition();for(const n of this.forCalcNodes)this.applyToNodePosition(n);this.layoutOptions.disableLiveChanges?requestAnimationFrame(this.doForceLayout.bind(this)):(this.viewUpdate&&this.viewUpdate(),requestAnimationFrame(this.doForceLayout.bind(this)))}graphEventHandle(t,...o){if(t===$.nodeDragStart){const n=o[0],i=this.calcNodeMap.get(n);i&&(i.ignoreForce=!0)}else if(t===$.nodeDragging){const n=o[0],i=o[1],a=o[2],l=this.calcNodeMap.get(n);l&&(l.x=i,l.y=a)}else if(t===$.nodeDragEnd){const n=o[0],i=this.calcNodeMap.get(n);i&&(i.ignoreForce=!1)}}connectToGraphInstance(){this.viewUpdate=()=>{this.graphInstance._dataUpdated()},this._graphEventHandler=this.graphEventHandle.bind(this),this.graphInstance.addEventListener(this._graphEventHandler)}disConnectToGraphInstance(){this.graphInstance.removeEventListener(this._graphEventHandler)}calcNodesPosition(){if(this.byNode)for(let t=0;t<this.forCalcNodes.length;t++){const o=this.forCalcNodes[t];if(!o.ignoreForce&&!o.fixed){for(let n=0;n<this.forCalcNodes.length;n++)if(t!==n){const i=this.forCalcNodes[n];if(i.ignoreForce)continue;this.addGravityByNode(o,i)}}}if(this.byLine){if(this.allLinks&&this.allLinks.length>0){for(const t of this.allLinks)if(!t.forDisplayOnly){let o=1;for(const n of t.relations)n.force_elastic&&n.force_elastic!==1&&(o=n.force_elastic);if(this.visibleNodes.includes(t.fromNode)&&this.visibleNodes.includes(t.toNode)){const n=this.calcNodeMap.get(t.fromNode),i=this.calcNodeMap.get(t.toNode);this.addElasticByLine(n,i,o)}}}else for(const t of this.visibleNodes)if(t.lot&&t.lot.parent){const o=this.calcNodeMap.get(t.lot.parent),n=this.calcNodeMap.get(t);this.addElasticByLine(o,n,1)}}}stop(){u(\"[SeeksForceLayouter]stop:\",this.graphOptions.autoLayouting),this.layoutTimes=1e6}addElasticByLine(t,o,n=1){const i=t.x,a=t.y,l=o.x,r=o.y;let h=Math.sqrt((a-r)**2+(i-l)**2);if(h<this.minVaildLineLength)return;h>this.maxVaildLineLength&&(h=this.maxVaildLineLength);const c=(h-this.minVaildLineLength)*.05*this.force_line_elastic*n,p=c,d=c,g=(i-l)/h,f=(a-r)/h;this.addFtoNode(t,g*p*-1,f*p*-1),this.addFtoNode(o,g*d,f*d)}addGravityByNode(t,o){const n=t.x,i=t.y,a=o.x,l=o.y;if(Math.abs(n-a)>this.zeroEffectNodeDistance||Math.abs(i-l)>this.zeroEffectNodeDistance)return;const r=Math.sqrt((i-l)**2+(n-a)**2);if(r>this.zeroEffectNodeDistance)return;let h=(this.zeroEffectNodeDistance-r)*.05*this.force_node_repulsion;r<this.minNodeDistance&&(h=h*2);const c=(n-a)/r,p=(i-l)/r;this.addFtoNode(t,c*h,p*h)}addFtoNode(t,o,n){if(t.ignoreForce||Number.isNaN(o)||Number.isNaN(n))return;o>50&&(o=50),n>50&&(n=50),o<-50&&(o=-50),n<-50&&(n=-50);const i=t.force_weight||1;this.lockX||(t.Fx+=o*(1/i)),this.lockY||(t.Fy+=n*(1/i))}applyToNodePosition(t){if(t.fixed)return;let o=t.Fx,n=t.Fy;if(o>this.maxMoveSpeed&&(o=this.maxMoveSpeed),n>this.maxMoveSpeed&&(n=this.maxMoveSpeed),o<-this.maxMoveSpeed&&(o=-this.maxMoveSpeed),n<-this.maxMoveSpeed&&(n=-this.maxMoveSpeed),t.x=t.x+o*this.layoutOptions.force_x_coefficient,t.y=t.y+n*this.layoutOptions.force_y_coefficient,!this.layoutOptions.disableLiveChanges){const i=t.rgNode;t.ignoreForce||(i.x=t.x,i.y=t.y)}t.Fx=t.Fx*.7,t.Fy=t.Fy*.7}}class Bt extends dt{constructor(t,o,n){super(t,o,n);v(this,\"layoutOptions\");this.layoutOptions=t}refresh(){return C(this,null,function*(){u(\"SeeksCenterLayouter:refresh\"),yield this.placeNodes(this.allNodes,this.rootNode)})}placeNodes(t,o){return C(this,null,function*(){if(u(\"SeeksCenterLayouter:placeNodes\"),!o){u(\"root is null:\",o);return}u(\"layout by root:\",o),this.allNodes=t,this.rootNode=o,t.forEach(a=>{a.lot.eached=!1,a.lot.notLeafNode=!1,a.lot.childs=[],a.lot.parent=void 0,a.lot.index_of_parent=0,a.lot.strength=0,a.lot.placed=!1});let n=[],i={max_deep:1,max_length:1,max_strength:1};if(x.analysisNodes(n,[this.rootNode],0,i),n=[],i={max_deep:1,max_length:1,max_strength:1},x.analysisNodes4Didirectional(n,[this.rootNode],0,i,0),o.fixed)o.origin_x===void 0&&(o.origin_x=o.x,o.origin_y=o.y),o.lot.x=o.origin_x,o.lot.y=o.origin_y,u(\"\\u56FA\\u5B9A\\u4F4D\\u7F6E\\u7684rootNode:\",o.text,o.x,o.y);else if(this.layoutOptions.fixedRootNode)o.lot.x=x.getLotXByNodeX(this.graphOptions,o),o.lot.y=x.getLotYByNodeY(this.graphOptions,o);else{const a=this.layoutOptions.centerOffset_x||0,l=this.layoutOptions.centerOffset_y||0;o.lot.x=0+a,o.lot.y=0+l}u(\"root position:\",o.lot.x,o.lot.y),this.placeRelativePosition(this.rootNode,n,i),this.graphOptions.useAnimationWhenExpanded?(u(\"Play layout animation.....\"),yield this.animationLayout()):n.forEach(a=>{if(a.fixed===!0||!x.isAllowShowNode(a))return;const l=a.offset_x||0,r=a.offset_y||0,h=-x.getNodeWidth(a,this.graphOptions)/2,c=-x.getNodeHeight(a,this.graphOptions)/2;a.x=a.lot.x+l+h,a.y=a.lot.y+r+c,a.lot.placed=!0})})}getLevelDistanceArr(){let t=[];if(this.layoutOptions.levelDistance&&(typeof this.layoutOptions.levelDistance==\"string\"?t=this.layoutOptions.levelDistance.split(\",\").map(o=>Number.parseInt(o)):Array.isArray(this.layoutOptions.levelDistance)&&(t=this.layoutOptions.levelDistance),t.length>0&&t.length<10))for(let o=t.length;o<10;o++)t.push(t[t.length-1]);return t}getLevelR(t,o){if(t.length===0)return;let n=0;for(let i=0;i<o&&i<t.length;i++)n+=t[i];return n}placeRelativePosition(t,o,n){const i=this.layoutOptions.distance_coefficient===void 0?1:this.layoutOptions.distance_coefficient,a=this.getLevelDistanceArr(),l=Math.min(this.graphOptions.viewSize.height,this.graphOptions.viewSize.width)*.4;let r=Math.min(Math.max(l,150),400)*i;u(\"analyticResult:\",this.layoutOptions,n,l,r,i,a);let h=0;o.forEach(p=>{const d=p.lot.subling;if(d&&d.level===1){h=Math.round(d.all_size*60/Math.PI/2),h<r&&(h=r);const g=this.getLevelR(a,d.level)||d.level*h,f=q.getOvalPoint(t.lot.x,t.lot.y,g,p.lot.strength_plus-p.lot.strength/2,d.all_strength,this.layoutOptions.startAngle);p.lot.x=f.x,p.lot.y=f.y}});const c=Math.round(300*i);o.forEach(p=>{const d=p.lot.subling;if(d&&d.level>1){const g=p.lot.parent.lot.strength_plus-p.lot.parent.lot.strength,m=(p.lot.parent.lot.strength_plus-g)/(p.lot.parent.lot.childs_size+1)*(p.lot.index_of_parent+1),_=this.getLevelR(a,d.level)||(d.level-1)*c+h,y=q.getOvalPoint(t.lot.x,t.lot.y,_,g+m,p.lot.parent.lot.subling.all_strength,this.layoutOptions.startAngle);p.lot.x=y.x,p.lot.y=y.y}})}}class Tt extends dt{constructor(s,t,o){super(s,t,o)}refresh(){return C(this,null,function*(){yield this.placeNodes(this.allNodes,this.rootNode)})}placeNodes(s,t){return C(this,null,function*(){if(t)u(\"layout by root:\",t);else{u(\"root is null:\",t);return}this.allNodes=s,this.rootNode=t,s.forEach(r=>{r.lot.eached=!1,r.lot.notLeafNode=!1,r.lot.childs=[],r.lot.parent=void 0,r.lot.index_of_p_childs=0,r.lot.strength=0});const o=this.layoutOptions.centerOffset_x||0,n=this.layoutOptions.centerOffset_y||0,i={x:o,y:n},a=this.allNodes.length;let l=a*90/Math.PI/2;l<200&&(l=200),l>800&&(l=800),this.allNodes.forEach((r,h)=>{const c=q.getOvalPoint(i.x,i.y,l,h,a);r.lot.x=c.x,r.lot.y=c.y}),this.graphOptions.useAnimationWhenExpanded?(u(\"Play layout animation.....\"),yield this.animationLayout()):this.allNodes.forEach(r=>{if(r.fixed===!0||!x.isAllowShowNode(r))return;const h=r.offset_x||0,c=r.offset_y||0,p=-x.getNodeWidth(r,this.graphOptions)/2,d=-x.getNodeHeight(r,this.graphOptions)/2;r.x=r.lot.x+h+p,r.y=r.lot.y+c+d,r.lot.placed=!0})})}}class At extends ct{constructor(t,o,n){super(t,o,n);v(this,\"graphOptions\");v(this,\"layoutOptions\");v(this,\"allNodes\",[]);v(this,\"__origin_nodes\",[]);this.layoutOptions=t,this.graphOptions=o}refresh(){this.placeNodes(this.__origin_nodes,this.rootNode)}placeNodes(t,o){if(o)u(\"layout by root:\",o);else{u(\"root is null:\",o);return}u(\"allNodes:\",t.length),this.__origin_nodes=t,this.rootNode=o,t.forEach(i=>{i.lot.eached=!1,i.lot.notLeafNode=!1,i.lot.childs=[],i.lot.parent=void 0,i.lot.index_of_parent=0,i.lot.strength=0,i.lot.placed=!1,i.x||(i.x=0),i.y||(i.y=0),Number.isNaN(i.x)&&(i.x=0),Number.isNaN(i.y)&&(i.y=0)}),this.allNodes=[];const n={max_strength:1,max_deep:1,max_length:1};x.analysisNodes4Didirectional(this.allNodes,[this.rootNode],0,n,0),u(\"[layout canvasOffset]\",this.graphOptions.viewSize,this.graphOptions.canvasSize)}}class Ue extends ct{constructor(t,o,n){super(t,o,n);v(this,\"graphInstance\");v(this,\"layoutOptions\");v(this,\"levelDistanceArr\",[]);this.layoutOptions=t,u(\"new SeeksBidirectionalTreeLayouter:\",this.layoutOptions),this.layoutOptions.from||(this.layoutOptions.from=\"left\"),this.layoutOptions.levelDistance&&(typeof this.layoutOptions.levelDistance==\"string\"?this.levelDistanceArr=this.layoutOptions.levelDistance.split(\",\").map(i=>Number.parseInt(i)):Array.isArray(this.layoutOptions.levelDistance)&&(this.levelDistanceArr=this.layoutOptions.levelDistance)),this.requireLinks=!0,this.graphInstance=n}refresh(){return C(this,null,function*(){u(\"SeeksBidirectionalTreeLayouter:refresh:nodes:\",this.allNodes.length),yield this.placeNodes(this.allNodes,this.rootNode)})}analysisNodes4Didirectional(t,o,n,i){this.analysisBothWay(t,o,n,i);const a={};t.forEach(h=>{const c=h.lot.level+\"\";a[c]||(a[c]=[]),a[c].push(h),h.lot.subling={level:h.lot.level,all_size:0,all_strength:0}}),t.forEach(h=>{const c=h.lot.level+\"\",p=a[c],d=p.length;h.lot.index_of_level=p.indexOf(h),h.lot.subling.all_size=d,h.lot.subling.all_strength+=h.lot.strength||1,h.lot.strength_plus=h.lot.subling.all_strength}),t.forEach(h=>{h.lot.childs_size>0&&(h.lot.strengthWithChilds=0)}),t.forEach(h=>{h.lot.childs_size===0&&(h.lot.strengthWithChilds=1,x.conductStrengthToParents(h))});const l=Object.keys(a).map(h=>Number.parseInt(h)).sort(),r=h=>{const c=h+\"\",p=a[c];let d=0;p.forEach(g=>{g.lot.parent&&d<g.lot.parent.lot.strengthWithChilds_from&&(d=g.lot.parent.lot.strengthWithChilds_from),h===0?d+=1:g.lot.strengthWithChilds_from=d,u(\"levels:\",h,d,g.text,g.lot.strengthWithChilds),d+=g.lot.strengthWithChilds})};[0].forEach(r),l.filter(h=>h>0).forEach(r),l.filter(h=>h<0).forEach(r)}analysisBothWay(t,o,n,i){u(`level ${n} size: ${o.length}`),o.length>i.max_length&&(i.max_length=o.length),n>i.max_deep&&(i.max_deep=n);const a={level:n,all_size:o.length,all_strength:0};o.forEach(r=>{r.lot||(r.lot={childs:[]}),r.lot.eached=!0,r.lot.subling=a,r.lot.level=n,t.push(r)});let l=0;o.forEach(r=>{let h=0,c=0,p=[];r.targetFrom.forEach(d=>{d.lot||(d.lot={eached:!1,childs:[]}),d.lot.eached||(d.lot.parent=r,x.isAllowShowNode(d)?(d.lot.eached=!0,d.lot.index_of_parent=c++,r.lot.childs.push(d),p.push(d),h++):r.lot.childs.push(d))}),this.analysisBothWay(t,p,n-1,i),p=[],r.targetTo.forEach(d=>{d.lot||(d.lot={eached:!1,childs:[]}),d.lot.eached||(d.lot.parent=r,x.isAllowShowNode(d)?(d.lot.eached=!0,d.lot.index_of_parent=c++,r.lot.childs.push(d),p.push(d),h++):r.lot.childs.push(d))}),this.analysisBothWay(t,p,n+1,i),r.lot.strength=h>0?h:1,a.all_strength+=r.lot.strength,r.lot.strength_plus=a.all_strength,r.lot.index_of_level=l,r.lot.childs_size=h,l++}),a.all_strength>i.max_strength&&(i.max_strength=a.all_strength)}placeNodes(t,o){return C(this,null,function*(){if(u(\"SeeksBidirectionalTreeLayouter:placeNodes\"),o)u(\"layout by root:\",o);else{console.error(\"root is null\");return}this.rootNode=o,this.allNodes=t,u(\"allNodes:\",t.length),t.forEach(h=>{h.lot.eached=!1,h.lot.notLeafNode=!1,h.lot.childs=[],h.lot.parent=void 0,h.lot.index_of_parent=0,h.lot.strength=0,h.lot.strengthWithChilds_from=0,h.lot.strengthWithChilds=0,h.lot.placed=!1});let n=[],i={max_deep:1,max_length:1,max_strength:1};x.analysisNodes(n,[this.rootNode],0,i),n=[],i={max_deep:1,max_length:1,max_strength:1},this.analysisNodes4Didirectional(n,[this.rootNode],0,i),this.placeNodesPosition(this.rootNode,n,i),u(\"allNodes:\",n.length),this.graphOptions.useAnimationWhenExpanded?(u(\"Play layout animation.....\"),yield this.animationLayout(),u(\"create rootNode coordinates:3\",o.x,o.y)):(this.allNodes.forEach(h=>{if(h.fixed===!0){h.lot.placed=!0;return}!x.isAllowShowNode(h)||(Number.isNaN(h.lot.x)&&(u(\"bad lot x:\",h.text,h.lot.x),h.lot.x=0),Number.isNaN(h.lot.y)&&(u(\"bad lot y:\",h.text,h.lot.y),h.lot.y=0),h.x=x.getNodeXByLotX(this.graphOptions,h),h.y=x.getNodeYByLotY(this.graphOptions,h),h.lot.placed=!0)}),u(\"create rootNode coordinates:1\",o.x,o.y));const a=n.filter(h=>h.lot.level===0),l=[];this.allLinks.forEach(h=>{a.includes(h.fromNode)&&!a.includes(h.toNode)&&l.push(h.toNode),a.includes(h.toNode)&&!a.includes(h.fromNode)&&l.push(h.fromNode)}),l.forEach(h=>{h.fixed=!0}),a.push(...l);const r=new dt({layoutName:\"force\",maxLayoutTimes:100,force_node_repulsion:.1,force_line_elastic:1,fixedRootNode:!0},this.graphOptions,this.graphInstance);r.isMainLayouer=!1,r.requireLinks=!0,this.layoutOptions.from===\"left\"||this.layoutOptions.from===\"right\"?r.lockX=!0:r.lockY=!0,r.visibleNodes=a,r.setLinks(this.allLinks),r.viewUpdate=this.viewUpdate,r.resetCalcNodes(),r.doForceLayout(0)})}placeNodesPosition(t,o,n){if(t.fixed!==!0){const i=this.layoutOptions.centerOffset_x||0,a=this.layoutOptions.centerOffset_y||0;t.lot.x=i,t.lot.y=a,this.layoutOptions.fixedRootNode?(t.lot.x=x.getLotXByNodeX(this.graphOptions,t),t.lot.y=x.getLotYByNodeY(this.graphOptions,t)):this.layoutOptions.from===\"top\"?t.lot.y-=this.graphOptions.viewSize.height/2-100:this.layoutOptions.from===\"bottom\"?t.lot.y+=this.graphOptions.viewSize.height/2-200:this.layoutOptions.from===\"right\"?t.lot.x+=this.graphOptions.viewSize.width/2-100:t.lot.x-=this.graphOptions.viewSize.width/2-100,u(\"debug0910:Graph center:\",t.lot.x,t.lot.y,{_center_offset_x:i,_center_offset_y:a})}else t.origin_x===void 0&&(t.origin_x=t.x,t.origin_y=t.y),t.lot.x=t.origin_x,t.lot.y=t.origin_y,u(\"\\u56FA\\u5B9A\\u4F4D\\u7F6E\\u7684rootNode:\",t.text,t.x,t.y);t.lot.placed=!0,this.placeRelativePosition(t,o,n)}placeRelativePosition(t,o,n){const i=this.graphOptions.viewSize;if(this.layoutOptions.from===\"left\"||this.layoutOptions.from===\"right\"){const a=Z(this.layoutOptions.min_per_height)||80,l=Z(this.layoutOptions.max_per_height)||400,r=Z(this.layoutOptions.min_per_width)||430,h=Z(this.layoutOptions.max_per_width)||650;let c=Math.round((i.width-10)/(n.max_deep+2));c<r&&(c=r),c>h&&(c=h);let p=Math.round(i.height/(n.max_strength+1));p<a&&(p=a),p>l&&(p=l),o.forEach(d=>{d.fixed!==!0&&d.lot.placed!==!0&&d!==t&&(this.layoutOptions.from===\"right\"?d.lot.x=t.lot.x-this.getLevelDistance(d,d.lot.subling.level,c):d.lot.x=t.lot.x+this.getLevelDistance(d,d.lot.subling.level,c))}),o.forEach(d=>{d.fixed!==!0&&(d.lot.level===0?d!==t&&(d.lot.y=t.lot.y+p*d.lot.index_of_level):d.lot.y=t.lot.y+p*(n.max_strength/-2+d.lot.strengthWithChilds_from+d.lot.strengthWithChilds/2))})}else{const a=Z(this.layoutOptions.min_per_height)||350,l=Z(this.layoutOptions.max_per_height)||400,r=Z(this.layoutOptions.min_per_width)||250,h=Z(this.layoutOptions.max_per_width)||500;let c=Math.round((i.width-10)/(n.max_strength+2));c<r&&(c=r),c>h&&(c=h);let p=Math.round((i.height-10)/(n.max_deep+2));p<a&&(p=a),p>l&&(p=l),o.forEach(d=>{d.fixed!==!0&&d.lot.placed!==!0&&d!==t&&(this.layoutOptions.from===\"bottom\"?d.lot.y=t.lot.y-this.getLevelDistance(d,d.lot.subling.level,p):d.lot.y=t.lot.y+this.getLevelDistance(d,d.lot.subling.level,p))}),o.forEach(d=>{d.fixed!==!0&&d.lot.level!==0&&(d.lot.x=t.lot.x+c*(n.max_strength/-2+d.lot.strengthWithChilds_from+d.lot.strengthWithChilds/2))})}}getLevelDistance(t,o,n){const i=Math.abs(o);if(this.levelDistanceArr&&this.levelDistanceArr.length>0){let a=0;for(let l=0;l<i;l++){const r=this.levelDistanceArr[l]||100;a+=r}return o>0?a:a*-1}else return o*n}}class je extends ct{constructor(t,o,n){super(t,o,n);v(this,\"enableGatherNodes\",!1);v(this,\"layoutOptions\");v(this,\"levelDistanceArr\",[]);this.layoutOptions=t,u(\"new SeeksBidirectionalTreeLayouter:\",this.layoutOptions),this.layoutOptions.from||(this.layoutOptions.from=\"left\"),this.layoutOptions.levelDistance&&(typeof this.layoutOptions.levelDistance==\"string\"?this.levelDistanceArr=this.layoutOptions.levelDistance.split(\",\").map(i=>Number.parseInt(i)):Array.isArray(this.layoutOptions.levelDistance)&&(this.levelDistanceArr=this.layoutOptions.levelDistance)),this.enableGatherNodes=this.layoutOptions.enableGatherNodes}refresh(){return C(this,null,function*(){u(\"SeeksBidirectionalTreeLayouter:refresh:nodes:\",this.allNodes.length),yield this.placeNodes(this.allNodes,this.rootNode)})}analysisNodes4Didirectional(t,o,n,i,a){u(`${a} level ${n} size: ${o.length}`),o.length>i.max_length&&(i.max_length=o.length),n>i.max_deep&&(i.max_deep=n);const l={level:n,all_size:o.length,all_strength:0},r=[];o.forEach(c=>{c.lot||(c.lot={childs:[]}),c.lot.eached=!0,c.lot.subling=l,c.lot.level=n,t.push(c)});let h=0;o.forEach(c=>{let p=0,d=a===-1?c.targetFrom:c.targetTo;n!==0&&(d=c.targetNodes);let g=0;d.forEach(f=>{f.lot||(f.lot={eached:!1,childs:[]}),f.lot.eached||(f.lot.parent=c,x.isAllowShowNode(f)?(f.lot.eached=!0,f.lot.index_of_parent=g++,c.lot.childs.push(f),r.push(f),p++):c.lot.childs.push(f))}),c.lot.strength=p>0?p:1,l.all_strength+=c.lot.strength,c.lot.strength_plus=l.all_strength,c.lot.index_of_level=h,c.lot.childs_size=p,h++}),l.all_strength>i.max_strength&&(i.max_strength=l.all_strength),r.length>0?this.analysisNodes4Didirectional(t,r,n+a,i,a):(t.forEach(c=>{c.lot.strengthWithChilds=1,x.conductStrengthToParents4Folder(c)}),x.analysisDataFolder([t[0]],0,a))}placeNodes(t,o){return C(this,null,function*(){if(u(\"SeeksBidirectionalTreeLayouter:placeNodes\"),o)u(\"layout by root:\",o);else{console.error(\"root is null\");return}this.rootNode=o,this.allNodes=t,u(\"allNodes:\",t.length),t.forEach(a=>{a.lot.eached=!1,a.lot.notLeafNode=!1,a.lot.childs=[],a.lot.parent=void 0,a.lot.index_of_parent=0,a.lot.strength=0,a.lot.strengthWithChilds_from=0,a.lot.strengthWithChilds=0,a.lot.placed=!1});let n=[],i={max_deep:1,max_length:1,max_strength:1};x.analysisNodes(n,[this.rootNode],0,i),n=[],i={max_deep:1,max_length:1,max_strength:1},this.analysisNodes4Didirectional(n,[this.rootNode],0,i,1),this.placeNodesPosition(this.rootNode,n,i),u(\"allNodes:\",n.length),this.graphOptions.useAnimationWhenExpanded?(u(\"Play layout animation.....\"),yield this.animationLayout(),u(\"create rootNode coordinates:3\",o.x,o.y)):(this.allNodes.forEach(a=>{if(a.fixed===!0){a.lot.placed=!0;return}!x.isAllowShowNode(a)||(Number.isNaN(a.lot.x)&&(u(\"bad lot x:\",a.text,a.lot.x),a.lot.x=0),Number.isNaN(a.lot.y)&&(u(\"bad lot y:\",a.text,a.lot.y),a.lot.y=0),a.x=x.getNodeXByLotX(this.graphOptions,a),a.y=x.getNodeYByLotY(this.graphOptions,a),a.lot.placed=!0)}),u(\"create rootNode coordinates:1\",o.x,o.y))})}placeNodesPosition(t,o,n){if(t.fixed!==!0){const i=this.layoutOptions.centerOffset_x||0,a=this.layoutOptions.centerOffset_y||0;t.lot.x=i,t.lot.y=a,this.layoutOptions.fixedRootNode?(t.lot.x=x.getLotXByNodeX(this.graphOptions,t),t.lot.y=x.getLotYByNodeY(this.graphOptions,t)):this.layoutOptions.from===\"right\"?t.lot.x+=this.graphOptions.viewSize.width/2-100:t.lot.x-=this.graphOptions.viewSize.width/2-100,u(\"debug0910:Graph center:\",t.lot.x,t.lot.y,{_center_offset_x:i,_center_offset_y:a})}else t.origin_x===void 0&&(t.origin_x=t.x,t.origin_y=t.y),t.lot.x=t.origin_x,t.lot.y=t.origin_y,u(\"\\u56FA\\u5B9A\\u4F4D\\u7F6E\\u7684rootNode:\",t.text,t.x,t.y);t.lot.placed=!0,this.placeRelativePosition(t,o,n)}placeRelativePosition(t,o,n){const i=Z(this.layoutOptions.min_per_width)||50,a=Z(this.layoutOptions.min_per_height)||40;o.forEach(l=>{l.fixed!==!0&&l.lot.placed!==!0&&l!==t&&(this.layoutOptions.from===\"right\"?l.lot.x=t.lot.x-this.getLevelDistance(l,l.lot.subling.level,i):l.lot.x=t.lot.x+this.getLevelDistance(l,l.lot.subling.level,i))}),o.forEach(l=>{l.fixed!==!0&&l.lot.level!==0&&(l.lot.y=t.lot.y+a*(l.lot.strengthWithChilds_from-1))}),this.gatherNodes(o,\"h\",a)}gatherNodes(t,o,n){if(!this.enableGatherNodes)return;const i={};t.forEach(a=>{const l=a.lot.level+\"\";i[l]||(i[l]=[]),i[l].push(a),a.lot.movedNodeSizeBefore=1,a.lot.movedNodeSizeAfter=1}),t.forEach(a=>{if(a.fixed!==!0&&a.lot.level!==0){const l=a.lot.level+\"\",r=i[l];if(a.lot.strengthWithChilds===1&&a.lot.childs_size<=1){const h=this.getBloomingNearByParent(a,a.lot.parent,r,o);h&&(o===\"h\"?a.lot.y-h.lot.y>0?(a.lot.y=h.lot.y+n*h.lot.movedNodeSizeAfter,h.lot.movedNodeSizeAfter++):(a.lot.y=h.lot.y-n*h.lot.movedNodeSizeBefore,h.lot.movedNodeSizeBefore++):a.lot.x-h.lot.x>0?(a.lot.x=h.lot.x+n*h.lot.movedNodeSizeAfter,h.lot.movedNodeSizeAfter++):(a.lot.x=h.lot.x-n*h.lot.movedNodeSizeBefore,h.lot.movedNodeSizeBefore++))}}})}getBloomingNearByParent(t,o,n,i){let a=9999,l;for(const r of n)if(r.lot.childs_size>1&&r.lot.parent===o){const h=i===\"h\"?r.lot.y-o.lot.y:r.lot.x-o.lot.x;Math.abs(h)<a&&(a=Math.abs(h),l=r)}if(l&&l!==t)return l}getLevelDistance(t,o,n){const i=Math.abs(o);if(this.levelDistanceArr&&this.levelDistanceArr.length>0){let a=0;for(let l=0;l<i;l++){const r=l>=this.levelDistanceArr.length?this.levelDistanceArr[this.levelDistanceArr.length-1]:this.levelDistanceArr[l];a+=r}return o>0?a:a*-1}else return o*n}}const xt=(e,s,t)=>{t||(console.warn(\"\\u6CE8\\u610F\\uFF0C\\u5728relation-graph@2.1.32\\u4EE5\\u53CA\\u66F4\\u6539\\u7248\\u672C\\u4E2D\\u4F7F\\u7528createLayout\\u65B9\\u6CD5\\u65F6\\uFF0C\\u9700\\u8981\\u63D0\\u4F9B\\u7B2C\\u4E09\\u4E2A\\u53C2\\u6570: graphInstance\"),console.warn(\"Note that when using the createLayout method in relation-graph@2.1.32 and changed versions, you need to provide a third parameter: graphInstance\")),wt(e);let o=null;if(e.layoutName===\"tree\"?o=new Gt(e,s,t):e.layoutName===\"center\"?o=new Bt(e,s,t):e.layoutName===\"circle\"?o=new Tt(e,s,t):e.layoutName===\"force\"?o=new dt(e,s,t):e.layoutName===\"fixed\"?o=new At(e,s,t):e.layoutName===\"smart-tree\"?o=new Ue(e,s,t):e.layoutName===\"folder\"&&(o=new je(e,s,t)),!o)throw new Error(\"unknown layout: \"+e.layoutName);return s.isNeedShowAutoLayoutButton=e.allowAutoLayoutIfSupport!==!1&&o.autoLayout!==void 0,o},wt=e=>{if(typeof e.centerOffset_x==\"string\"&&(e.centerOffset_x=parseInt(e.centerOffset_x)),typeof e.centerOffset_y==\"string\"&&(e.centerOffset_y=parseInt(e.centerOffset_y)),e.layoutName===\"center\"){const s=e;s.layoutDirection===void 0&&(s.layoutDirection=\"h\"),s.centerOffset_x===void 0&&(s.centerOffset_x=0),s.centerOffset_y===void 0&&(s.centerOffset_y=0),s.layoutDirection=void 0}else if(e.layoutName.includes(\"tree\")){const s=e;s.layoutDirection===void 0&&(s.layoutDirection=\"h\"),s.centerOffset_x===void 0&&(s.centerOffset_x=0),s.centerOffset_y===void 0&&(s.centerOffset_y=0),s.from===void 0&&(s.from=\"top\"),s.levelDistance===void 0&&(s.levelDistance=\"\"),(s.from===\"top\"||s.from===\"bottom\")&&(s.layoutDirection=\"v\",u(\"set layoutDirection=v\"),u(\"set defaultJunctionPoint=tb\"),s.min_per_width===void 0&&(s.min_per_width=100),s.max_per_width===void 0&&(s.max_per_width=500),s.min_per_height===void 0&&(s.min_per_height=300),s.max_per_height===void 0&&(s.max_per_height=500)),(s.from===\"left\"||s.from===\"right\")&&(s.layoutDirection=\"h\",u(\"set defaultJunctionPoint=lr\"),s.min_per_width===void 0&&(s.min_per_width=300),s.max_per_width===void 0&&(s.max_per_width=500),s.min_per_height===void 0&&(s.min_per_height=100),s.max_per_height===void 0&&(s.max_per_height=500))}else(e.layoutName===\"fixed\"||e.layoutName===\"force\")&&(e.layoutDirection=void 0)},Xe=Object.freeze(Object.defineProperty({__proto__:null,createLayout:xt,appendDefaultOptions4Layout:wt,default:{createLayout:xt,appendDefaultOptions4Layout:wt}},Symbol.toStringTag,{value:\"Module\"})),Et={id:\"rg-newNodeTemplate\",x:0,y:0,text:\"\",styleClass:\"\"};let Ye=0;const Ct=e=>{!e.backgroundImage&&(e.backgroundImage=e.backgrounImage),!e.backgroundImageNoRepeat&&(e.backgroundImageNoRepeat=e.backgrounImageNoRepeat),typeof e.graphOffset_x==\"string\"&&(e.graphOffset_x=parseInt(e.graphOffset_x)),typeof e.graphOffset_y==\"string\"&&(e.graphOffset_y=parseInt(e.graphOffset_y)),e.defaultPloyLineRadius&&(e.defaultPolyLineRadius=e.defaultPloyLineRadius);const s={instanceId:\"\",debug:!0,graphLoading:!1,graphLoadingText:\"\",showMaskWhenLayouting:!1,instanceDestroyed:!1,useHorizontalView:!1,oldVueVersion:!1,ovUseNodeSlot:!1,ovUseLineSlot:!1,ovUseToolbarSlot:!1,ovUseNodeExpandHolderSlot:!1,showDebugPanel:!1,backgroundColor:void 0,backgroundImage:void 0,backgroundImageNoRepeat:void 0,downloadImageFileName:\"\",disableZoom:!1,disableDragNode:!1,disableDragLine:!0,selectionMode:!1,moveToCenterWhenRefresh:!0,zoomToFitWhenRefresh:!0,useAnimationWhenRefresh:!1,defaultFocusRootNode:!0,disableNodeClickEffect:!1,disableLineClickEffect:!1,allowShowFullscreenMenu:!0,allowShowZoomMenu:!0,allowAutoLayoutIfSupport:!0,allowShowRefreshButton:!0,allowShowDownloadButton:!0,backgrounImageNoRepeat:!1,allowShowMiniToolBar:!0,toolBarVersion:\"v2\",toolBarDirection:\"v\",toolBarPositionH:\"right\",toolBarPositionV:\"center\",allowSwitchLineShape:!1,allowSwitchJunctionPoint:!1,isMoveByParentNode:!1,defaultExpandHolderPosition:\"hide\",defaultExpandHolderColor:void 0,defaultNodeBorderWidth:void 0,defaultNodeColor:\"#409EFF\",defaultNodeBorderColor:\"#0c7ff6\",defaultNodeFontColor:\"#ffffff\",defaultLineColor:\"#cccccc\",checkedLineColor:\"#FD8B37\",defaultLineFontColor:void 0,defaultLineWidth:1,defaultLineShape:void 0,defaultLineTextOffset_x:void 0,defaultLineTextOffset_y:void 0,defaultNodeShape:void 0,defaultNodeWidth:void 0,defaultNodeHeight:void 0,defaultShowLineLabel:!0,hideNodeContentByZoom:!1,defaultJunctionPoint:void 0,defaultBottomJuctionPoint_X:void 0,defaultPolyLineRadius:void 0,disableDragCanvas:!1,placeSingleNode:!0,placeOtherGroup:!0,lineUseTextPath:!1,lineTextMaxLength:66,multiLineDistance:14,graphOffset_x:0,graphOffset_y:0,viewSize:{width:300,height:300},viewELSize:{width:1300,height:800,left:0,top:100},viewNVInfo:{width:1300,height:800,x:0,y:100},canvasNVInfo:{width:1300,height:800,x:0,y:100},defaultLineMarker:{markerWidth:12,markerHeight:12,refX:6,refY:6,color:void 0,data:\"M2,2 L10,6 L2,10 L6,6 L2,2\"},allowShowSettingPanel:!1,allowShowMiniNameFilter:!0,fullscreen:!1,checkedNodeId:\"\",checkedLineId:\"\",checkedLinkId:\"\",layouts:[],layoutLabel:\"\",layoutName:\"tree\",layoutClassName:\"\",layoutDirection:\"h\",useAnimationWhenExpanded:!1,reLayoutWhenExpandedOrCollapsed:!1,autoLayouting:!1,layouter:void 0,isNeedShowAutoLayoutButton:!1,canvasZoom:100,showEasyView:!1,performanceMode:!1,canvasOpacity:1,showSingleNode:!0,showNodeLabel:!0,showNodeShortLabel:!0,canvasSize:{width:10,height:10},canvasOffset:{x:25,y:27,zoom_buff_x:0,zoom_buff_y:0},creatingSelection:!1,selectionView:{x:25,y:27,width:0,height:0},creatingNodePlot:!1,showTemplateNode:!0,newNodeTemplate:ft(JSON.parse(JSON.stringify(Et))),creatingLinePlot:!1,newLineTemplate:{from:\"newRelationTemplate-from\",to:\"newRelationTemplate-to\",color:\"\",text:\"new line\"},newLinkTemplate:{fromNode:null,toNodeObject:null,toNode:{nothing:!0,x:400,y:400,el:{offsetWidth:30,offsetHeight:30}},relations:[{}]},data:{},editingLineController:{show:!1,link:null,line:null,startPoint:{x:0,y:0},endPoint:{x:0,y:0},text:{show:!0,x:0,y:0,width:10,height:10},ctrlPoints:[]},editingController:{show:!1,nodes:[],x:0,y:0,width:100,height:100},nodeConnectController:{show:!1,node:null,x:0,y:0,width:100,height:100},showReferenceLine:!0,editingReferenceLine:{show:!1,directionV:!1,directionH:!1,v_x:0,v_y:0,v_height:0,h_x:0,h_y:0,h_width:0},showMiniView:!1,miniViewVisibleHandle:{x:0,y:0,width:100,height:100,emptyContent:!1},snapshotting:!1};if(s.newLineTemplate=ht(s.newLineTemplate),e.layout&&e.layouts)throw new Error(\"Graph options cannot have both layout and layouts properties !\");const t=e.debug===!0;t&&u(\"RGOptions:user instance options:\",e),window&&(window.relationGraphDebug=t);const o=Object.keys(s);e&&Object.keys(e).forEach(i=>{if(i===\"layouts\"||i===\"layout\")return;const a=e[i];if(!o.includes(i)){u(\"RGOptions: unknow option key:\",i);return}if(typeof a==\"object\"){u(\"RGOptions:user setting object:\",i,a);const l=s[i];if(l&&!Array.isArray(l)&&a)Object.keys(l).forEach(r=>{l[r]=a[r]});else if(Array.isArray(l)){const r=[];a.forEach(h=>{h&&typeof h==\"object\"?r.push(JSON.parse(JSON.stringify(h))):r.push(h)}),s[i]=r}else s[i]=a}else s[i]=a});let n=[];return!e.layouts||!Array.isArray(e.layouts)||e.layouts.length===0?e.layout?n=[e.layout]:n=[{label:\"\\u4E2D\\u5FC3\",layoutName:\"center\",layoutDirection:\"v\"}]:n=e.layouts,u(\"final layouts:\",n),s.layouts=n.map(i=>JSON.parse(JSON.stringify(i))),s.disableNodeClickEffect&&(s.defaultFocusRootNode=!1),wt(s.layouts[0]),bt(s.layouts[0],s),s},bt=(e,s)=>{u(\"applyDefaultOptionsByLayout\",e.layoutName,s),e.layoutName===\"SeeksCenterLayouter\"||e.layoutName===\"center\"?(s.defaultNodeShape===void 0&&(s.defaultNodeShape=0),s.defaultLineShape===void 0&&(s.defaultLineShape=1),s.defaultJunctionPoint===void 0&&(s.defaultJunctionPoint=\"border\")):e.layoutName===\"SeeksBidirectionalTreeLayouter\"||e.layoutName.includes(\"tree\")?(s.defaultNodeBorderWidth===void 0&&(s.defaultNodeBorderWidth=0),s.defaultNodeShape===void 0&&(s.defaultNodeShape=1),s.defaultLineShape===void 0&&(s.defaultLineShape=4),(e.from===\"top\"||e.from===\"bottom\")&&(s.layoutDirection=\"v\",u(\"set layoutDirection=v\"),s.defaultLineShape===4&&(s.defaultJunctionPoint===void 0&&(s.defaultJunctionPoint=\"tb\"),u(\"set defaultJunctionPoint=tb\"))),(e.from===\"left\"||e.from===\"right\")&&(s.layoutDirection=\"h\",u(\"set layoutDirection=h\"),s.defaultLineShape===4&&(s.defaultJunctionPoint===void 0&&(s.defaultJunctionPoint=\"lr\"),u(\"set defaultJunctionPoint=lr\")))):e.layoutName===\"fixed\"?s.zoomToFitWhenRefresh=!1:e.layoutName===\"force\"&&(s.moveToCenterWhenRefresh=!1,s.zoomToFitWhenRefresh=!1),s.defaultNodeShape===void 0&&(s.defaultNodeShape=0),s.defaultLineShape===void 0&&(s.defaultLineShape=1),s.defaultJunctionPoint===void 0&&(s.defaultJunctionPoint=\"border\")},Lt=e=>{const s=Ct(e);return u(\"RGOptions:new RGOptions:by:\",e),u(\"RGOptions:new RGOptions:\",s),s.instanceId||(s.instanceId=`RGIns-${Ye++}`),s},Ze=Object.freeze(Object.defineProperty({__proto__:null,newNodeTemplate:Et,createDefaultConfig:Ct,applyDefaultOptionsByLayout:bt,newInstanceOptions:Lt,default:{newInstanceOptions:Lt,createDefaultConfig:Ct,applyDefaultOptionsByLayout:bt}},Symbol.toStringTag,{value:\"Module\"}));class Je{constructor(s,t){v(this,\"options\");v(this,\"listeners\");v(this,\"isReact\",!1);v(this,\"updateViewHook\",()=>{});v(this,\"_dataUpdating\",!1);v(this,\"_dataUpdatingNext\",!1);v(this,\"eventHandlers\",[]);v(this,\"_hook\");this.listeners=t,this.options=Lt(s),u(\"new RelationGraph:\",this)}enableDebugLog(s){this.options.debug=s,window&&(window.relationGraphDebug=s)}setUpdateViewHook(s){this.isReact=!0,this.updateViewHook=s}_dataUpdated(){if(this._dataUpdating){this._dataUpdatingNext=!0;return}this._dataUpdating=!0,requestAnimationFrame(this._doSomethingAfterDataUpdated.bind(this))}_doSomethingAfterDataUpdated(){u(\"_dataUpdated:\",this._dataUpdatingNext),this._dataUpdating=!0,this.updateVisbleViewNodes(),this.updateEasyView(),this.updateViewHook(),this._dataUpdating=!1,this._dataUpdatingNext&&(this._dataUpdatingNext=!1,requestAnimationFrame(this._doSomethingAfterDataUpdated.bind(this)))}addEventListener(s){this.eventHandlers.includes(s)||this.eventHandlers.push(s)}removeEventListener(s){const t=this.eventHandlers.indexOf(s);t!==-1&&this.eventHandlers.splice(t,1)}setEventEmitHook(s){this._hook=s}emitEvent(s,...t){let o=this.defaultEventHandler(s,...t);for(const n of this.eventHandlers){const i=n(s,...t);o!=null&&(o=i)}if(this._hook&&this._hook(s,...t),o!=null)return o}defaultEventHandler(s,...t){if(s===$.nodeDragStart)this.listeners.onNodeDragStart&&this.listeners.onNodeDragStart(t[0],t[1]);else if(s===$.nodeDragging){if(this.listeners.onNodeDragging){const o=t[0],n=t[1],i=t[2],a=t[5];return this.listeners.onNodeDragging(o,n,i,a)}}else if(s===$.nodeDragEnd){const o=t[0],n=t[1];this.listeners.onNodeDragEnd&&this.listeners.onNodeDragEnd(o,n)}else if(s===$.onZoomEnd)this.listeners.onZoomEnd&&this.listeners.onZoomEnd();else if(s===$.beforeChangeLayout){if(this.listeners.beforeChangeLayout){const o=t[0];return this.listeners.beforeChangeLayout(o)}}else if(s===$.onNodeClick){if(this.listeners.onNodeClick){const o=t[0],n=t[1];this.listeners.onNodeClick(o,n)}}else if(s===$.onImageDownload){if(this.listeners.onImageDownload){const o=t[0],n=t[1];return this.listeners.onImageDownload(o,n)}}else if(s===$.onImageSaveAsFile){if(this.listeners.onImageSaveAsFile){const o=t[0],n=t[1],i=t[2];return this.listeners.onImageSaveAsFile(o,n,i)}}else if(s===$.onLineClick){if(this.listeners.onLineClick){const o=t[0],n=t[1],i=t[2];this.listeners.onLineClick(o,n,i)}}else if(s===$.onNodeExpand){if(this.listeners.onNodeExpand){const o=t[0],n=t[1];this.listeners.onNodeExpand(o,n)}}else if(s===$.onNodeCollapse){if(this.listeners.onNodeCollapse){const o=t[0],n=t[1];this.listeners.onNodeCollapse(o,n)}}else if(s===$.onCanvasDragEnd){if(this.listeners.onCanvasDragEnd){const o=t[0];this.listeners.onCanvasDragEnd(o)}}else if(s===$.onCanvasClick){if(this.listeners.onCanvasClick){const o=t[0];this.listeners.onCanvasClick(o)}}else if(s===$.onCanvasSelectionEnd){if(this.listeners.onCanvasSelectionEnd){const o=t[0],n=t[1];this.listeners.onCanvasSelectionEnd(o,n)}}else if(s===$.onContextmenu){if(this.listeners.onContextmenu){const o=t[0],n=t[1],i=t[2];this.listeners.onContextmenu(o,n,i)}}else if(s===$.onFullscreen&&this.listeners.onFullscreen)return this.listeners.onFullscreen(this.options.fullscreen)}}class qe extends Je{constructor(t,o){super(t,o);v(this,\"$dom\");v(this,\"$canvasDom\");v(this,\"resizeObserver\");v(this,\"resizeListenerMap\",new WeakMap);v(this,\"nodeMap\",new WeakMap);this.resizeObserver=new ResizeObserver((n,i)=>{for(const a of n){const l=this.resizeListenerMap.get(a.target);l?a.borderBoxSize?l(a.borderBoxSize[0].inlineSize,a.borderBoxSize[0].blockSize):l(a.target.clientWidth,a.target.clientHeight):a.borderBoxSize?this._onNodeResize(a.target,a.borderBoxSize[0].inlineSize,a.borderBoxSize[0].blockSize):this._onNodeResize(a.target,a.target.clientWidth,a.target.clientHeight)}})}setDom(t){this.$dom=t,this.addResizeListener(this.$dom,(o,n)=>{u(\"resizeListener:this.$dom\"),this.refreshNVAnalysisInfo(),this.updateEasyView(),setTimeout(()=>{u(\"resizeListener:updateVisbleViewNodes\"),this.zoom(-1),this.zoom(1),this.emitEvent($.viewResize,{width:o,height:n})},500)})}setCanvasDom(t){this.$canvasDom=t}getBoundingClientRect(){return this.$dom.getBoundingClientRect()}addResizeListener(t,o){this.resizeListenerMap.set(t,o),this.resizeObserver.observe(t)}_onNodeResize(t,o,n){if(o===0||n===0)return;const i=this.nodeMap.get(t),a=i.el.offsetWidth,l=i.el.offsetHeight;i&&(a!==o||l!==n)&&(u(\"Node resized:\",i.id,a,\",\",l,\" > \",o,\",\",n),this.updateNodeOffsetSize(i,o,n))}addNodeResizeListener(t,o){this.nodeMap.set(t,o),this.resizeObserver.observe(t)}removeNodeResizeListener(t){this.nodeMap.delete(t),this.resizeObserver.unobserve(t)}removeResizeListener(t){this.resizeListenerMap.delete(t),this.resizeObserver.unobserve(t)}}class Ke extends qe{constructor(t,o){super(t,o);v(this,\"graphData\",{rootNode:void 0,nodes:[],links:[],elementLines:[]});v(this,\"seeksNodeIdIndex\",0);v(this,\"allLineColors\",[]);v(this,\"userLayouerClass\");v(this,\"layouter\");v(this,\"reactiveData\");v(this,\"disableNextLayoutAnimation\",!1);v(this,\"nextLineId\",0);v(this,\"elLineUpdating\",!1)}setReactiveData(t,o){this.reactiveData=o,this.graphData=t,this.allLineColors=o.allLineColors,Object.assign(o.options,this.options),this.options=o.options}setReactiveDataVue3(t,o){this.reactiveData=o,this.graphData=t,this.allLineColors=o.allLineColors,Object.assign(o.options,this.options),this.options=o.options}_setOptions(t){const o=Lt(t);this.reactiveData?Object.assign(this.reactiveData.options,o):Object.assign(this.options,o)}_initLayoutByLayoutOptions(t){this.options.layoutClassName=t.layoutClassName,this.options.layoutLabel=t.label,this.options.layoutName=t.layoutName,this.options.layoutDirection=t.layoutDirection,this.layouter=xt(t,this.options,this)}initLayouter(){if(this.userLayouerClass)u(\"Use user layouter:\",this.userLayouerClass),this.layouter=this.userLayouerClass;else if(this.options.layouts&&this.options.layouts.length>0){const t=this.options.layouts[0];u(\"[change layout]Create default layouter\\uFF1A\",this.options.layoutName),this._initLayoutByLayoutOptions(t)}else u(\"Not set option: layout/layouts\\uFF01\");u(\"Layouter instance:\",this.layouter)}_setJsonData(t,o=!1){return C(this,null,function*(){yield this.clearGraph(),u(\"set jsonData:\",t),this.loadGraphJsonData(t)})}clearGraph(){return C(this,null,function*(){this.graphData.nodes=[],this.graphData.links=[],this.graphData.elementLines=[],this.graphData.rootNode=void 0})}clearElementLines(){return C(this,null,function*(){this.graphData.elementLines=[]})}generateNewNodeId(t=5){const o=this.generateNewUUID(t);return this.getNodeById(o)?this.generateNewNodeId(t+1):o}generateNewUUID(t=5){const o=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";let n=\"\";const i=t>30?30:t;for(let a=0;a<i;a++)n+=o[Math.floor(Math.random()*o.length)];return n}loadNodes(t){const o={};this.graphData.nodes.forEach(i=>{o[i.id]=i});const n=[];t.forEach(i=>{let a=o[i.id];a||(a=ft(i,this.options),a&&(a.seeks_id=this.seeksNodeIdIndex++,o[a.id]=a,n.push(a)))}),this.graphData.nodes.push(...n)}loadLines(t){const o={};this.graphData.nodes.forEach(a=>{o[a.id]=a});const n={};this.graphData.links.forEach(a=>{n[a.seeks_id]=a});const i=[];t.forEach(a=>{let l=!1,r,h;if(typeof a.from==\"object\"?r=a.from:r=o[a.from],typeof a.to==\"object\"?h=a.to:h=o[a.to],!r){console.error(\"Can not found from node:\",a);return}if(!h){console.error(\"Can not found to node:\",a);return}const c=`${r.seeks_id}-${h.seeks_id}`,p=`${h.seeks_id}-${r.seeks_id}`,d=ht(a);let g=n[c],f=!1;g||(g=n[p],g?f=!0:(l=!0,g={seeks_id:c,fromNode:r,toNode:h,appended:!1,forDisplayOnly:!0,relations:[]}));let m=d.arrow;d.isHideArrow||(m=this.getLineArrow(d.color)),r.targetNodes||(r.targetNodes=[]),h.targetNodes||(h.targetNodes=[]),d.forDisplayOnly||(r.targetNodes.includes(h)||r.targetNodes.push(h),h.targetNodes.includes(r)||h.targetNodes.push(r),r.targetTo.includes(h)||r.targetTo.push(h),h.targetFrom.includes(r)||h.targetFrom.push(r),g.forDisplayOnly=!1);let _=!1;for(let y=0;y<g.relations.length;y++)if(d.id&&g.relations[y].id===d.id){_=!0;break}_===!1&&(d.id||(d.id=this.getNextLineId(g)),d.isReverse=f,d.arrow=m,g.relations.push(d)),l&&(i.push(g),n[g.seeks_id]=g,g.appended=!1)}),this.graphData.links.push(...i)}getNextLineId(t){const o=this.nextLineId++,n=`${t.seeks_id}-${o}`;for(let i=0;i<t.relations.length;i++)if(t.relations[i].id===n)return this.getNextLineId(t);return n}flatNodeData(t,o,n,i){x.flatNodeData(t,o,n,i)}loadGraphJsonData(t){t.lines||(t.lines=t.relations,console.warn(\"[relation-graph] For compatibility with older versionsm, Use jsonData.relations as jsonData.lines, It is recommended that you define your data using\")),t.lines||(t.lines=t.links,console.warn(\"[relation-graph] For compatibility with older versionsm, Use jsonData.links as jsonData.lines, It is recommended that you define your data using\"));const o=t.nodes,n=[],i=[];this.flatNodeData(o,null,n,i),t.lines.forEach(a=>{i.push(a)}),this.loadNodes(n),u(\"Nodes is initialized\"),this.loadLines(i),this._dataUpdated(),setTimeout(()=>{t.elementLines&&this.addElementLines(t.elementLines)},500)}getLineArrow(t,o=!1,n=!1){const i=o?\"start-\":\"\";if(n)return`${this.options.instanceId}-${i}arrow-checked`;if(t){const a=Ve(t);return this.allLineColors.map(l=>l.id).includes(a)||this.allLineColors.push({id:a,color:t}),`${this.options.instanceId}-${i}arrow-${a}`}else return`${this.options.instanceId}-${i}arrow-default`}getNodes(){return this.graphData.nodes}getLinks(){return this.graphData.links}transRGNodeToJsonObject(t){const o=yt(t);return o.selected=!1,o}transRGLinkToJsonObject(t){const o=[];return vt(t,o),o}transRGLineToJsonObject(t){return St(t)}getGraphJsonData(){const t=[],o=[];return this.graphData.nodes.forEach(n=>{const i=yt(n);i&&t.push(i)}),this.graphData.links.forEach(n=>{vt(n,o)}),{rootId:this.graphData.rootNode?this.graphData.rootNode.id:\"\",nodes:t,lines:o}}getGraphJsonOptions(){const t={},o=[\"layouter\",\"autoLayouting\",\"canvasNVInfo\",\"canvasOffset\",\"canvasZoom\",\"fullscreen\",\"instanceId\",\"layoutClassName\",\"layoutDirection\",\"layoutLabel\",\"layoutName\",\"resetViewSize\",\"viewELSize\",\"viewNVInfo\",\"viewSize\",\"canvasSize\",\"newLinkTemplate\",\"newLineTemplate\",\"newNodeTemplate\"];return Object.keys(this.options).forEach(n=>{o.includes(n)||(t[n]=this.options[n])}),t}printGraphJsonData(){console.log(\"graph options:\",JSON.stringify(this.getGraphJsonOptions())),console.log(\"graph json data:\",JSON.stringify(this.getGraphJsonData()))}getNodeById(t){for(let o=0;o<this.graphData.nodes.length;o++)if(this.graphData.nodes[o].id===t)return this.graphData.nodes[o]}getLinkById(t){for(let o=0;o<this.graphData.links.length;o++)if(this.graphData.links[o].seeks_id===t)return this.graphData.links[o]}getLinkByLineId(t){for(let o=0;o<this.graphData.links.length;o++)if(this.graphData.links[o].relations.findIndex(n=>n.id===t)!==-1)return this.graphData.links[o]}addNodes(t){u(\"addNodes:\",t),this.loadNodes(t),this._dataUpdated()}addLines(t){u(\"addLines:\",t),this.loadLines(t),this._dataUpdated()}addElementLines(t){u(\"addElementLines:\",t),t.forEach(o=>{const n=document.getElementById(o.from),i=document.getElementById(o.to);n||console.error(\"Can not found from HTMLElement: #\"+o.from),i||console.error(\"Can not found toHTMLElement: #\"+o.to);const a=ht(o);let l=a.arrow;a.isHideArrow||(l=this.getLineArrow(a.color)),a.arrow=l,a.forDisplayOnly=!0;let r;for(const h of this.graphData.elementLines)if(h.fromNode.id===a.from&&h.toNode.id===a.to||h.fromNode.id===a.to&&h.toNode.id===a.from){r=h;break}if(r)r.relations.push(a);else{a.id||(a.id=`rg-ell-${a.from}-${a.to}`);const h={id:a.from,type:\"el\",nodeShape:1,junctionPoint:\"lr\",x:0,y:0,el:{offsetWidth:10,offsetHeight:10}},c={id:a.to,type:\"el\",nodeShape:1,junctionPoint:\"lr\",x:0,y:0,el:{offsetWidth:10,offsetHeight:10}};r={seeks_id:\"ell-\"+this.generateNewUUID(8),fromNode:h,toNode:c,relations:[a],appended:!0,forDisplayOnly:!0},this._updateElementLinePosition(n,r.fromNode),this._updateElementLinePosition(i,r.toNode),this.graphData.elementLines.push(r)}}),this.updateElementLines(),this._dataUpdated()}getElementLineById(t){for(const o of this.graphData.elementLines)for(const n of o.relations)if(n.id===t)return n}getElementLines(){const t=[];return this.graphData.elementLines.forEach(o=>{t.push(...o.relations)}),t}removeElementLine(t){u(\"removeElementLine:\",t);for(const o of this.graphData.elementLines)if(o===t){this.graphData.elementLines.splice(this.graphData.elementLines.indexOf(o),1);return}else for(const n of o.relations)if(n===t){this.graphData.elementLines.splice(o.relations.indexOf(n),1);return}}removeELementLineById(t){u(\"removeELementLineById:\",t);for(const o of this.graphData.elementLines)if(o.seeks_id===t){this.removeElementLine(o);return}else for(const n of o.relations)if(n.id===t){this.removeElementLine(n);return}}updateElementLines(){u(\"updateElementLines:\",this.graphData.elementLines.length),this.graphData.elementLines.length!==0&&(this.elLineUpdating||(this.elLineUpdating=!0,setTimeout(()=>{this.elLineUpdating=!1,this._updateElementLines()},50)))}_updateElementLines(){this.graphData.elementLines.forEach(t=>{const o=document.getElementById(t.relations[0].from),n=document.getElementById(t.relations[0].to);if(!o){t.relations.forEach(i=>{i.isHide=!0});return}if(!n){t.relations.forEach(i=>{i.isHide=!0});return}if(this._updateElementLinePosition(o,t.fromNode),this._updateElementLinePosition(n,t.toNode),t.fromNode.el.offsetWidth===0&&t.fromNode.el.offsetHeight===0){t.relations.forEach(i=>{i.isHide=!0});return}if(t.toNode.el.offsetWidth===0&&t.toNode.el.offsetHeight===0){t.relations.forEach(i=>{i.isHide=!0});return}t.relations.forEach(i=>{i.isHide=!1})}),this._dataUpdated()}_updateElementLinePosition(t,o){if(!t)return;const n=t.getBoundingClientRect(),i=this.$canvasDom.getBoundingClientRect();o.x=(n.x-i.x)/(this.options.canvasZoom/100),o.y=(n.y-i.y)/(this.options.canvasZoom/100),o.el.offsetWidth=n.width/(this.options.canvasZoom/100),o.el.offsetHeight=n.height/(this.options.canvasZoom/100)}getElementPosition(t){const n=document.getElementById(t).getBoundingClientRect(),i=this.$canvasDom.getBoundingClientRect(),a=(n.x-i.x)/(this.options.canvasZoom/100),l=(n.y-i.y)/(this.options.canvasZoom/100);return{x:a,y:l}}removeNodeById(t){let o=0;for(let i=0;i<this.graphData.links.length;i++){const a=this.graphData.links[i];(a.fromNode.id===t||a.toNode.id===t)&&(this.removeLink(a),i--,o++)}u(\"Removed link\\uFF1A\",t,o);let n=0;for(let i=0;i<this.graphData.nodes.length;i++)if(this.graphData.nodes[i].id===t){this.graphData.nodes.splice(i,1),n++;break}u(\"Removed node\\uFF1A\",t,n),this._dataUpdated()}removeNode(t){this.removeNodeById(t.id),this._dataUpdated()}removeLinkByTwoNode(t,o){for(const n of this.getLinks())if(n.fromNode.id===t&&n.toNode.id===o||n.fromNode.id===t&&n.toNode.id===o){this.removeLink(n);break}this._dataUpdated()}getGroupByNode(t,o=[]){o.includes(t)||o.push(t);for(const n of t.targetNodes)o.includes(n)||this.getGroupByNode(n,o);return o}_clearItem(t,o){for(let n=0;n<t.length;n++)t[n]===o&&(t.splice(n,1),n--)}removeNodeRef(t,o){t&&(t.targetNodes&&this._clearItem(t.targetNodes,o),t.targetFrom&&this._clearItem(t.targetFrom,o),t.targetTo&&this._clearItem(t.targetTo,o))}removeLinkById(t){u(\"removeLinkById:\",t);for(let o=0;o<this.graphData.links.length;o++){const n=this.graphData.links[o];n.seeks_id===t&&(this.removeNodeRef(n.fromNode,n.toNode),this.removeNodeRef(n.toNode,n.fromNode),this.graphData.links.splice(o,1),o--)}this._dataUpdated()}removeLink(t){u(\"removeLink:\",t),this.removeLinkById(t.seeks_id),this._dataUpdated()}removeLine(t,o){u(\"removeLine:\",t,o);for(let n=0;n<t.relations.length;n++)t.relations[n]===o&&t.relations.splice(n,1);t.relations.length===0&&this.removeLink(t),this._dataUpdated()}removeLineById(t){u(\"removeLineById:\",t);for(const o of this.graphData.links){for(let n=0;n<o.relations.length;n++)o.relations[n].id===t&&(o.relations.splice(n,1),n--);o.relations.length===0&&this.removeLink(o)}this._dataUpdated()}setNodePosition(t,o,n){t.x=o,t.y=n}getGraphOffet(){const t=this.options.graphOffset_x||0,o=this.options.graphOffset_y||0;return{offset_x:t,offset_y:o}}setCanvasCenter(t,o){const n=this.options.viewSize.width/2,i=this.options.viewSize.height/2,a=this.getGraphOffet();this.setCanvasOffset(n-t+a.offset_x,i-o+a.offset_y),this._dataUpdated()}setCanvasOffset(t,o){this.options.canvasOffset.x=t,this.options.canvasOffset.y=o,this._dataUpdated()}findGroupNodes(t,o){o.push(t),t.targetNodes.forEach(n=>{o.includes(n)||this.findGroupNodes(n,o)})}resetViewSize(t=!1){!this.options||(this.options.viewSize.width=this.$dom.getBoundingClientRect().width,this.options.viewSize.height=this.$dom.getBoundingClientRect().height,t&&(this.options.canvasZoom=100,this.setCanvasCenter(0,0)),u(\"resetViewSize:1:\",this.options.viewSize.width,this.options.viewSize.height,this.options.canvasOffset.x,this.options.canvasOffset.y),this.refreshNVAnalysisInfo(),this._dataUpdated())}refreshNVAnalysisInfo(){if(!this.$dom){console.error(\"cannot get view size !\");return}const t={NMCanvasCenter:{x:0,y:0}},o=this.$dom.getBoundingClientRect();this.options.viewNVInfo.x=o.left,this.options.viewNVInfo.y=o.top,this.options.viewNVInfo.width=o.width,this.options.viewNVInfo.height=o.height,u(\"resetViewSize:\",o.width,o.height,o.left,o.top);const n=this.options.canvasSize.width*(this.options.canvasZoom/100),i=this.options.canvasSize.height*(this.options.canvasZoom/100);t.NMCanvasCenter.x=this.options.canvasOffset.x+this.options.canvasSize.width/2,t.NMCanvasCenter.y=this.options.canvasOffset.y+this.options.canvasSize.height/2,this.options.canvasNVInfo.x=t.NMCanvasCenter.x-n/2,this.options.canvasNVInfo.y=t.NMCanvasCenter.y-i/2,this.options.canvasNVInfo.width=n,this.options.canvasNVInfo.height=i,this.options.viewELSize.width=o.width,this.options.viewELSize.height=o.height,this.options.viewELSize.left=o.left,this.options.viewELSize.top=o.top}getStuffSize(t){const o=t||this.graphData.nodes;let n=9999999,i=9999999,a=-9999999,l=-9999999;o.forEach(p=>{x.isAllowShowNode(p)&&(p.x<n&&(n=p.x),p.x>a&&(a=p.x+p.el.offsetWidth),p.y<i&&(i=p.y),p.y>l&&(l=p.y+p.el.offsetHeight))});const r=100,h=a-n+r,c=l-i+r;return{width:h,height:c,minX:n===9999999?0:n,minY:i===9999999?0:i,maxX:a===-9999999?0:a,maxY:l===-9999999?0:l}}getNodesCenter(){const t=this.getStuffSize();u(\"getStuffSize:\",t);const o=t.minX+(t.maxX-t.minX)/2,n=t.minY+(t.maxY-t.minY)/2;return{x:o,y:n}}querySearchAsync(t){if(u(\"fetch-suggestions\",t),t=t.trim(),t===\"\")return;const o=[];return this.graphData.nodes.forEach(n=>{u(\"fetch:\",n.text),n.text.includes(t)&&o.push(n)}),u(\"fetched:\",o.length),o}printOptions(){const t=this.getGraphJsonOptions();console.log(\"options:\",t),console.log(\"options-json-string:\"),console.log(JSON.stringify(t))}printData(){const t=this.getGraphJsonData();console.log(\"data:\",t),console.log(\"data-json-string:\"),console.log(JSON.stringify(t))}loading(t=\"\"){this.options.graphLoading=!0,this.options.graphLoadingText=t}clearLoading(){this.options.graphLoading=!1,this.options.graphLoadingText=\"\"}updateVisbleViewNodes(t=!1){!t&&(!this.options.performanceMode||this.options.showEasyView)||this._updateVisbleViewNodes()}_updateVisbleViewNodes(){const t=this.getBoundingClientRect(),o=this.getCanvasCoordinateByClientCoordinate({x:t.x,y:t.y}),n=this.getCanvasCoordinateByClientCoordinate({x:t.x+this.options.viewELSize.width,y:t.y+this.options.viewELSize.height}),i=this.options.snapshotting;let a=0;for(const l of this.graphData.nodes){let r=!0;i||l.alwaysRender?r=!0:((l.x>n.x||l.y>n.y)&&(r=!1),(l.x+l.el.offsetWidth<o.x||l.y+l.el.offsetHeight<o.y)&&(r=!1)),l.invisiable=!r,!r&&a++}for(const l of this.graphData.links){if(i){l.invisiable=!1;continue}let r=!1;l.fromNode.invisiable&&l.toNode.invisiable&&(r=!0),l.invisiable=r}u(\"updateVisbleViewNodes:\",this.options.showEasyView,n.x,a)}}class Qe extends Ke{constructor(t,o){super(t,o);v(this,\"$watermarkDom\",null);v(this,\"$watermarkPosition\",\"br\");v(this,\"$backgroundDom\",null)}setWatermarkDom(t,o=!0,n=!1,i=\"br\"){o&&(this.$watermarkDom=t),this.$watermarkPosition=i}setBackgroundDom(t,o=!0,n=!0){o&&(this.$backgroundDom=t)}dataURLToBlob(t){try{const o=t.split(\",\"),n=o[0],i=n&&n.match(/:(.*?);/)[1],a=atob(o[1]);let l=a.length;const r=new Uint8Array(l);for(;l--;)r[l]=a.charCodeAt(l);return new Blob([r],{type:i})}catch(o){console.error(\"[relation-graph]Create and download image error:dataURLToBlob:dataurl\",t),console.error(\"[relation-graph]error object\",o)}}createGraphCanvas(t=\"png\"){return C(this,null,function*(){const o=this.options.canvasZoom,n=this.$canvasDom.clientWidth,i=this.$canvasDom.clientHeight,a=this.options.autoLayouting;a&&this.stopAutoLayout(),this.loading(\"Generating...\"),this.options.snapshotting=!0;const l=yield this.createGraphMainCanvas(t),r=this.$backgroundDom?yield this.createGraphBackgroundCanvas(t):null,h=this.$watermarkDom?yield this.createGraphWatermarkCanvas(t):null,c=this.mergeCanvas(r,l,h);return this.options.canvasSize.width=n,this.options.canvasSize.height=i,this.options.snapshotting=!1,this._zoomEnd(100,o),this.updateVisbleViewNodes(),this.updateElementLines(),a&&this.startAutoLayout(),this.clearLoading(),this.dataUpdated(),c})}mergeCanvas(t,o,n){const i=window.devicePixelRatio,a=document.createElement(\"canvas\"),l=this.options.canvasSize.width,r=this.options.canvasSize.height;a.width=l*i,a.height=r*i,a.style.width=`${l}px`,a.style.height=`${r}px`;const h=a.getContext(\"2d\");if(a.getContext(\"2d\").scale(1,1),t?h.drawImage(t,0,0):(h.fillStyle=!this.options.backgroundColor||this.options.backgroundColor===\"transparent\"?\"#ffffff\":this.options.backgroundColor,h.fillRect(0,0,a.width,a.height)),h.drawImage(o,0,0),n){const c=this.$watermarkDom.getBoundingClientRect(),p=c.width,d=c.height;let g=l-p-20,f=r-d-20;this.$watermarkPosition===\"bl\"?(g=20,f=r-d-20):this.$watermarkPosition===\"tl\"?(g=20,f=20):this.$watermarkPosition===\"tr\"&&(g=l-p-20,f=20),h.drawImage(n,g*i,f*i)}return a}createGraphBackgroundCanvas(t=\"png\"){return C(this,null,function*(){const o=window.devicePixelRatio,n=document.createElement(\"canvas\"),i=this.options.canvasSize.width,a=this.options.canvasSize.height;n.width=i*o,n.height=a*o,n.style.width=`${i}px`,n.style.height=`${a}px`,n.getContext(\"2d\").scale(o,o);const l=this.$backgroundDom;l.style.width=this.options.canvasSize.width+\"px\",l.style.height=this.options.canvasSize.height+\"px\";const r={backgroundColor:\"#ffffff\",scale:1,canvas:n,logging:!0,width:this.options.canvasSize.width,height:this.options.canvasSize.height,useCORS:!0},h=yield this.createImage(l,r,t,\"\");return l.style.width=\"\",l.style.height=\"\",h})}createGraphWatermarkCanvas(t=\"png\"){return C(this,null,function*(){const o=this.$canvasDom.clientWidth,n=this.$canvasDom.clientHeight,i=window.devicePixelRatio,a=document.createElement(\"canvas\");a.width=o*i,a.height=n*i,a.style.width=`${o}px`,a.style.height=`${n}px`,a.getContext(\"2d\").scale(i,i);const l=this.$watermarkDom,r={backgroundColor:\"transparent\",scale:1,canvas:a,logging:!0,width:o,height:n,useCORS:!0};return yield this.createImage(l,r,t,\"\")})}createGraphMainCanvas(t=\"png\"){return C(this,null,function*(){const o=this.options.canvasZoom,n=this.options.canvasOffset.x,i=this.options.canvasOffset.y;this.options.checkedNodeId=\"\",this.options.canvasZoom=100,this._zoomEnd(o,this.options.canvasZoom),this.updateVisbleViewNodes(!0),yield mt(500);const a=this.$canvasDom;let l=999999,r=999999,h=-999999,c=-999999;this.graphData.nodes.forEach(w=>{w.x<l&&(l=w.x),w.x>h&&(h=w.x+w.el.offsetWidth),w.y<r&&(r=w.y),w.y>c&&(c=w.y+w.el.offsetHeight)});const p=new WeakMap,d=this.$canvasDom.querySelectorAll(\".rel-canvas-slot\");for(const w of d){let b=999999,N=999999,R=-999999,H=-999999;for(const E of w.children){const L=E,O=L.offsetLeft,B=L.offsetTop;O<b&&(b=O),O>R&&(R=O+L.offsetWidth),B<N&&(N=B),B>H&&(H=B+L.offsetHeight)}b<l&&(l=b),N<r&&(r=N),R>h&&(h=R),H>c&&(c=H),b!==999999&&p.set(w,{offsetX:b,offsetY:N})}const g=200;l=l-g,r=r-g,h=h+g,c=c+g;const f=l,m=r;this.graphData.nodes.forEach(w=>{w.x=w.x-f,w.y=w.y-m});for(const w of d){const b=w;b.style.marginLeft=-f+\"px\",b.style.marginTop=-m+\"px\"}this.updateElementLines();const _=this.$canvasDom.querySelectorAll(\".rel-lines-svg-el-lines\");_.forEach(w=>{const b=w;b.style.width=\"4000px\",b.style.height=\"4000px\"}),this.options.canvasOffset.x=0,this.options.canvasOffset.y=0;const y=h-l,M=c-r,S=window.devicePixelRatio;this.options.canvasSize.width=y,this.options.canvasSize.height=M,u(\"export image:\",{_image_width:y,_image_height:M,_min_x:l,_min_y:r,_max_x:h,_max_y:c,devicePixelRatio:window.devicePixelRatio}),window.scrollTo(0,0);const z=document.createElement(\"canvas\"),X=y,U=M;z.width=X*S,z.height=U*S,z.style.width=`${X}px`,z.style.height=`${U}px`,z.getContext(\"2d\").scale(S,S);const D={backgroundColor:\"transparent\",scale:1,canvas:z,logging:!0,width:this.options.canvasSize.width,height:this.options.canvasSize.height,useCORS:!0};this.dataUpdated(),yield mt(1e3);const V=yield this.createImage(a,D,t,\"\");return d.forEach(w=>{const b=w;b.style.marginLeft=\"0px\",b.style.marginTop=\"0px\"}),this.graphData.nodes.forEach(w=>{w.x=w.x+f,w.y=w.y+m}),_.forEach(w=>{const b=w;b.style.width=\"1px\",b.style.height=\"1px\"}),this.options.canvasOffset.x=n,this.options.canvasOffset.y=i,this.options.canvasZoom=o,V})}createImage(t,o,n,i){return C(this,null,function*(){return u(\"createImage:\",o),yield Dt.default(t,o)})}getImageBase64(t=\"png\"){return C(this,null,function*(){const o=yield this.createGraphCanvas(t),n=document.body.appendChild(o);n.style.display=\"none\";const i=n.toDataURL(`image/${t}`);return document.body.removeChild(n),i})}downloadAsImage(t=\"png\",o){return C(this,null,function*(){if(this.emitEvent($.onImageDownload,this.$canvasDom,t)===!1)return;if(this.graphData.nodes.length===0)throw new Error(\"No nodes, no content to export!\");o||(o=this.options.downloadImageFileName),o||(o=`relation-graph-${(Math.random()*1e5).toFixed(0)}`);const i=yield this.createGraphCanvas(t);u(\"downloadImageAsFile:\",t,o),this.emitEvent($.onImageDownload,this.$canvasDom,t)!==!1&&(yield this.downloadImageAsFile(i,t,o))})}downloadImageAsFile(t,o,n){return C(this,null,function*(){const i=document.body.appendChild(t);i.style.display=\"none\";const a=this.dataURLToBlob(i.toDataURL(`image/${o}`));document.body.removeChild(i);const l=document.createElement(\"a\");l.style.display=\"none\";try{window.navigator.msSaveOrOpenBlob?window.navigator.msSaveOrOpenBlob(a,`${n}.${o}`):(l.setAttribute(\"href\",URL.createObjectURL(a)),l.setAttribute(\"download\",`${n}.${o}`),document.body.appendChild(l),l.click(),u(\"click ok!\"),URL.revokeObjectURL(yield a.text()),u(\"revokeObjectURL ok!\"),document.body.removeChild(l),u(\"removeChild ok!\"))}catch(r){u(\"[relation-graph]Create and download image error:\",r)}})}}class to extends Qe{constructor(s,t){super(s,t)}createReturnValue(s,t){return{path:s,textPosition:t}}createLinePath(s,t,o){let n=s.fromNode;n||(n={x:0,y:0,el:{offsetWidth:10,offsetHeight:10}});const i=s.toNode,a=s.relations.length;return o||(o=0),this.createLinePathByTwoNode(n,i,t,o,a)}_getJunctionPoint(s,t){return s===et.border?q.getBorderPoint4MultiLine(...t):s===et.ltrb?q.getRectJoinPoint(...t):s===et.tb?q.getRectVJoinPoint(...t):s===et.lr?q.getRectHJoinPoint(...t):s===et.left?q.getRectLeftJoinPoint(...t):s===et.right?q.getRectRightJoinPoint(...t):s===et.top?q.getRectTopJoinPoint(...t):s===et.bottom?q.getRectBottomJoinPoint(...t,this.options.defaultBottomJuctionPoint_X):q.getBorderPoint4MultiLine(...t)}createLinePathByTwoNode(s,t,o,n=0,i=1){const a=o.lineShape||this.options.defaultLineShape||1,l=o.lineDirection||this.options.layoutDirection||\"h\",r=s,h=t,c=r.x,p=r.y,d=h.x,g=h.y,f={x:0,y:0,rotate:0};if(Number.isNaN(c)||Number.isNaN(p))return u(\"error start node:\",r.text,r.x,r.y),f.x=50,f.y=50,f.rotate=0,this.createReturnValue(\"M 0 0 L -10 -10\",f);if(Number.isNaN(d)||Number.isNaN(g))return u(\"error end point:\",h.text,h.x,h.y),f.x=50,f.y=50,f.rotate=0,this.createReturnValue(\"M 0 0 L 10 -10\",f);const m=r.el.offsetWidth||r.width||60,_=r.el.offsetHeight||r.height||60;if(Number.isNaN(m)||Number.isNaN(_))return f.x=50,f.y=50,f.rotate=0,this.createReturnValue(\"M 0 0 L -10 10\",f);const y=h.el.offsetWidth||h.width||60,M=h.el.offsetHeight||h.height||60;if(Number.isNaN(y)||Number.isNaN(M))return f.x=50,f.y=50,f.rotate=0,this.createReturnValue(\"M 0 0 L 10 10\",f);const S=o.isReverse?h:r,z=o.isReverse?r:h,X=S.nodeShape!==void 0&&S.nodeShape!==null?S.nodeShape:this.options.defaultNodeShape,U=[c,p,d,g,m,_,y,M,X,!1,i,n,this.options.multiLineDistance||14],D=z.nodeShape!==void 0&&z.nodeShape!==null?z.nodeShape:this.options.defaultNodeShape,V=[d,g,c,p,y,M,m,_,D,!1,i,i-n-1,this.options.multiLineDistance||14],w=this.options.defaultJunctionPoint||et.border,b=(o.isReverse?o.toJunctionPoint:o.fromJunctionPoint)||S.junctionPoint||w,N=(o.isReverse?o.fromJunctionPoint:o.toJunctionPoint)||z.junctionPoint||w,R=this._getJunctionPoint(b,U),H=this._getJunctionPoint(N,V);if(!R||!H)return this.createReturnValue(\"Unable to calculate the starting point and ending point of the line.\",f);const E=R.x,L=R.y,O=H.x,B=H.y;if(r===h){const Gs=c+m/2,Bs=p+_/2,Pe=Math.atan2(L-Bs,E-Gs),at=Math.sin(Pe+Math.PI)*5,rt=Math.cos(Pe+Math.PI)*5,ze={x:E-at,y:L-rt},$e={x:at,y:rt},Ts=-rt*5,As=-at*5,Is=-rt*5,Hs=-at*5,Ws=`M ${ze.x},${ze.y} c ${Ts},${As} ${Is},${Hs} ${$e.x},${$e.y}`;return f.x=E-rt/(rt+at)*20,f.y=L+at/(rt+at)*20,f.rotate=0,this.createReturnValue(Ws,f)}if(Number.isNaN(E)||Number.isNaN(L))return u(\"error start point:\",r.text),f.x=50,f.y=50,f.rotate=0,this.createReturnValue(\"M 0 0 L -10 0\",f);if(Number.isNaN(O)||Number.isNaN(B))return u(\"error end point:\",h.text),f.x=50,f.y=50,f.rotate=0,this.createReturnValue(\"M 0 0 L 10 0\",f);const k=c+m/2,A=p+_/2,W=d+y/2,J=g+M/2,T=this.createLinePathData(o,f,i,n,l,a,E,L,k,A,m,_,O,B,W,J,y,M);return this.createReturnValue(T,f)}createLinePathData(s,t,o,n,i,a,l,r,h,c,p,d,g,f,m,_,y,M){const S=g-l,z=f-r,X=g>l?1:-1,U=f>r?1:-1,D=i===\"v\"?U:X;let V=\"\";if(a===4){const w=l-h,b=r-c,N=g-m,R=f-_,H=this.options.defaultPolyLineRadius||0,E=Math.min(H,Math.abs(S))*(l<g?1:-1),L=Math.min(H,Math.abs(z))*(r<f?1:-1),O=Math.abs(w)>=p/2?\"h\":\"v\",B=Math.abs(N)>=y/2?\"h\":\"v\",k=[];if(O===\"v\"){const A=s.polyLineStartDistance||Math.max(Math.min(30,Math.abs(f-r)/2),15),W=b>0?A:-A;if(s.placeText===\"start\"?(t.x=l,t.y=r+W-(b>0?20:-5)):s.placeText===\"middle\"?(t.x=l+(g-l)/2,t.y=r+W):(t.x=g,t.y=r+W+(b>0?20:-5)),k.push(`M ${Math.round(l)} ${Math.round(r)}`),k.push(`v ${Math.round(W-L)}`),B===\"v\")k.push(`c ${0},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)}`),k.push(`h ${Math.round(g-l-E*2)}`),k.push(`c ${Math.round(E)},${0},`),k.push(`${Math.round(E)},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)}`),k.push(`v ${Math.round(f-r-W-L)}`);else{k.push(`c ${0},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)}`);const J=Math.min(30,Math.abs(g-l)/2),T=N>0?-J:J;k.push(`h ${Math.round(g-l+T-E)}`),k.push(`c ${Math.round(E)},${0},`),k.push(`${Math.round(E)},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)}`),k.push(`v ${Math.round(f-r-W-L)}`),k.push(`h ${Math.round(T-E)}`)}}else{const A=s.polyLineStartDistance||Math.max(Math.min(30,Math.abs(g-l)/2),15),W=w>0?A:-A;if(s.placeText===\"start\"?(t.x=l+(w>0?10:-50),t.y=r-5):s.placeText===\"middle\"?(t.x=l+W,t.y=r+(f-r)/2):(t.x=l+W+(w>0?20:-50),t.y=f-5),k.push(`M ${Math.round(l)} ${Math.round(r)}`),k.push(`h ${W-E}`),B===\"v\"){const J=Math.min(30,Math.abs(f-r)/2),T=R>0?-J:J;k.push(`c ${Math.round(E)},${0},`),k.push(`${Math.round(E)},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)}`),k.push(`v ${Math.round(f-r+T-L)}`),k.push(`h ${Math.round(g-l-W-E)}`),k.push(`c ${0},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)}`),k.push(`v ${Math.round(T-L)}`)}else k.push(`c ${Math.round(E)},${0},`),k.push(`${Math.round(E)},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)}`),k.push(`v ${Math.round(f-r-L*2)}`),k.push(`c ${0},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)},`),k.push(`${Math.round(E)},${Math.round(L)}`),k.push(`h ${Math.round(g-l-W-E)}`)}V=k.join(\" \")}else if(a===41){const w=this.options.defaultPolyLineRadius||0,b=Math.min(w,Math.abs(S))*(l<g?1:-1),N=Math.min(w,Math.abs(z))*(r<f?1:-1),R=[];s.polyLineStartDistance||Math.max(Math.min(30,Math.abs(f-r)/2),15),t.x=l+5,t.y=f-13,R.push(`M ${Math.round(l)} ${Math.round(r)}`),R.push(`v ${Math.round(f-r-N)}`),R.push(`c ${0},${Math.round(N)},`),R.push(`${Math.round(b)},${Math.round(N)},`),R.push(`${Math.round(b)},${Math.round(N)}`),R.push(`h ${Math.round(g-l-b)}`),V=R.join(\" \")}else if(a===44){const w=l-h,b=r-c,N=w>3?1:w<-3?-1:0,R=b>3?1:b<-3?-1:0,H=g-m,E=f-_,L=H>3?1:H<-3?-1:0,O=E>3?1:E<-3?-1:0,B={x:0,y:0},k={x:0,y:0};B.x=l+N*10,B.y=r+R*10,k.x=g+L*10,k.y=f+O*10,this.options.defaultPolyLineRadius;const A=[];s.polyLineStartDistance||Math.max(Math.min(30,Math.abs(f-r)/2),15),A.push(`M ${Math.round(l)} ${Math.round(r)}`),A.push(`L ${Math.round(B.x)}, ${Math.round(B.y)}`);let W=k.y-B.y,J=k.x-B.x;if(t.x=B.x,t.y=B.y-14,R===0){const T=(k.y-B.y)/2;A.push(`v ${Math.round(T)}`),W-=T,t.y+=T}else{const T=(k.x-B.x)/2;A.push(`h ${Math.round(T)}`),J-=T,t.x+=T}if(O===0){const T=J;A.push(`h ${Math.round(T)}`),J-=T}else{const T=(k.y-B.y)/2;A.push(`v ${Math.round(T)}`),W-=T}A.push(`v ${Math.round(W)}`),A.push(`h ${Math.round(J)}`),A.push(`L ${Math.round(k.x)}, ${Math.round(k.y)}`),A.push(`L ${Math.round(g)}, ${Math.round(f)}`),V=A.join(\" \")}else if(a===2||a===3||a===5||a===6||a===7||a===8){const w=l-h,b=r-c,N=g-m,R=f-_,H=1/(o+1)*(n+1);let E,L;if(a===2)E=i===\"v\"?{x:0,y:D*30}:{x:D*30,y:0},L=i===\"v\"?{x:S*H,y:D*-10}:{x:D*-10,y:z*H};else if(a===3)E=i===\"v\"?{x:0,y:z*H}:{x:D*30,y:0},L=i===\"v\"?{x:0,y:0}:{x:D*-10,y:z*H};else if(a===5)E=i===\"v\"?{x:0,y:0}:{x:0,y:0},L=i===\"v\"?{x:0,y:z*H}:{x:S*H,y:0};else if(a===6){const B=Math.min(200,Math.max(100,Math.abs(S/2))),k=Math.min(200,Math.max(100,Math.abs(z/2))),A=w/(Math.abs(w)+Math.abs(b))*B,W=b/(Math.abs(w)+Math.abs(b))*k;E={x:A,y:W};const J=N/(Math.abs(N)+Math.abs(R))*B+S,T=R/(Math.abs(N)+Math.abs(R))*k+z;L={x:J,y:T}}else if(a===7){const A=w/(Math.abs(w)+Math.abs(b))*30,W=b/(Math.abs(w)+Math.abs(b))*30;E={x:A,y:W};const J=N/(Math.abs(N)+Math.abs(R))*30+S,T=R/(Math.abs(N)+Math.abs(R))*30+z;L={x:J,y:T}}else if(a===8){const A=w/(Math.abs(w)+Math.abs(b))*30,W=b/(Math.abs(w)+Math.abs(b))*30;E={x:A,y:W};const J=N/(Math.abs(N)+Math.abs(R))*30+S,T=R/(Math.abs(N)+Math.abs(R))*30+z;L={x:J,y:T}}const O=this.calcCurveCenter({x:l,y:r},{x:l+E.x,y:r+E.y},{x:l+L.x,y:r+L.y},{x:l+S,y:r+z},a<6?.8:.5);t.x=O.x,t.y=O.y,V=`M ${Math.round(l)},${Math.round(r)} c ${Math.round(E.x)},${Math.round(E.y)} ${Math.round(L.x)},${Math.round(L.y)} ${Math.round(S)},${Math.round(z)}`,a===8&&(V=V+\" Z\")}else t.rotate=q.getTextAngle(l,r,g,f),t.x=Math.round(l+(g-l)/2),t.y=Math.round(r+(f-r)/2),Number.isNaN(t.rotate)&&(t.rotate=0),V=`M ${Math.round(l)} ${Math.round(r)} L ${Math.round(g)} ${Math.round(f)}`;return V}calcCurveCenter(s,t,o,n,i=.5){const a={x:(1-i)*s.x+i*t.x,y:(1-i)*s.y+i*t.y},l={x:(1-i)*t.x+i*o.x,y:(1-i)*t.y+i*o.y},r={x:(1-i)*o.x+i*n.x,y:(1-i)*o.y+i*n.y},h={x:(1-i)*a.x+i*l.x,y:(1-i)*a.y+i*l.y},c={x:(1-i)*l.x+i*r.x,y:(1-i)*l.y+i*r.y};return{x:(1-i)*h.x+i*c.x,y:(1-i)*h.y+i*c.y}}createCheckedLinePath(){const s=this.options.checkedLineId;if(!!s)try{const t=this.getElementLineById(this.options.checkedLinkId);if(t){const{path:l}=this.createLinePath(t,t.relations[0],0);return l}const o=this.getLinkByLineId(s);if(!o){u(\"Can not find link by checkedLineId:\",s);return}if(!x.isAllowShowNode(o.fromNode)){u(\"from hide:\",s);return}if(!x.isAllowShowNode(o.toNode)){u(\"to hide:\",s);return}const n=o.relations.findIndex(l=>l.id===s);if(n===-1){u(\"Can not find checkedLineId:\",s);return}const i=o.relations[n],{path:a}=this.createLinePath(o,i,n);return a}catch(t){u(t)}}createCheckedLineStrokeWidth(){const s=this.options.checkedLineId;if(!s)return this.options.defaultLineWidth+8;try{const t=this.getLinkByLineId(s);if(!t)return this.options.defaultLineWidth+8;const o=t.relations.findIndex(i=>i.id===s);if(o===-1)return this.options.defaultLineWidth+8;const n=t.relations[o];return n.lineWidth?n.lineWidth+8:this.options.defaultLineWidth+8}catch(t){u(t)}}getTextTransform(s,t,o,n){if(Number.isNaN(t)||Number.isNaN(o))return\"translate(0,0)\";const i=s.lineShape===void 0?this.options.defaultLineShape:s.lineShape;return i===1||i===4?`translate(${t},${o})rotate(${n||0})`:`translate(${t},${o})`}getArrow(s,t,o=!1){if(o){if(s.isReverse){if(s.showEndArrow===!1)return}else if(s.showStartArrow!==!0)return}else if(s.isReverse){if(s.showStartArrow!==!0)return}else if(s.showEndArrow===!1)return;const n=!1;return s.isHideArrow?\"none\":`url('#${this.getLineArrow(s.color,o,n)}')`}getLineTextStyle(s,t,o){let n=t.text;if(!n)return null;let i=0;const a=s.fromNode.x,l=s.toNode.x;n.length>this.options.lineTextMaxLength&&(n=n.substring(0,this.options.lineTextMaxLength||15)+\"...\"),(t.useTextPath!==void 0?t.useTextPath:this.options.lineUseTextPath)&&a>l&&(i=180,n=n.split(\"\").reverse().join(\"\"));const h=t.textOffset_x||this.options.defaultLineTextOffset_x||0,c=t.textOffset_y||this.options.defaultLineTextOffset_y||-8,p=`translate(${h},${c})`;let d=\"middle\";const g=t.lineShape||this.options.defaultLineShape||1;let f=\"50%\";if(g===4)if(t.placeText===\"start\")f=\"10%\",d=\"start\";else if(t.placeText===\"end\")f=\"90%\",d=\"end\";else if(t.placeText)f=t.placeText,d=\"start\";else if(this.options.layoutDirection===\"v\"){const m=s.fromNode.x,_=s.toNode.x;f=String(Math.abs(_-m)+43)}else{const m=s.fromNode.y,_=s.toNode.y;f=String(Math.abs(_-m)+43)}else g===41?d=\"start\":t.placeText===\"start\"?(f=\"10%\",d=\"start\"):t.placeText===\"end\"?(f=\"90%\",d=\"end\"):t.placeText?(f=t.placeText,d=\"start\"):(f=\"50%\",d=\"middle\");return t.textAnchor&&(d=t.textAnchor),{text:n,textOffset:p,textAnchor:d,textHPosition:f,textRotate:i}}}class eo extends to{constructor(t,o){super(t,o);v(this,\"zoomCenter_of_newSize\",{x:0,y:0})}zoom(t,o){this.options.canvasZoom+t<5&&(u(\"zoom:reset zoom=10\"),t=5-this.options.canvasZoom);const n=this.options.canvasZoom,i=this.options.canvasZoom+t,a=this.showZoomCenter(o,t);this.options.canvasOffset.x+=a.buff_x,this.options.canvasOffset.y+=a.buff_y,this.options.canvasZoom=i,this._zoomEnd(n,i)}_zoomEnd(t,o){this.refreshNVAnalysisInfo(),t<=40&&o>40&&(this.options.performanceMode&&this.updateVisbleViewNodes(!0),this.options.showEasyView=!1,u(\"zoom:hide:showEasyView\",t,o),setTimeout(()=>{this.updateElementLines()},150)),t>40&&o<=40&&(u(\"zoom:show:showEasyView\",t,o),this.options.performanceMode&&(this.options.showEasyView=!0)),this.updateEditingControllerView(),this.emitEvent($.onZoomEnd,this.options.canvasZoom),this._dataUpdated()}setZoom(t,o){const n=Math.floor(t-this.options.canvasZoom);this.zoom(n,o)}getCanvasCoordinateByClientCoordinate(t){const o=this.options.canvasZoom/100,{NMCanvasStart:n,NMZoomCenter:i}=this.analysisByZoom(o,t),a={x:i.x-n.x,y:i.y-n.y};return{x:a.x/o,y:a.y/o}}getClientCoordinateByCanvasCoordinate(t){const o=this.options.canvasZoom/100,{NMCanvasStart:n}=this.analysisByZoom(o),i={x:t.x*o+n.x,y:t.y*o+n.y};return{x:i.x+this.options.canvasOffset.x,y:i.y+this.options.canvasOffset.y}}getViewPointByCanvasPoint(t){const o=this.options.canvasZoom/100,{NMCanvasStart:n}=this.analysisByZoom(o),i={x:t.x*o+n.x,y:t.y*o+n.y};return{x:i.x,y:i.y}}getCanvasPointByViewPoint(t){const o=this.$dom.getBoundingClientRect();return this.getCanvasCoordinateByClientCoordinate({x:o.left+t.x,y:o.top+t.y})}analysisByZoom(t,o){const n={NMViewPosition:{x:0,y:0},NMViewCenter:{x:0,y:0},NMCanvasCenter:{x:0,y:0},NMCanvasStart:{x:0,y:0},NMCanvasEnd:{x:0,y:0},NMZoomCenter:{x:0,y:0},NMViewBuff:{x:0,y:0},NMCanvasOffsetBuff:{x:0,y:0},NMCanvasSize:{width:0,height:0}},i=this.$dom.getBoundingClientRect();n.NMViewPosition.x=i.left,n.NMViewPosition.y=i.top,n.NMViewCenter.x=i.width/2,n.NMViewCenter.y=i.height/2;const a=this.options.canvasSize.width*t,l=this.options.canvasSize.height*t;n.NMCanvasCenter.x=this.options.canvasOffset.x+this.options.canvasSize.width/2,n.NMCanvasCenter.y=this.options.canvasOffset.y+this.options.canvasSize.height/2,n.NMCanvasStart.x=n.NMCanvasCenter.x-a/2,n.NMCanvasStart.y=n.NMCanvasCenter.y-l/2,n.NMCanvasEnd.x=n.NMCanvasCenter.x+a/2,n.NMCanvasEnd.y=n.NMCanvasCenter.y+l/2,n.NMZoomCenter.x=n.NMViewCenter.x,n.NMZoomCenter.y=n.NMViewCenter.y,o&&(n.NMZoomCenter.x=o.x-n.NMViewPosition.x,n.NMZoomCenter.y=o.y-n.NMViewPosition.y);let r=n.NMViewCenter.x-n.NMCanvasCenter.x,h=n.NMViewCenter.y-n.NMCanvasCenter.y;return o&&(r=n.NMZoomCenter.x-n.NMCanvasCenter.x,h=n.NMZoomCenter.y-n.NMCanvasCenter.y),n.NMViewBuff.x=r,n.NMViewBuff.y=h,n.NMCanvasSize.width=a,n.NMCanvasSize.height=l,n}showZoomCenter(t,o){if(!this.$dom)return{buff_x:0,buff_y:0};const n=this.options.canvasZoom/100,i=this.analysisByZoom(n,t),a=(this.options.canvasZoom+o)/100,l=this.analysisByZoom(a,t),r=a/n,h=0,c=0,p=a/n,d=0,g=0;this.zoomCenter_of_newSize.x=r*i.NMViewBuff.x+c*i.NMViewBuff.y+d,this.zoomCenter_of_newSize.y=h*i.NMViewBuff.x+p*i.NMViewBuff.y+g;const f=i.NMViewBuff.x-this.zoomCenter_of_newSize.x,m=i.NMViewBuff.y-this.zoomCenter_of_newSize.y;this.zoomCenter_of_newSize.x+=i.NMCanvasCenter.x,this.zoomCenter_of_newSize.y+=i.NMCanvasCenter.y;let _=i.NMCanvasStart.x-i.NMCanvasCenter.x,y=i.NMCanvasStart.y-i.NMCanvasCenter.y,M=r*_+c*y+d,S=h*_+p*y+g;return l.NMCanvasStart.x=f+i.NMCanvasCenter.x+M,l.NMCanvasStart.y=f+i.NMCanvasCenter.y+S,_=i.NMCanvasEnd.x-i.NMCanvasCenter.x,y=i.NMCanvasEnd.y-i.NMCanvasCenter.y,M=r*_+c*y+d,S=h*_+p*y+g,l.NMCanvasEnd.x=f+i.NMCanvasCenter.x+M,l.NMCanvasEnd.y=f+i.NMCanvasCenter.y+S,i.NMCanvasOffsetBuff.x=f,i.NMCanvasOffsetBuff.y=m,{buff_x:f,buff_y:m}}}class oo extends eo{constructor(s,t){super(s,t)}doLayout(){return C(this,null,function*(){if(!this.layouter){u(\"no layouter\");return}if(!this.graphData.rootNode){u(\"Cant find rootNode!\");return}this.options.showMaskWhenLayouting&&this.loading(),yield mt(300),this.options.canvasOpacity=1,this._dataUpdated(),this.options.showMaskWhenLayouting&&this.clearLoading(),u(\"node size\\uFF1A\",this.graphData.nodes.length);const s=this.options.useAnimationWhenExpanded;this.disableNextLayoutAnimation&&(this.options.useAnimationWhenExpanded=!1),this.layouter.requireLinks&&this.layouter.setLinks(this.getLinks()),this.layouter.viewUpdate=()=>{this._dataUpdated()},yield this.layouter.placeNodes(this.graphData.nodes,this.graphData.rootNode),this.options.useAnimationWhenExpanded=s,this.disableNextLayoutAnimation=!1,this.updateElementLines(),this._dataUpdated()})}refresh(s=!0){return C(this,null,function*(){this.resetViewSize(!0),this.disableNextLayoutAnimation=!0,this._dataUpdated(),s&&(yield this.doLayout()),yield this.playShowEffect(),this.updateElementLines(),this._dataUpdated()})}playShowEffect(){return C(this,null,function*(){if(this.graphData.nodes.length===0){u(\"relation-graph:move to center: data not ready!\");return}if(u(\"playShowEffect:\",this.options.moveToCenterWhenRefresh,this.options.zoomToFitWhenRefresh),this.graphData.rootNode&&Number.isNaN(this.graphData.rootNode.x)){u(\"rootNode.x is NaN, graph is currently hidden?\");return}this.options.moveToCenterWhenRefresh?yield this.moveToCenter():(u(\"center:0,0\"),this.setCanvasCenter(0,0),this._dataUpdated()),yield this.zoomToFitWhenRefresh()})}moveToCenter(){return C(this,null,function*(){if(this.options.useAnimationWhenRefresh){const s=this.getNodesCenter();u(\"center:\",s.x,s.y);const t=this.getGraphOffet();u(\"centerOffset:\",t.offset_x,t.offset_y);const o=this.options.viewSize.width/2-s.x+t.offset_x,n=this.options.viewSize.height/2-s.y+t.offset_y;yield this.animateGoto(o,n,500),this._dataUpdated()}else{const s=this.getNodesCenter();u(\"center:\",s.x,s.y),this.setCanvasCenter(s.x,s.y),this._dataUpdated()}})}zoomToFitWhenRefresh(){return C(this,null,function*(){this.options.zoomToFitWhenRefresh&&(yield this.zoomToFit())})}placeOtherNodes(){return C(this,null,function*(){const s=this.options.placeSingleNode&&this.layouter.layoutOptions.layoutName!==\"fixed\",t=[];this.graphData.rootNode&&this.findGroupNodes(this.graphData.rootNode,t);const o=[],n=[];this.graphData.nodes.forEach(i=>{t.includes(i)||(this.options.placeSingleNode&&(!i.targetNodes||i.targetNodes.length===0)&&i.fixed!==!0?(s&&(i.x=Math.floor(Math.random()*200)-100,i.y=Math.floor(Math.random()*200)-100,i.lot||(i.lot={childs:[]})),i.lot.placed=!0,i.singleNode=!0,n.push(i)):o.push(i))}),s&&this.placeSingleNodes(n),s&&(this.options.placeOtherGroup&&(yield this.placeOtherGroup(o,t)),this._dataUpdated(),this.layouter.layoutOptions.layoutName===\"force\"&&(this.stopAutoLayout(),setTimeout(()=>{this.startAutoLayout()},500)))})}placeSingleNodes(s){if(s.length>0){u(\"sigle nodes:\",s.length);const t=new dt({layoutName:\"force\"},this.options,this);t.allNodes=this.graphData.nodes,t.fastStart=!0,t.justLayoutSingleNode=!0,t.maxLayoutTimes=100,t.byLine=!1,t.autoLayout(!0)}}placeOtherGroup(s,t){return C(this,null,function*(){if(s.length>0){u(\"[placeOtherGroup]notPlacedNodes nodes:\",s.length);const o=JSON.parse(JSON.stringify(this.layouter.layoutOptions)),n=s[0],i=xt(o,this.options,this);i.isMainLayouer=!1;const a=this.getStuffSize(t);u(\"[placeOtherGroup]placeOtherGroup:\",i.layoutOptions.layoutName,\"root:\",n.text);let l=this.layouter.layoutOptions.layoutName.includes(\"tree\")?300:600;if(i.layoutOptions.layoutName===\"force\"){const c=i;c.maxLayoutTimes=0,l=100}n.fixed||(n.x=a.maxX+l,n.y=0),i.layoutOptions.fixedRootNode=!0;const r=[];this.findGroupNodes(n,r),u(\"[placeOtherGroup]thisGroupNodes:\",s.length),this.layouter.requireLinks&&this.layouter.setLinks(this.getLinks()),yield i.placeNodes(r,n),t.push(...r);const h=[];s.forEach(c=>{t.includes(c)||h.push(c)}),this.options.placeOtherGroup&&(yield this.placeOtherGroup(h,t)),this._dataUpdated()}else u(\"[placeOtherGroup]thisGroupNodes:all is OK!\")})}zoomToFit(s){return C(this,null,function*(){const t=this.getStuffSize(),o=this.options.viewSize.width/t.width,n=this.options.viewSize.height/t.height,i=Math.min(o,n,1);u(\"zoomToFit:\",{stuffSize:t,zoomPercent:i,zoomPercentX:o,zoomPercentY:n,viewSize:this.options.viewSize}),this.options.useAnimationWhenRefresh?(yield this.animateToZoom(i*100,300),this._dataUpdated(),s&&s()):(this.setZoom(i*100),this._dataUpdated(),s&&s())})}animateGoto(s,t,o){return C(this,null,function*(){return new Promise((n,i)=>{u(\"animateGoto:\",s,t);const a=s-this.options.canvasOffset.x,l=t-this.options.canvasOffset.y,r=o,h=5,c=Math.round(a/h),p=Math.round(l/h),d=r/h;this.animateStepAction(0,d,h,()=>{this.options.canvasOffset.x+=c,this.options.canvasOffset.y+=p,this._dataUpdated()},()=>{n()})})})}animateToZoom(s,t){return C(this,null,function*(){return new Promise((o,n)=>{const i=s-this.options.canvasZoom,a=t,l=5,r=Math.round(i/l),h=a/l;u(\"animateToZoom:\",i,r),this.animateStepAction(0,h,l,()=>{this.zoom(r),this._dataUpdated()},()=>{this.setZoom(s),this._dataUpdated(),o()})})})}animateStepAction(s,t,o,n,i){s<o?(n(s,o),setTimeout(()=>{this.animateStepAction(s+1,t,o,n,i)},t)):i()}toggleAutoLayout(){this.options.autoLayouting=!this.options.autoLayouting,u(\"toggleAutoLayout:to:\",this.options.autoLayouting),this.options.autoLayouting?this.startAutoLayout():this.stopAutoLayout()}startAutoLayout(){this.options.autoLayouting=!0,this.layouter.autoLayout?(u(\"startAutoLayout:\"),this.layouter.autoLayout(!0)):u(\"Current layout not support autoLayout()\")}stopAutoLayout(){this.options.autoLayouting=!1,this.layouter.stop?this.layouter.stop():u(\"Current layout not support stop()\")}sleep(s){return C(this,null,function*(){yield mt(s)})}}let nt={x:0,y:0};const it={x:0,y:0},st={x:0,y:0};let Pt,zt;const It=e=>{const s={clientX:0,clientY:0};if(tt(e)){const t=e.touches||e.targetTouches;if(!t)throw new Error(\"error targetTouches\");s.clientX=t[0].clientX,s.clientY=t[0].clientY}else s.clientX=e.clientX,s.clientY=e.clientY;return s},Q={startDrag(e,s,t,o){o?Pt=(n,i,a)=>{const l=n-st.x,r=i-st.y;o(l,r,it,st,a)}:Pt=(n,i)=>{nt.x=it.x+(n-st.x),nt.y=it.y+(i-st.y)},zt=t,nt=s,it.x=nt.x,it.y=nt.y,u(\"[canvas]onDragStart...\",tt(e),e);try{const n=It(e);st.x=n.clientX,st.y=n.clientY,tt(e)?(document.body.addEventListener(\"touchmove\",Q.onNodeMove),document.body.addEventListener(\"touchend\",Q.onNodeDragend),e.preventDefault()):(document.body.addEventListener(\"mousemove\",Q.onNodeMove),document.body.addEventListener(\"mouseup\",Q.onNodeDragend))}catch(n){console.error(n.message)}},onNodeMove(e){const s=It(e);Pt(s.clientX,s.clientY,e)},onNodeDragend(e){tt(e)?(document.body.removeEventListener(\"touchmove\",Q.onNodeMove),document.body.removeEventListener(\"touchend\",Q.onNodeDragend)):(document.body.removeEventListener(\"mousemove\",Q.onNodeMove),document.body.removeEventListener(\"mouseup\",Q.onNodeDragend)),u(\"[canvas]onDragend...\",tt(e),e),zt&&zt(nt.x-it.x,nt.y-it.y,e)}},no=Object.freeze(Object.defineProperty({__proto__:null,default:Q},Symbol.toStringTag,{value:\"Module\"}));class io extends oo{constructor(t,o){super(t,o);v(this,\"prevClickTime\",0);v(this,\"movingListener\");v(this,\"step1EventTime\",0);v(this,\"onCreateLineCallback\");v(this,\"_wheelAction\",0);v(this,\"_wheelBuff\",0)}setDefaultLineShape(t){this.options.defaultLineShape=t}setDefaultJunctionPoint(t){this.options.defaultJunctionPoint=t}setCheckedNode(t){this.options.checkedNodeId=t}setCheckedLinkAndLine(t,o){this.options.checkedLinkId=t.seeks_id,this.options.checkedLineId=o?o.id:\"\"}clearChecked(){this.options.checkedNodeId=\"\",this.options.checkedLineId=\"\",this.options.checkedLinkId=\"\"}selectNode(t,o){t.selected=o}flashNode(t,o){t.flashing=o}updateNodeOffsetSize(t,o,n){t.el.offsetWidth=o,t.el.offsetHeight=n}onNodeClick(t,o){return C(this,null,function*(){if(Date.now()-this.prevClickTime<200){u(\"[node]click abort : time < 200\");return}if(this.prevClickTime=Date.now(),this.options.creatingLinePlot){this.onNodeClickWhenCreatingLinePlot(t);return}u(\"[node]node click\",t.text,this.options.creatingLinePlot),!o.shiftKey&&this.options.disableNodeClickEffect!==!0&&t.disableDefaultClickEffect!==!0&&(this.options.checkedLinkId=\"\",this.options.checkedLineId=\"\",this.setCheckedNode(t.id)),this.emitEvent($.onNodeClick,t,o),this.prevClickTime=Date.now()})}onNodeDragStart(t,o){if(this.options.disableDragNode||t.disableDrag)return;isNaN(t.x)&&(t.x=0),isNaN(t.y)&&(t.y=0),t.dragging=!0,this.emitEvent($.nodeDragStart,t,o);const n=(i,a,l)=>{t.dragging=!1,this.options.editingReferenceLine.show=!1,this.onNodeDraged(t,i,a,l),this._dataUpdated()};Q.startDrag(o,t,n,(i,a,l)=>{let r=i/(this.options.canvasZoom/100)+l.x,h=a/(this.options.canvasZoom/100)+l.y;const c=r-t.x,p=h-t.y,d=this.emitEvent($.nodeDragging,t,r,h,c,p,o);d&&(typeof d.x==\"number\"&&(r=d.x),typeof d.y==\"number\"&&(h=d.y)),this.options.useHorizontalView&&(r=a/(this.options.canvasZoom/100)+l.x,h=-i/(this.options.canvasZoom/100)+l.y),this.setNodePosition(t,r,h),this.draggingSelectedNodes(t,c,p),this.updateElementLines(),this._dataUpdated()})}onNodeDraged(t,o,n,i){if(o===0&&n===0){u(\"[node]node click by drag\"),this.onNodeClick(t,i),this.onNodeDragEnd(t,i);return}this.options.isMoveByParentNode&&t.lot.childs.forEach(a=>{a.x+=o,a.y+=n}),Math.abs(o)+Math.abs(n)>6?(this.prevClickTime=Date.now(),setTimeout(()=>{u(\"[node]onDragEnd2\"),this.onNodeDragEnd(t,i)},100)):(u(\"[node]onDragEnd1\"),this.onNodeDragEnd(t,i))}onNodeDragEnd(t,o){this.updateElementLines(),this.emitEvent($.nodeDragEnd,t)}onLineClick(t,o,n){return C(this,null,function*(){u(\"onLineClick:\",\"line:\",t,\"link:\",o),this.options.disableLineClickEffect!==!0&&t.disableDefaultClickEffect!==!0&&(this.setCheckedNode(\"\"),this.setCheckedLinkAndLine(o,t)),this.emitEvent($.onLineClick,t,o,n)})}expandOrCollapseNode(t,o){return C(this,null,function*(){t.expanded===!1?yield this.expandNode(t,o):yield this.collapseNode(t,o)})}setChildsFromPosition(t,o){t.lot.childs.forEach(n=>{n.x=o.x,n.y=o.y,this.setChildsFromPosition(n,o)})}expandNode(t,o){return C(this,null,function*(){u(\"onNodeExpand:\",t),t.expanded=!0,this.options.useAnimationWhenExpanded&&(yield this.layouter.snapshotBeforeAnimation(),this.setChildsFromPosition(t,t),yield this.layouter.animationLayout(!1)),u(\"relayout check:\",this.options.reLayoutWhenExpandedOrCollapsed),this.options.reLayoutWhenExpandedOrCollapsed&&(u(\"relayout...\"),yield this.layouter.snapshotBeforeAnimation(),yield this.doLayout()),this.updateElementLines(),this._dataUpdated(),this.emitEvent($.onNodeExpand,t,o)})}getDescendantNodes(t){return x.getDescendantNodes(t)}setChildsToPosition(t,o){t.lot.childs.forEach(n=>{n.lot.from_x=n.x,n.lot.from_y=n.y,n.lot.to_x=o.x,n.lot.to_y=o.y,this.setChildsToPosition(n,o)})}collapseNode(t,o){return C(this,null,function*(){u(\"onNodeCollapse:\",t),this.options.useAnimationWhenExpanded&&(yield this.layouter.snapshotBeforeAnimation(),this.setChildsToPosition(t,t),yield this.layouter.animationLayout(!1)),t.expanded=!1,u(\"relayout check:\",this.options.reLayoutWhenExpandedOrCollapsed),this.options.reLayoutWhenExpandedOrCollapsed&&(u(\"relayout...\"),yield this.layouter.snapshotBeforeAnimation(),yield this.doLayout()),this.updateElementLines(),this._dataUpdated(),this.emitEvent($.onNodeCollapse,t,o)})}onCanvasDragEnd(t){this.updateEditingControllerView(),this.emitEvent($.onCanvasDragEnd,t)}onCanvasClick(t){this.options.creatingLinePlot&&this.onCanvasClickWhenCreatingLinePlot(t),this.emitEvent($.onCanvasClick,t)}clickGraphMask(t){this.clearLoading()}onCanvasSelectionEnd(t,o){this.emitEvent($.onCanvasSelectionEnd,t,o)}startCreatingNodePlot(t,o){this.options.newNodeTemplate=ft(JSON.parse(JSON.stringify(Et)),this.options),this.options.creatingNodePlot=!0;const n=tt(t);this.options.showTemplateNode=!n;let i=(f,m)=>{const _=this.options.newNodeTemplate,y={width:_.el&&_.el.offsetWidth?_.el.offsetWidth:_.width||96,height:_.el&&_.el.offsetHeight?_.el.offsetHeight:_.height||96};this.options.newNodeTemplate.x=f-y.width/2,this.options.newNodeTemplate.y=m-y.height/2,this._dataUpdated()},a=(f,m,_)=>{const y=\"s-\"+Date.now();this.addNodes([{id:y,text:this.options.newNodeTemplate.text,x:f,y:m}])};o&&o.templateText&&(this.options.newNodeTemplate.text=o.templateText),o&&o.templateStyleClass&&(this.options.newNodeTemplate.styleClass=o.templateStyleClass),o&&o.templateNode&&Object.keys(o.templateNode).forEach(f=>{this.options.newNodeTemplate[f]=o.templateNode[f]}),o&&o.templateMove&&(i=o.templateMove),o&&o.onCreateNode&&(a=o.onCreateNode);const l=this.$dom.getBoundingClientRect();u(\"[CreatingNodePlot]startCreatingNodePlot:\");const r=kt(t),h=r.clientX-l.x+10,c=r.clientY-l.y+10;n||i(h,c);const p=f=>{const m=this.$dom.getBoundingClientRect();u(\"[CreatingNodePlot]objectTemplateMove\");const _=f.clientX-m.x,y=f.clientY-m.y;i(_,y)},d=f=>{u(\"[CreatingNodePlot]user abort!\"),this.$dom.removeEventListener(\"mousemove\",p),this.$dom.removeEventListener(\"click\",g),this.$dom.removeEventListener(\"contextmenu\",d),this.options.creatingNodePlot=!1},g=f=>{let m=!1;if(this.options.creatingNodePlot||(m=!0),this.$dom.removeEventListener(\"mousemove\",p),this.$dom.removeEventListener(\"click\",g),this.$dom.removeEventListener(\"contextmenu\",d),this.options.creatingNodePlot=!1,m){u(\"[CreatingNodePlot]action be abort!\");return}const _=kt(f),y=_.clientX-l.x+10,M=_.clientY-l.y+10;if(o&&o.disableClickCreate&&Math.abs(h-y)<5&&Math.abs(c-M)<5){u(\"[CreatingNodePlot]create node be abort!\");return}const S=this.getCanvasCoordinateByClientCoordinate({x:_.clientX,y:_.clientY});u(\"[CreatingNodePlot]objectBePlaced:\",S),a(S.x,S.y,this.options.newNodeTemplate),this._dataUpdated()};setTimeout(()=>{this.$dom.addEventListener(\"click\",g),this.$dom.addEventListener(\"contextmenu\",d)},300),n||this.$dom.addEventListener(\"mousemove\",p)}startCreatingLinePlot(t,o){const n=tt(t);o&&o.onCreateLine&&(this.onCreateLineCallback=o.onCreateLine);const i=ht({from:\"newRelationTemplate-from\",to:\"newRelationTemplate-to\",color:\"\",text:\"new line\"});o&&o.template&&Object.assign(i,o.template),this.options.newLineTemplate=i,this.options.newLinkTemplate.fromNode=null,o&&o.fromNode&&(this.options.newLinkTemplate.toNode.x=o.fromNode.x+50,this.options.newLinkTemplate.toNode.y=o.fromNode.y+50,this.options.newLinkTemplate.fromNode=o.fromNode,this.step1EventTime=Date.now()),this.options.creatingLinePlot=!0,this.options.newLinkTemplate.toNodeObject=null,this.options.newLineTemplate.disableDefaultClickEffect=!0,this.options.newLinkTemplate.toNode.el.offsetWidth=2,this.options.newLinkTemplate.toNode.el.offsetHeight=2,u(\"[CreatingLinePlot]startCreatingLinePlot:\",n),n||(u(\"[CreatingLinePlot]Listener move\"),this.movingListener&&this.$dom.removeEventListener(\"mousemove\",this.movingListener),this.movingListener=this.onMovingWhenCreatingLinePlot.bind(this),this.$dom.addEventListener(\"mousemove\",this.movingListener)),this.dataUpdated()}stopCreatingLinePlot(){u(\"[CreatingLinePlot]stop CreatingLinePlot!\"),this.options.creatingLinePlot=!1,this.options.newLinkTemplate.fromNode=null,this.options.newLinkTemplate.toNodeObject=null,this.onCreateLineCallback=void 0,this.$dom.removeEventListener(\"mousemove\",this.movingListener),this.movingListener=void 0,this.options.nodeConnectController.show=!1,this._dataUpdated()}onMovingWhenCreatingLinePlot(t){if(u(\"[CreatingLinePlot]mousemove\"),this.options.newLinkTemplate.fromNode){const n=this.getCanvasCoordinateByClientCoordinate({x:t.clientX,y:t.clientY});this.options.newLinkTemplate.toNode.x=n.x,this.options.newLinkTemplate.toNode.y=n.y,this._dataUpdated()}const o=this.isNode(t.target);o&&(o===this.options.newLinkTemplate.fromNode?this.options.nodeConnectController.show=!1:(this.options.nodeConnectController.node=o,this.updateEditingConnectControllerView(),this.options.nodeConnectController.show=!0))}onCanvasClickWhenCreatingLinePlot(t){if(Date.now()-this.step1EventTime<500){u(\"[CreatingLinePlot]step1EventTime:\",this.step1EventTime);return}if(!this.options.newLinkTemplate.fromNode){u(\"[CreatingLinePlot]CreatingLinePlot:fromNode not set!\");return}if(!this.options.newLinkTemplate.toNodeObject){u(\"[CreatingLinePlot]CreatingLinePlot:toNodeObject not set!\");const o=kt(t),n=this.getCanvasCoordinateByClientCoordinate({x:o.clientX,y:o.clientY});this.onCreateLine(this.options.newLinkTemplate.fromNode,n)}this.stopCreatingLinePlot()}onNodeClickWhenCreatingLinePlot(t){this.options.newLinkTemplate.fromNode?(u(\"[CreatingLinePlot]step 2: set toNodeObjecct:\",this.options.newLinkTemplate.fromNode,t),this.options.newLinkTemplate.toNodeObject=t,this.onCreateLine(this.options.newLinkTemplate.fromNode,t),this.stopCreatingLinePlot()):(u(\"[CreatingLinePlot]step 1: set fromNode:\",t),this.options.newLinkTemplate.fromNode=t,this.options.newLinkTemplate.toNode.x=t.x+50,this.options.newLinkTemplate.toNode.y=t.y+50,this.step1EventTime=Date.now())}onCreateLine(t,o){u(\"[CreatingLinePlot][fire-event]onCreateLine:\",t,o),this.onCreateLineCallback&&(this.options.newLineTemplate.disableDefaultClickEffect=!1,this.onCreateLineCallback(t,o,this.options.newLineTemplate))}isNode(t){const o=Mt(t,\"rel-node-peel\",\"rel-map\");return o?this.getNodeById(o.dataset.id):void 0}isLink(t){const o=Mt(t,\"rel-link-peel\",\"rel-map\");return o?this.getLinkById(o.dataset.id):void 0}onContextmenu(t){this.stopCreatingLinePlot();let o=\"canvas\",n=this.isNode(t.target);n?o=\"node\":(n=this.isLink(t.target),n&&(o=\"link\")),u(\"contextmenu:objectType\",o,n),this.emitEvent($.onContextmenu,t,o,n)}fullscreen(t){return C(this,null,function*(){if(Y.default.element&&Y.default.element!==this.$dom)return;let o=!1;t===void 0&&(t=!this.options.fullscreen,o=!0),this.options.fullscreen=t,this.emitEvent($.fullscreen,this.options.fullscreen)!==!1&&o&&(yield Y.default.toggle(this.$dom))})}focusNodeById(t){return C(this,null,function*(){let o;this.graphData.nodes.forEach(n=>{n.id===t&&(o=n)}),o&&(yield this.handleSelect(o))})}focusRootNode(){return C(this,null,function*(){u(\"relation-graph:focusRootNode\"),this.graphData.rootNode&&(yield this.handleSelect(this.graphData.rootNode))})}handleSelect(t){return C(this,null,function*(){u(\"checked:\",t),scrollTo({top:this.$dom.offsetTop}),yield this.animateToZoom(100,300);const o=t.width||50,n=t.height||50,i=t.x*-1+this.options.viewSize.width/2-o/2,a=t.y*-1+this.options.viewSize.height/2-n/2;yield this.animateGoto(i,a,500),this.options.checkedNodeId=t.id,this.refreshNVAnalysisInfo()})}onMouseWheel(t){if(this.options.disableZoom)return t.cancelBubble=!1,!0;try{t.cancelBubble=!0,t.preventDefault(),t.stopPropagation()}catch(a){}let o=t.deltaY;o===void 0&&(o=t.wheelDelta);const i=5*(o>0?-1:1);this._onMouseWheel(t,i)}_onMouseWheel(t,o){const n={x:t.clientX,y:t.clientY};this.zoom(o,n)}onLineDragStart(t,o){u(\"onLineDragStart...\");const n={x:t.fromNode.x,y:t.fromNode.y},i={x:t.toNode.x,y:t.toNode.y},a=(l,r,h,c,p)=>{t.fromNode.x=n.x+l/(this.options.canvasZoom/100),t.fromNode.y=n.y+r/(this.options.canvasZoom/100),t.toNode.x=i.x+l/(this.options.canvasZoom/100),t.toNode.y=i.y+r/(this.options.canvasZoom/100),this.updateEditingControllerView(),this._dataUpdated()};Q.startDrag(o,{x:0,y:0},(...l)=>{this.onLineDragEnd(...l)},a)}onLineDragEnd(t,o,n){u(\"onLineDragEnd\"),this.updateElementLines()}onCanvasDragStart(t){if(u(\"[canvas]onCanvasDragStart...\"),this.options.disableDragCanvas)return;if(this.options.selectionMode||t.shiftKey){this.startCreateSelection(t);return}if(!this.options.disableDragLine){const n=this.isLink(t.target);if(n){this.onLineDragStart(n,t);return}}let o;if(tt(t)){let n,i=1;o=(a,l,r,h,c)=>{const p=c.touches||c.targetTouches,d=p[0];if(p&&p.length>1){c.preventDefault();const g=p[1];n||(n={x:g.clientX,y:g.clientY},i=this.options.canvasZoom);const f={x:d.clientX,y:d.clientY},m={x:g.clientX,y:g.clientY},_=Math.hypot(n.x-h.x,n.y-h.y),M=Math.hypot(m.x-f.x,m.y-f.y)/_,S=i*M;this.setZoom(S),this._dataUpdated()}else{const g=d.clientX,f=d.clientY;let m=r.x+(g-h.x),_=r.y+(f-h.y);this.options.useHorizontalView?(m=r.x+(f-h.y),_=r.y-(g-h.x),this.setCanvasOffset(m,_)):this.setCanvasOffset(m,_),this.updateEditingControllerView(),this._dataUpdated()}}}else o=(n,i,a,l,r)=>{const h=a.x+n,c=a.y+i;this.setCanvasOffset(h,c),this.updateEditingControllerView()};Q.startDrag(t,this.options.canvasOffset,(...n)=>{this.onCanvasDragStop(...n)},o)}onCanvasDragStop(t,o,n){if(u(\"[canvas]onCanvasDragStop...\"),this.options.creatingSelection){this.options.creatingSelection=!1,this._dataUpdated(),this.onCanvasSelectionEnd(this.options.selectionView,n);return}if(t===0&&o===0){u(\"[canvas]click2\"),this._dataUpdated(),this.onCanvasClick(n);return}Math.abs(t)+Math.abs(o)>6?setTimeout(()=>{u(\"[canvas]onDragEnd1\"),this.onCanvasDragEnd(n)},100):(u(\"[canvas]onDragEnd2\"),this.onCanvasDragEnd(n))}startCreateSelection(t){let o=!1;const n=(i,a,l,r,h)=>{if(!o&&Math.abs(i)+Math.abs(a)>6&&(o=!0,this.options.creatingSelection=!0,this.options.selectionView.x=r.x,this.options.selectionView.y=r.y),o){const c=this.getBoundingClientRect();i<0?(this.options.selectionView.x=r.x+i-c.x,this.options.selectionView.width=Math.abs(i)):(this.options.selectionView.x=r.x-c.x,this.options.selectionView.width=i),a<0?(this.options.selectionView.y=r.y+a-c.y,this.options.selectionView.height=Math.abs(a)):(this.options.selectionView.y=r.y-c.y,this.options.selectionView.height=a)}this._dataUpdated()};Q.startDrag(t,{x:0,y:0},(...i)=>{this.onCanvasDragStop(...i)},n)}}class so extends io{constructor(s,t){super(s,t)}dataUpdated(){(this.isReact||this.options.canvasZoom<=40)&&this._dataUpdated()}setOptions(s,t=!1){return C(this,null,function*(){if(this.disableNextLayoutAnimation=!0,this._setOptions(s),t===!0){u(\"setOptions:justUpdateOptionsValue\");return}this.initLayouter(),this.resetViewSize(),yield this.doLayout()})}setLayouter(s){u(\"setLayouterClass::\",s),this.userLayouerClass=s,this.layouter=this.userLayouerClass}switchLayout(s,t=!0,o=!1){return C(this,null,function*(){this.emitEvent($.beforeChangeLayout,s)===!1&&(t=!1);const i=this.layouter?this.layouter.allNodes:[],a=this.layouter&&this.layouter.rootNode;u(\"[change layout]switchLayout\"),this.stopAutoLayout(),bt(s,this.options),this._initLayoutByLayoutOptions(s),this.layouter.allNodes=i,this.layouter.rootNode=a,t?yield this.refresh():(o||(this.disableNextLayoutAnimation=!0),yield this.doLayout())})}setJsonData(s,t=!1){return C(this,null,function*(){this.options.canvasOpacity=.01,this._dataUpdated(),yield this._setJsonData(s);const o=s.rootId;if(o&&(this.graphData.rootNode=this.graphData.nodes.find(n=>n.id===o)),!this.graphData.rootNode&&this.graphData.nodes.length>0&&(this.graphData.rootNode=this.graphData.nodes[0]),this.graphData.rootNode)this.options.defaultFocusRootNode&&this.setCheckedNode(this.graphData.rootNode.id);else throw new Error(\"The root node [rootId] is not set! Or cannot get the root node:\"+s.rootId+\", If you don't have any nodes to display, you can simply set an invisible node: {id:'root', opacity:0}\");t&&(u(\"resetViewSize:\",t),this.resetViewSize()),this.disableNextLayoutAnimation=!0,yield this.doLayout(),u(\"doLayout:placeOtherNodes\"),yield this.placeOtherNodes(),u(\"doLayout:placeOtherNodes ok!\")})}appendJsonData(s,t=!0){return C(this,null,function*(){u(\"appendData:\",s),this.options.canvasOpacity=.01,this._dataUpdated(),this.loadGraphJsonData(s),t&&(this.disableNextLayoutAnimation=!0,yield this.doLayout())})}}class ao extends so{constructor(t,o){super(t,o);v(this,\"$easyViewCanvas\");v(this,\"$evCanvasCtx\");v(this,\"easyViewUpdating\",!1);v(this,\"easyViewUpdateHasNext\",!1);v(this,\"easyViewUpdateTimer\");v(this,\"easyViewOffset\",{x:0,y:0})}setEasyViewCanvas(t){this.$easyViewCanvas=t,this.$evCanvasCtx=this.$easyViewCanvas.getContext(\"2d\")}startUpdateTask(){this.updateEasyView(),requestAnimationFrame(this.startUpdateTask.bind(this))}updateEasyView(){this.updateMiniView(),this.options.performanceMode&&(!this.options.showEasyView||requestAnimationFrame(this._updateEasyView.bind(this)))}_updateEasyView(){try{this.easyViewUpdating=!0,this.evDosomethingBeforeDraw(),this.evDrawAllNodes(),this.evDrawAllLines()}catch(t){console.error(t)}this.easyViewUpdating=!1,this.easyViewUpdateHasNext&&(this.easyViewUpdateHasNext=!1,this._updateEasyView())}evDosomethingBeforeDraw(){const t=this.$easyViewCanvas.getBoundingClientRect().width,o=this.$easyViewCanvas.getBoundingClientRect().height;this.$easyViewCanvas.width=t,this.$easyViewCanvas.height=o,this.$evCanvasCtx.canvas.width=t,this.$evCanvasCtx.canvas.height=o,u(\"updateEasyView\",t,o),this.$evCanvasCtx.scale(this.options.canvasZoom/100,this.options.canvasZoom/100),this.easyViewOffset.x=this.options.canvasOffset.x/(this.options.canvasZoom/100),this.easyViewOffset.y=this.options.canvasOffset.y/(this.options.canvasZoom/100)}evDrawAllNodes(){for(const t of this.getNodes())x.isAllowShowNode(t)&&t.opacity&&t.opacity>0&&this.evDrawNode(t)}evDrawNode(t){(t.nodeShape!==void 0&&t.nodeShape!==null?t.nodeShape:this.options.defaultNodeShape)===1?this.evDrawNode4Rect(t):this.evDrawNode4Circle(t)}getNodeColor(t){const o=t.color||this.options.defaultNodeColor||\"red\";return o===\"transparent\"?\"rgba(204,204,204,0.55)\":o}evDrawNode4Rect(t){const o=this.$evCanvasCtx,n=t.el.offsetWidth-16,i=t.el.offsetHeight-16,a=this.easyViewOffset.x+t.x+8,l=this.easyViewOffset.y+t.y+8;o.beginPath(),o.globalAlpha=t.opacity||1,o.rect(a,l,n,i),o.fillStyle=this.getNodeColor(t),o.fill(),o.globalAlpha=1}evDrawNode4Circle(t){const o=this.$evCanvasCtx,n=t.el.offsetWidth-16,i=t.el.offsetHeight-16,a=this.easyViewOffset.x+t.x+n/2+8,l=this.easyViewOffset.y+t.y+i/2+8;o.beginPath(),o.globalAlpha=t.opacity||1,o.ellipse(a,l,n/2,i/2,0,0,2*Math.PI),o.fillStyle=this.getNodeColor(t),o.fill(),o.globalAlpha=1}evDrawAllLines(){for(const t of this.getLinks())if(x.isAllowShowNode(t.fromNode)&&x.isAllowShowNode(t.toNode))for(let o=0;o<t.relations.length;o++)this.evDrawLine(t,t.relations[o],o)}evDrawLine(t,o,n){const i=this.$evCanvasCtx;this.easyViewOffset.x+t.fromNode.x,this.easyViewOffset.y+t.fromNode.y,this.easyViewOffset.x+t.toNode.x,this.easyViewOffset.y+t.toNode.y;const a=this.createLinePath(t,o,n);i.beginPath(),i.globalAlpha=o.opacity||1,this.evDrawSvgPathOnCanvas(i,a.path),i.strokeStyle=o.color||this.options.defaultLineColor||\"red\",i.lineWidth=o.lineWidth||this.options.defaultLineWidth||1,i.stroke(),i.globalAlpha=1}getPointValue(t,o,n){return n?t+parseFloat(o):parseFloat(o)}evDrawSvgPathOnCanvas(t,o){const n=o.match(/[a-zA-Z][^a-zA-Z]*/g);let i=0,a=0,l=0,r=0,h=0,c=0,p=0,d=0,g=!1;n.forEach(f=>{const m=f.trim().split(/[ ,]+/),_=m[0].toUpperCase(),y=m[0]===m[0].toLowerCase();switch(_){case\"M\":i=this.getPointValue(l,m[1],y)+this.easyViewOffset.x,a=this.getPointValue(r,m[2],y)+this.easyViewOffset.y,l=i,r=a,g&&(t.closePath(),g=!1),t.moveTo(i,a);break;case\"L\":i=this.getPointValue(l,m[1],y)+this.easyViewOffset.x,a=this.getPointValue(r,m[2],y)+this.easyViewOffset.y,t.lineTo(i,a);break;case\"C\":h=this.getPointValue(l,m[1],y),c=this.getPointValue(r,m[2],y),p=this.getPointValue(l,m[3],y),d=this.getPointValue(r,m[4],y),i=this.getPointValue(l,m[5],y),a=this.getPointValue(r,m[6],y),l=i,r=a,t.bezierCurveTo(h,c,p,d,i,a);break;case\"V\":a=this.getPointValue(r,m[1],y),r=a,t.lineTo(i,a);break;case\"H\":i=this.getPointValue(l,m[1],y),l=i,t.lineTo(i,a);break;case\"Z\":t.closePath(),g=!1;break;default:u(`Unsupported command: ${_}`)}})}}class ro extends ao{constructor(){super(...arguments);v(this,\"_onResizing\");v(this,\"_onResizeEnd\");v(this,\"_startPoint\",{x:0,y:0});v(this,\"_startSize\",{x:0,y:0,width:0,height:0});v(this,\"_resizeType\",\"l\");v(this,\"nodeStartSizeMap\",new WeakMap);v(this,\"resizeMiniLimit\",{width:20,height:20})}setEditingNodes(t){this.options.editingController.nodes.forEach(o=>{o.selected=!1}),this.options.editingController.nodes.splice(0,this.options.editingController.nodes.length),this.options.editingController.nodes.push(...t),this.options.editingController.show=this.options.editingController.nodes.length>0,this.updateEditingControllerView()}addEditingNode(t){this.options.editingController.nodes.forEach(o=>{o.selected=!1}),this.options.editingController.show=!0,this.options.editingController.nodes.push(t),this.updateEditingControllerView()}removeEditingNode(t){this.options.editingController.nodes.forEach(o=>{o.selected=!1}),this.options.editingController.nodes.splice(this.options.editingController.nodes.indexOf(t),1),this.options.editingController.show=this.options.editingController.nodes.length>0,this.updateEditingControllerView()}toggleEditingNode(t){this.options.editingController.nodes.forEach(o=>{o.selected=!1}),this.options.editingController.nodes.includes(t)?this.removeEditingNode(t):this.addEditingNode(t)}updateEditingControllerView(){if(this.updateEditingLineView(),!this.options.editingController.show)return;this.options.editingController.nodes.length>1&&this.options.editingController.nodes.forEach(g=>{g.selected=!0});let t=9999999,o=9999999,n=-9999999,i=-9999999;for(const g of this.options.editingController.nodes)g.x<t&&(t=g.x),g.y<o&&(o=g.y),g.x+g.el.offsetWidth>n&&(n=g.x+g.el.offsetWidth),g.y+g.el.offsetHeight>i&&(i=g.y+g.el.offsetHeight);const a=this.options.editingController.nodes.length>1?5:0,l=this.options.canvasZoom/100,r=t,h=o,c=n-t,p=i-o,d=this.getViewPointByCanvasPoint({x:r,y:h});this.options.editingController.x=d.x-a*l,this.options.editingController.y=d.y-a*l,this.options.editingController.width=c*l+a*2*l,this.options.editingController.height=p*l+a*2*l,this.dataUpdated()}_getEventPoint(t){const o={x:t.clientX,y:t.clientY};if(tt(t)){const i=t.touches||t.targetTouches;if(!i)throw new Error(\"error targetTouches\");o.x=i[0].clientX,o.x=i[0].clientY}const n=this.getBoundingClientRect();return{x:o.x-n.x,y:o.y-n.y}}onResizeStart(t,o){this._resizeType=t,this._startPoint=this._getEventPoint(o),this._startSize.x=this.options.editingController.x,this._startSize.y=this.options.editingController.y,this._startSize.width=this.options.editingController.width,this._startSize.height=this.options.editingController.height;for(const n of this.options.editingController.nodes)this.nodeStartSizeMap.set(n,{x:n.x,y:n.y,width:n.el.offsetWidth,height:n.el.offsetHeight});this._onResizing&&this.$dom.removeEventListener(\"mousemove\",this._onResizing),this._onResizeEnd&&this.$dom.removeEventListener(\"mouseup\",this._onResizeEnd),this._onResizing=this.onResizing.bind(this),this._onResizeEnd=this.onResizeEnd.bind(this),this.$dom.addEventListener(\"mousemove\",this._onResizing),this.$dom.addEventListener(\"mouseup\",this._onResizeEnd),this.emitEvent($.onResizeStart,this.options.editingController.nodes)}onResizing(t){const o=this._getEventPoint(t),n=o.x-this._startPoint.x,i=o.y-this._startPoint.y;let a=this.options.editingController.width,l=this.options.editingController.height;const r=1;this._resizeType===\"tl\"?(this.options.editingController.x=this._startSize.x+n/r,this.options.editingController.y=this._startSize.y+i/r,a=this._startSize.width-n/r,l=this._startSize.height-i/r):this._resizeType===\"tr\"?(this.options.editingController.y=this._startSize.y+i/r,a=this._startSize.width+n/r,l=this._startSize.height-i/r):this._resizeType===\"bl\"?(this.options.editingController.x=this._startSize.x+n/r,a=this._startSize.width-n/r,l=this._startSize.height+i/r):this._resizeType===\"br\"?(a=this._startSize.width+n/r,l=this._startSize.height+i/r):this._resizeType===\"t\"?(this.options.editingController.y=this._startSize.y+i/r,l=this._startSize.height-i/r):this._resizeType===\"r\"?a=this._startSize.width+n/r:this._resizeType===\"b\"?l=this._startSize.height+i/r:this._resizeType===\"l\"&&(this.options.editingController.x=this._startSize.x+n/r,a=this._startSize.width-n/r),a<this.resizeMiniLimit.width&&(a=this.resizeMiniLimit.width),l<this.resizeMiniLimit.width&&(l=this.resizeMiniLimit.width),this.options.editingController.width=a,this.options.editingController.height=l,this._applyResizeScale(t),this.dataUpdated()}_applyResizeScale(t){const o=this.options.editingController.width/this._startSize.width,n=this.options.editingController.height/this._startSize.height,i=this.getCanvasPointByViewPoint({x:this._startSize.x,y:this._startSize.y}),a=this.getCanvasPointByViewPoint({x:this.options.editingController.x,y:this.options.editingController.y});for(const l of this.options.editingController.nodes){const r=this.nodeStartSizeMap.get(l),h=r.width*o,c=r.height*n;l.x=a.x+o*(r.x-i.x),l.y=a.y+n*(r.y-i.y),l.width=h-16,l.height=c-16}}onResizeEnd(t){const o=this._getEventPoint(t);o.x-this._startPoint.x,o.y-this._startPoint.y,this._applyResizeScale(t),this.$dom.removeEventListener(\"mousemove\",this._onResizing),this.$dom.removeEventListener(\"mouseup\",this._onResizeEnd),this._onResizing=null,this._onResizeEnd=null,this.emitEvent($.onResizeEnd,this.options.editingController.nodes)}draggingSelectedNodes(t,o,n){if(!this.options.editingController.nodes.includes(t)){this.updateReferenceLineView(t,o,n),this.updateEditingLineView();return}for(const i of this.options.editingController.nodes)i!==t&&(i.x+=o,i.y+=n);this.updateReferenceLineView(t,o,n),this.updateEditingControllerView()}getNodesInSelectionView(t){const o=this.getBoundingClientRect(),n=this.getCanvasCoordinateByClientCoordinate({x:t.x+o.x,y:t.y+o.y}),i=this.getCanvasCoordinateByClientCoordinate({x:t.x+t.width+o.x,y:t.y+t.height+o.y}),a=[];return this.getNodes().forEach(l=>{const r=l.x+l.el.offsetWidth/2,h=l.y+l.el.offsetHeight/2;r>n.x&&h>n.y&&r<i.x&&h<i.y&&a.push(l)}),a}updateEditingConnectControllerView(){const t=this.options.nodeConnectController.node,o=t.x,n=t.y,i=t.x+t.el.offsetWidth,a=t.y+t.el.offsetHeight,l=0,r=this.options.canvasZoom/100,h=o,c=n,p=i-o,d=a-n,g=this.getViewPointByCanvasPoint({x:h,y:c});this.options.nodeConnectController.x=g.x-l*r,this.options.nodeConnectController.y=g.y-l*r,this.options.nodeConnectController.width=p*r+l*2*r,this.options.nodeConnectController.height=d*r+l*2*r,this.dataUpdated()}setEditingLine(t,o){this.options.editingLineController.link=o,this.options.editingLineController.line=t,this.options.editingLineController.show=!!(o&&t),this.updateEditingLineView()}updateReferenceLineView(t,o,n){if(!this.options.showReferenceLine)return;const i=Math.abs(o),a=Math.abs(n);if(!this.options.editingReferenceLine.show&&i+a>0&&(this.options.editingReferenceLine.show=!0),!this.options.editingReferenceLine.show)return;const l=t.x,r=t.x+t.el.offsetWidth/2,h=t.x+t.el.offsetWidth,c=t.y,p=t.y+t.el.offsetHeight/2,d=t.y+t.el.offsetHeight,g=this.getViewPointByCanvasPoint({x:l,y:c}),f=this.getViewPointByCanvasPoint({x:r,y:p}),m=this.getViewPointByCanvasPoint({x:h,y:d});let _=!1,y=!1;for(const M of this.graphData.nodes){if(M===t)continue;const S=M.x,z=M.x+M.el.offsetWidth/2,X=M.x+M.el.offsetWidth,U=M.y,D=M.y+M.el.offsetHeight/2,V=M.y+M.el.offsetHeight,w=Math.abs(l-S),b=Math.abs(r-z),N=Math.abs(h-X),R=Math.abs(c-U),H=Math.abs(p-D),E=Math.abs(d-V),L=3;if(b<800&&H<800){if(!y&&b<L){const O=this.getViewPointByCanvasPoint({x:z,y:D});this.options.editingReferenceLine.v_x=f.x,this.options.editingReferenceLine.v_y=f.y>O.y?O.y:f.y,this.options.editingReferenceLine.v_height=Math.round(Math.abs(f.y-O.y)),y=!0}if(!y&&w<L){const O=this.getViewPointByCanvasPoint({x:S,y:D});this.options.editingReferenceLine.v_x=g.x,this.options.editingReferenceLine.v_y=f.y>O.y?O.y:f.y,this.options.editingReferenceLine.v_height=Math.round(Math.abs(f.y-O.y)),y=!0}if(!y&&N<L){const O=this.getViewPointByCanvasPoint({x:X,y:D});this.options.editingReferenceLine.v_x=m.x,this.options.editingReferenceLine.v_y=f.y>O.y?O.y:f.y,this.options.editingReferenceLine.v_height=Math.round(Math.abs(f.y-O.y)),y=!0}if(!_&&H<L){const O=this.getViewPointByCanvasPoint({x:z,y:D});this.options.editingReferenceLine.h_y=f.y,this.options.editingReferenceLine.h_x=f.x>O.x?O.x:f.x,this.options.editingReferenceLine.h_width=Math.round(Math.abs(f.x-O.x)),_=!0}if(!_&&R<L){const O=this.getViewPointByCanvasPoint({x:z,y:U});this.options.editingReferenceLine.h_y=g.y,this.options.editingReferenceLine.h_x=f.x>O.x?O.x:f.x,this.options.editingReferenceLine.h_width=Math.round(Math.abs(f.x-O.x)),_=!0}if(!_&&E<L){const O=this.getViewPointByCanvasPoint({x:z,y:V});this.options.editingReferenceLine.h_y=m.y,this.options.editingReferenceLine.h_x=f.x>O.x?O.x:f.x,this.options.editingReferenceLine.h_width=Math.abs(f.x-O.x),_=!0}if(_&&y)break}}this.options.editingReferenceLine.directionH=_,this.options.editingReferenceLine.directionV=y}updateEditingLineView(){if(this.updateElementLines(),!this.options.editingLineController.show)return;const t=this.options.editingLineController.link,o=this.options.editingLineController.line,{path:n,textPosition:i}=this.createLinePath(t,o,t.relations.indexOf(o)),{startPoint:a,endPoint:l}=this.getStartAndEndPoint(n),r=this.getViewPointByCanvasPoint(o.isReverse?l:a),h=this.getViewPointByCanvasPoint(o.isReverse?a:l);this.options.editingLineController.startPoint.x=r.x-5,this.options.editingLineController.startPoint.y=r.y-5,this.options.editingLineController.endPoint.x=h.x-5,this.options.editingLineController.endPoint.y=h.y-5;const c=this.getViewPointByCanvasPoint(i),p=this.$canvasDom.querySelector(`g[data-id='${o.id}']`);let d=0,g=0,f=o.textOffset_x||0,m=o.textOffset_y||0;const _=this.options.canvasZoom/100;if(p){const y=p.querySelector(\"text.c-rg-line-text\");if(y){f=Math.floor(parseFloat(y.getAttribute(\"x\")||\"0\")),m=Math.floor(parseFloat(y.getAttribute(\"y\")||\"0\"));const M=y.getBoundingClientRect(),S=getComputedStyle(y).textAnchor;this.options.editingLineController.text.width=M.width,this.options.editingLineController.text.height=M.height,g=-M.height/2,S===\"start\"?d=0:S===\"end\"?d=-this.options.editingLineController.text.width:d=-this.options.editingLineController.text.width/2}else this.options.editingLineController.text.width=20,this.options.editingLineController.text.height=10,d=-this.options.editingLineController.text.width/2}this.options.editingLineController.text.width+=40,this.options.editingLineController.text.height+=10,this.options.editingLineController.text.x=c.x+d+f*_-20,this.options.editingLineController.text.y=c.y+g+m*_-10}getStartAndEndPoint(t){const o=t.match(/[a-zA-Z][^a-zA-Z]*/g);let n=0,i=0,a=0,l=0;const r={x:0,y:0},h={x:0,y:0};for(const c of o){const p=c.trim().split(/[ ,]+/),d=p[0].toUpperCase(),g=p[0]===p[0].toLowerCase();switch(d){case\"M\":n=this.getPointValue(a,p[1],g)+this.easyViewOffset.x,i=this.getPointValue(l,p[2],g)+this.easyViewOffset.y,a=n,l=i;break;case\"L\":n=this.getPointValue(a,p[1],g)+this.easyViewOffset.x,i=this.getPointValue(l,p[2],g)+this.easyViewOffset.y;break;case\"C\":this.getPointValue(a,p[1],g),this.getPointValue(l,p[2],g),this.getPointValue(a,p[3],g),this.getPointValue(l,p[4],g),n=this.getPointValue(a,p[5],g),i=this.getPointValue(l,p[6],g),a=n,l=i;break;case\"V\":i=this.getPointValue(l,p[1],g),l=i;break;case\"H\":n=this.getPointValue(a,p[1],g),a=n;break;case\"Z\":break;default:u(`Unsupported command: ${d}`)}c===o[0]&&(r.x=n,r.y=i),c===o[o.length-1]&&(h.x=n,h.y=i)}return{startPoint:r,endPoint:h}}startMoveLineVertex(t,o){o.stopPropagation();const n=this.options.editingLineController.link,i=this.options.editingLineController.line;let a=n.fromNode;this.setEditingLine(null,null),this.removeLine(n,i),t===\"start\"?(a=n.toNode,i.isReverse?a=n.fromNode:i.isReverse=!0):i.isReverse&&(a=n.toNode,i.isReverse=void 0),this.startCreatingLinePlot(o,{template:i,fromNode:a,onCreateLine:(l,r,h)=>{if(r.id){let c=l.id,p=r.id;h&&h.isReverse&&(c=r.id,p=l.id,h.isReverse=void 0);const d=Object.assign(h||{},{from:c,to:p});this.addLines([d])}}})}startCreateLineByTemplate(t,o,n){n.stopPropagation();const i=this.options.editingController.nodes[0],a=o||{lineShape:6,text:\"New Line\"};this.startCreatingLinePlot(n,{template:a,fromNode:i,onCreateLine:(l,r,h)=>{if(r.id){const c=Object.assign({},h,{from:l.id,to:r.id});this.addLines([c])}}})}onLineVertexBeDropped(t,o){o.stopPropagation();const n=this.options.nodeConnectController.node;this.options.newLinkTemplate.fromNode?(this.options.newLinkTemplate.toNodeObject=n,this.options.newLineTemplate.isReverse?this.options.newLineTemplate.fromJunctionPoint=t:this.options.newLineTemplate.toJunctionPoint=t,this.onCreateLine(this.options.newLinkTemplate.fromNode,this.options.nodeConnectController.node),this.stopCreatingLinePlot(),this.emitEvent($.onLineVertexDropped,{fromNode:n,toNode:n})):(this.options.newLineTemplate.isReverse?this.options.newLineTemplate.toJunctionPoint=t:this.options.newLineTemplate.fromJunctionPoint=t,this.options.newLinkTemplate.fromNode=n)}startMoveLineText(t){const o=this._getEventPoint(t),n=this.options.editingLineController.line,i=n.textOffset_x||0,a=n.textOffset_y||0,l=h=>{const c=this.options.canvasZoom/100,p=this._getEventPoint(h),d=p.x-o.x,g=p.y-o.y;n.textOffset_x=Math.round(i+d/c),n.textOffset_y=Math.round(a+g/c),this.updateEditingLineView(),this._dataUpdated()},r=h=>{this.$dom.removeEventListener(\"mousemove\",l),this.$dom.removeEventListener(\"mouseup\",r),this._dataUpdated()};this.$dom.addEventListener(\"mousemove\",l),this.$dom.addEventListener(\"mouseup\",r)}}class lo extends ro{constructor(t,o){super(t,o);v(this,\"$miniViewCanvas\");v(this,\"$mvCanvasCtx\");v(this,\"miniViewUpdating\",!1);v(this,\"miniViewUpdateHasNext\",!1);v(this,\"miniViewBox\",{visibleAreaStart:{x:0,y:0},visibleAreaEnd:{x:0,y:0},canvas_start_x:0,canvas_start_y:0,canvas_end_x:0,canvas_end_y:0,canvas_width:0,canvas_height:0,miniview_width:0,miniview_height:0});v(this,\"visibleArea\",{x:0,y:0});v(this,\"miniviewVisiableHandleMoveing\",!1)}setMiniViewCanvas(t){this.$miniViewCanvas=t,this.$mvCanvasCtx=this.$miniViewCanvas.getContext(\"2d\")}updateMiniView(){!this.options.showMiniView||requestAnimationFrame(this._updateMiniView.bind(this))}_updateMiniView(){try{this.miniViewUpdating=!0,this.mvDosomethingBeforeDraw(),this.mvDrawAllNodes(),this.mvDrawAllLines(),this.mvDrawMask()}catch(t){console.error(t)}this.miniViewUpdating=!1,this.miniViewUpdateHasNext&&(this.miniViewUpdateHasNext=!1,this._updateMiniView())}mvDosomethingBeforeDraw(){let t=9999999,o=9999999,n=-9999999,i=-9999999;for(const y of this.getNodes())x.isAllowShowNode(y)&&y.opacity&&y.opacity>0&&(y.x<t&&(t=y.x),y.y<o&&(o=y.y),y.x+y.el.offsetWidth>n&&(n=y.x+y.el.offsetWidth),y.y+y.el.offsetHeight>i&&(i=y.y+y.el.offsetHeight));const a=1,l=50,r=50;this.miniViewBox.canvas_start_x=t-l,this.miniViewBox.canvas_start_y=o-r,this.miniViewBox.canvas_end_x=n+l,this.miniViewBox.canvas_end_y=i+r,this.miniViewBox.canvas_width=this.miniViewBox.canvas_end_x-this.miniViewBox.canvas_start_x,this.miniViewBox.canvas_height=this.miniViewBox.canvas_end_y-this.miniViewBox.canvas_start_y;const h=this.$miniViewCanvas.parentElement.getBoundingClientRect(),c=h.width,p=h.height;let d=0,g=0,f=a;c/this.miniViewBox.canvas_width<p/this.miniViewBox.canvas_height?(f=c/this.miniViewBox.canvas_width*a,d=c,g=c/this.miniViewBox.canvas_width*this.miniViewBox.canvas_height):(f=p/this.miniViewBox.canvas_height*a,d=p/this.miniViewBox.canvas_height*this.miniViewBox.canvas_width,g=p),this.miniViewBox.miniview_width=c,this.miniViewBox.miniview_height=p,this.$miniViewCanvas.width=c,this.$miniViewCanvas.height=p,this.$mvCanvasCtx.canvas.width=c,this.$mvCanvasCtx.canvas.height=p;const m=(p-g)/2,_=(c-d)/2;if(this.miniViewBox.canvas_start_x-=_/f,this.miniViewBox.canvas_start_y-=m/f,u(\"updateMiniView\",_,m),this.$mvCanvasCtx.scale(f,f),!this.miniviewVisiableHandleMoveing){const y=this.getBoundingClientRect(),M=this.getCanvasCoordinateByClientCoordinate({x:0,y:0}),S=this.getCanvasCoordinateByClientCoordinate({x:y.width,y:y.height}),z=S.x-M.x,X=S.y-M.y;this.miniViewBox.visibleAreaStart=M,this.miniViewBox.visibleAreaEnd=S,this.options.miniViewVisibleHandle.width=f*z,this.options.miniViewVisibleHandle.height=f*X;const U=M.x-this.miniViewBox.canvas_start_x,D=M.y-this.miniViewBox.canvas_start_y;this.options.miniViewVisibleHandle.x=f*U,this.options.miniViewVisibleHandle.y=f*D,this.options.miniViewVisibleHandle.x+this.options.miniViewVisibleHandle.width<0||this.options.miniViewVisibleHandle.y+this.options.miniViewVisibleHandle.height<0||this.options.miniViewVisibleHandle.y>this.miniViewBox.miniview_height||this.options.miniViewVisibleHandle.x>this.miniViewBox.miniview_width?this.options.miniViewVisibleHandle.emptyContent=!0:this.options.miniViewVisibleHandle.emptyContent=!1}}mvDrawMask(){}mvDrawAllNodes(){for(const t of this.getNodes())x.isAllowShowNode(t)&&t.opacity&&t.opacity>0&&this.mvDrawNode(t)}mvDrawNode(t){(t.nodeShape!==void 0&&t.nodeShape!==null?t.nodeShape:this.options.defaultNodeShape)===1?this.mvDrawNode4Rect(t):this.mvDrawNode4Circle(t)}mvDrawNode4Rect(t){const o=this.$mvCanvasCtx,n=t.el.offsetWidth-16,i=t.el.offsetHeight-16,a=t.x+8-this.miniViewBox.canvas_start_x,l=t.y+8-this.miniViewBox.canvas_start_y;o.beginPath(),o.globalAlpha=t.opacity||1,o.rect(a,l,n,i),o.fillStyle=this.getNodeColor(t),o.fill(),o.globalAlpha=1}mvDrawNode4Circle(t){const o=this.$mvCanvasCtx,n=t.el.offsetWidth-16,i=t.el.offsetHeight-16,a=t.x+n/2+8-this.miniViewBox.canvas_start_x,l=t.y+i/2+8-this.miniViewBox.canvas_start_y;o.beginPath(),o.globalAlpha=t.opacity||1,o.ellipse(a,l,n/2,i/2,0,0,2*Math.PI),o.fillStyle=this.getNodeColor(t),o.fill(),o.globalAlpha=1}mvDrawAllLines(){for(const t of this.getLinks())if(x.isAllowShowNode(t.fromNode)&&x.isAllowShowNode(t.toNode))for(let o=0;o<t.relations.length;o++)this.mvDrawLine(t,t.relations[o],o)}mvDrawLine(t,o,n){const i=this.$mvCanvasCtx,a=this.createLinePath(t,o,n);i.beginPath(),i.globalAlpha=o.opacity||1,this.mvDrawSvgPathOnCanvas(i,a.path),i.strokeStyle=o.color||this.options.defaultLineColor||\"red\",i.lineWidth=o.lineWidth||this.options.defaultLineWidth||1,i.stroke(),i.globalAlpha=1}mvDrawSvgPathOnCanvas(t,o){const n=o.match(/[a-zA-Z][^a-zA-Z]*/g);let i=0,a=0,l=0,r=0,h=0,c=0,p=0,d=0,g=!1;n.forEach(f=>{const m=f.trim().split(/[ ,]+/),_=m[0].toUpperCase(),y=m[0]===m[0].toLowerCase();switch(_){case\"M\":i=this.getPointValue(l,m[1],y)-this.miniViewBox.canvas_start_x,a=this.getPointValue(r,m[2],y)-this.miniViewBox.canvas_start_y,l=i,r=a,g&&(t.closePath(),g=!1),t.moveTo(i,a);break;case\"L\":i=this.getPointValue(l,m[1],y)-this.miniViewBox.canvas_start_x,a=this.getPointValue(r,m[2],y)-this.miniViewBox.canvas_start_y,t.lineTo(i,a);break;case\"C\":h=this.getPointValue(l,m[1],y),c=this.getPointValue(r,m[2],y),p=this.getPointValue(l,m[3],y),d=this.getPointValue(r,m[4],y),i=this.getPointValue(l,m[5],y),a=this.getPointValue(r,m[6],y),l=i,r=a,t.bezierCurveTo(h,c,p,d,i,a);break;case\"V\":a=this.getPointValue(r,m[1],y),r=a,t.lineTo(i,a);break;case\"H\":i=this.getPointValue(l,m[1],y),l=i,t.lineTo(i,a);break;case\"Z\":t.closePath(),g=!1;break;default:u(`Unsupported command: ${_}`)}})}onVisiableViewHandleDragStart(t){t.preventDefault(),t.stopPropagation();const o=this.options.miniViewVisibleHandle.x,n=this.options.miniViewVisibleHandle.y,i=this.options.canvasOffset.x,a=this.options.canvasOffset.y,l=this.miniViewBox.canvas_width,r=this.miniViewBox.canvas_height,h=(p,d,g,f,m)=>{const _=p/this.miniViewBox.miniview_width,y=d/this.miniViewBox.miniview_height,M=this.options.canvasZoom/100,S=l*_*M,z=r*y*M;this.setCanvasOffset(i-S,a-z),this.options.miniViewVisibleHandle.x=o+p,this.options.miniViewVisibleHandle.y=n+d,this.updateEditingControllerView(),this.dataUpdated()},c=(p,d,g)=>{this.miniviewVisiableHandleMoveing=!1,this.onCanvasDragEnd(g)};Q.startDrag(t,this.options.miniViewVisibleHandle,c,h)}resetByVisiableView(t){return C(this,null,function*(){!this.options.miniViewVisibleHandle.emptyContent||(yield this.setZoom(100),yield this.moveToCenter(),yield this.zoomToFit())})}}class Ht extends lo{constructor(s,t){super(s,t)}ready(){this.initLayouter(),this.resetViewSize(!0),this.refreshNVAnalysisInfo()}}const ho={props:{nodeProps:{type:Object,required:!0},expandButtonClass:{type:String,required:!0},expandOrCollapseNode:{type:Function,required:!0},expandHolderPosition:{type:String,required:!0},color:{type:String,required:!0}}};var co=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"c-btn-open-close\",class:[\"c-expand-positon-\"+e.expandHolderPosition]},[t(\"span\",{class:e.expandButtonClass,style:{\"background-color\":e.color},on:{click:function(o){return o.stopPropagation(),e.expandOrCollapseNode.apply(null,arguments)},touchend:function(o){return o.stopPropagation(),e.expandOrCollapseNode.apply(null,arguments)}}})])},uo=[];function G(e,s,t,o,n,i,a,l){var r=typeof e==\"function\"?e.options:e;s&&(r.render=s,r.staticRenderFns=t,r._compiled=!0),o&&(r.functional=!0),i&&(r._scopeId=\"data-v-\"+i);var h;if(a?(h=function(d){d=d||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,!d&&typeof __VUE_SSR_CONTEXT__!=\"undefined\"&&(d=__VUE_SSR_CONTEXT__),n&&n.call(this,d),d&&d._registeredComponents&&d._registeredComponents.add(a)},r._ssrRegister=h):n&&(h=l?function(){n.call(this,(r.functional?this.parent:this).$root.$options.shadowRoot)}:n),h)if(r.functional){r._injectStyles=h;var c=r.render;r.render=function(g,f){return h.call(f),c(g,f)}}else{var p=r.beforeCreate;r.beforeCreate=p?[].concat(p,h):[h]}return{exports:e,options:r}}const Wt={};var po=G(ho,co,uo,!1,fo,null,null,null);function fo(e){for(let s in Wt)this[s]=Wt[s]}const go={name:\"SeeksRGNode\",components:{RGNodeExpandHolder:function(){return po.exports}()},props:{nodeProps:{mustUseProp:!0,default:()=>({}),type:Object}},data(){return{expanding:!1}},inject:[\"graph\",\"graphInstance\"],computed:{oldVersionSlot(){const e=this.$scopedSlots.node({node:this.nodeProps});return e.length===0?null:e},expandButtonClass(){return this.nodeProps.expanded===!1?\"c-expanded\":\"c-collapsed\"},showExpandHolder(){if(this.nodeProps.expandHolderPosition&&this.nodeProps.expandHolderPosition!==\"hide\")return!0;if(this.nodeProps.lot.childs&&this.nodeProps.lot.childs.length>0){if(this.options.defaultExpandHolderPosition&&this.options.defaultExpandHolderPosition!==\"hide\")return!0}else return!1},options(){return this.graph.options},relationGraph(){return this.graphInstance()},borderColor(){return this.nodeProps.borderColor||this.options.defaultNodeBorderColor},borderWidth(){const e=this.nodeProps.borderWidth===void 0?this.options.defaultNodeBorderWidth:this.nodeProps.borderWidth;return e?e+\"px\":void 0},nodeWidth(){if(this.nodeProps.width===0)return;const e=this.nodeProps.width||this.options.defaultNodeWidth;if(!!e)return e+\"px\"},nodeHeight(){if(this.nodeProps.height===0)return;const e=this.nodeProps.height||this.options.defaultNodeHeight;if(!!e)return e+\"px\"}},created(){},mounted(){this.refreshNodeProperties(),this.relationGraph.addNodeResizeListener(this.$refs.seeksRGNode,this.nodeProps),u(\"RGNode:mounted\")},beforeDestroy(){this.relationGraph.removeNodeResizeListener(this.$refs.seeksRGNode)},methods:{refreshNodeProperties(){this.$refs.seeksRGNode.offsetWidth===0&&this.$refs.seeksRGNode.offsetHeight===0||(this.nodeProps.el.offsetWidth!==this.$refs.seeksRGNode.offsetWidth||this.nodeProps.el.offsetHeight!==this.$refs.seeksRGNode.offsetHeight)&&this.relationGraph.updateNodeOffsetSize(this.nodeProps,this.$refs.seeksRGNode.offsetWidth,this.$refs.seeksRGNode.offsetHeight)},expandOrCollapseNode(e){return C(this,null,function*(){u(\"expandOrCollapseNode\",this.expanding),!this.expanding&&(this.expanding=!0,setTimeout(()=>{this.expanding=!1},300),yield this.relationGraph.expandOrCollapseNode(this.nodeProps,e))})},onDragStart(e){this.relationGraph.onNodeDragStart(this.nodeProps,e)},onclick(e){this.relationGraph.onNodeClick(this.nodeProps,e)},isAllowShowNode(e){return x.isAllowShowNode(e)}}};var _o=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.isAllowShowNode(e.nodeProps),expression:\"isAllowShowNode(nodeProps)\"}],ref:\"seeksRGNode\",staticClass:\"rel-node-peel\",class:[e.nodeProps.selected&&\"rel-node-selected\",e.nodeProps.dragging&&\"rel-node-dragging\",e.nodeProps.id===e.options.checkedNodeId&&\"rel-node-peel-checked\",e.nodeProps.className],style:{left:e.nodeProps.x+\"px\",top:e.nodeProps.y+\"px\",\"z-index\":e.nodeProps.zIndex?e.nodeProps.zIndex:void 0,opacity:e.nodeProps.opacity>1?e.nodeProps.opacity/100:e.nodeProps.opacity},attrs:{\"data-id\":e.nodeProps.id}},[e.showExpandHolder?[e.options.oldVueVersion&&!e.options.ovUseNodeExpandHolderSlot?[t(\"RGNodeExpandHolder\",{attrs:{nodeProps:e.nodeProps,expandButtonClass:e.expandButtonClass,expandOrCollapseNode:e.expandOrCollapseNode,expandHolderPosition:e.nodeProps.expandHolderPosition||e.options.defaultExpandHolderPosition,color:e.options.defaultExpandHolderColor||e.nodeProps.color||e.options.defaultNodeColor}})]:e._t(\"node-expand-holder\",function(){return[t(\"RGNodeExpandHolder\",{attrs:{nodeProps:e.nodeProps,expandButtonClass:e.expandButtonClass,expandOrCollapseNode:e.expandOrCollapseNode,expandHolderPosition:e.nodeProps.expandHolderPosition||e.options.defaultExpandHolderPosition,color:e.options.defaultExpandHolderColor||e.nodeProps.color||e.options.defaultNodeColor}})]},{nodeProps:e.nodeProps,expandButtonClass:e.expandButtonClass,expandOrCollapseNode:e.expandOrCollapseNode,expandHolderPosition:e.nodeProps.expandHolderPosition||e.options.defaultExpandHolderPosition,color:e.options.defaultExpandHolderColor||e.nodeProps.color||e.options.defaultNodeColor})]:e._e(),e.nodeProps.html?t(\"div\",{domProps:{innerHTML:e._s(e.nodeProps.html)},on:{click:function(o){return e.onclick(o)},mousedown:function(o){return!o.type.indexOf(\"key\")&&e._k(o.keyCode,\"left\",37,o.key,[\"Left\",\"ArrowLeft\"])||\"button\"in o&&o.button!==0?null:(o.stopPropagation(),e.onDragStart(o))},touchstart:function(o){return o.stopPropagation(),e.onDragStart(o)}}}):t(\"div\",{staticClass:\"rel-node\",class:[\"rel-node-shape-\"+(e.nodeProps.nodeShape===void 0?e.options.defaultNodeShape:e.nodeProps.nodeShape),\"rel-node-type-\"+e.nodeProps.type,e.nodeProps.id===e.options.checkedNodeId?\"rel-node-checked\":\"\",e.nodeProps.flashing?\"rel-node-flashing\":\"\",e.nodeProps.styleClass,e.nodeProps.innerHTML?\"rel-diy-node\":\"\"],style:{\"background-color\":e.nodeProps.color===void 0?e.options.defaultNodeColor:e.nodeProps.color,color:e.nodeProps.fontColor===void 0?e.options.defaultNodeFontColor:e.nodeProps.fontColor,\"border-color\":e.borderColor,\"border-width\":e.borderWidth,width:e.nodeWidth,height:e.nodeHeight},on:{click:function(o){return e.onclick(o)},mousedown:function(o){return!o.type.indexOf(\"key\")&&e._k(o.keyCode,\"left\",37,o.key,[\"Left\",\"ArrowLeft\"])||\"button\"in o&&o.button!==0?null:(o.stopPropagation(),e.onDragStart(o))},touchstart:function(o){return o.stopPropagation(),e.onDragStart(o)}}},[e.options.hideNodeContentByZoom===!0&&e.options.canvasZoom<40?e._e():[e.options.oldVueVersion&&!e.options.ovUseNodeSlot?[e.nodeProps.innerHTML?t(\"div\",{domProps:{innerHTML:e._s(e.nodeProps.innerHTML)}}):t(\"div\",{staticClass:\"c-node-text\",style:{color:e.nodeProps.fontColor||e.options.defaultNodeFontColor}},[t(\"span\",{domProps:{innerHTML:e._s(e.nodeProps.text)}})])]:e._t(\"node\",function(){return[e.nodeProps.innerHTML?t(\"div\",{domProps:{innerHTML:e._s(e.nodeProps.innerHTML)}}):t(\"div\",{staticClass:\"c-node-text\",style:{color:e.nodeProps.fontColor||e.options.defaultNodeFontColor}},[t(\"span\",{domProps:{innerHTML:e._s(e.nodeProps.text)}})])]},{node:e.nodeProps})]],2)],2)},mo=[];const ta=\"\",Ft={};var yo=G(go,_o,mo,!1,vo,\"dbe880ec\",null,null);function vo(e){for(let s in Ft)this[s]=Ft[s]}const $t=function(){return yo.exports}(),xo={name:\"SeeksRGLine\",props:{link:{mustUseProp:!0,default:()=>({}),type:Object},relation:{mustUseProp:!0,default:()=>({}),type:Object},relationIndex:{mustUseProp:!0,default:()=>0,type:Number}},data(){return{is_flashing:!1}},inject:[\"graph\",\"graphInstance\"],computed:{checked(){return this.relation.id===this.options.checkedLineId},options(){return this.graph.options},lineWidth(){return this.relation.lineWidth?this.relation.lineWidth:this.options.defaultLineWidth},relationGraph(){return this.graphInstance()},showStartArrow(){return this.relationGraph.getArrow(this.relation,this.link,!0)},showEndArrow(){return this.relationGraph.getArrow(this.relation,this.link,!1)},pathData(){try{const{path:e,textPosition:s}=this.relationGraph.createLinePath(this.link,this.relation,this.relationIndex);let t={};try{t=this.relationGraph.getTextTransform(this.relation,s.x,s.y,s.rotate)}catch(o){u(o)}return{path:e,textTransform:t}}catch(e){u(e)}return{path:null,textTransform:null}},textStyle(){return this.relationGraph.getLineTextStyle(this.link,this.relation,this.relationIndex)}},watch:{},methods:{onClick(e,s){this.relationGraph.onLineClick(e,this.link,s)}}};var wo=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"g\",{class:[e.relation.className],attrs:{\"data-id\":e.relation.id}},[t(\"path\",{staticClass:\"c-rg-line-bg\",style:{pointerEvents:e.relation.disableDefaultClickEffect?\"none\":void 0,strokeWidth:(e.lineWidth<8?8:e.lineWidth)+\"px\"},attrs:{d:e.pathData.path},on:{touchstart:function(o){return e.onClick(e.relation,o)},click:function(o){return e.onClick(e.relation,o)}}}),t(\"path\",{staticClass:\"c-rg-line\",class:[e.relation.styleClass,e.relation.dashType?\"rg-line-dashtype-\"+e.relation.dashType:void 0,e.relation.animation?\"rg-line-anm-\"+e.relation.animation:void 0,e.checked?\"c-rg-line-checked\":void 0],style:{stroke:e.relation.color?e.relation.color:e.options.defaultLineColor,opacity:e.relation.opacity,\"pointer-events\":e.relation.disableDefaultClickEffect&&\"none\",\"stroke-width\":e.lineWidth+\"px\",fill:e.relation.lineShape===8?e.relation.color||e.options.defaultLineColor:\"none\"},attrs:{d:e.pathData.path,stroke:e.relation.color?e.relation.color:e.options.defaultLineColor,\"marker-start\":e.showStartArrow,\"marker-end\":e.showEndArrow},on:{touchstart:function(o){return e.onClick(e.relation,o)},click:function(o){return e.onClick(e.relation,o)}}}),e.textStyle&&e.options.defaultShowLineLabel&&e.options.canvasZoom>40?t(\"g\",{attrs:{transform:e.pathData.textTransform}},[t(\"text\",{key:\"t-\"+e.relation.seeks_id,staticClass:\"c-rg-line-text\",class:{\"c-rg-line-text-checked\":e.checked},style:{opacity:e.relation.opacity,fill:e.relation.fontColor?e.relation.fontColor:e.options.defaultLineFontColor?e.options.defaultLineFontColor:e.relation.color?e.relation.color:e.options.defaultLineColor,\"pointer-events\":e.relation.disableDefaultClickEffect&&\"none\"},attrs:{x:e.relation.textOffset_x||e.options.defaultLineTextOffset_x||0,y:e.relation.textOffset_y||e.options.defaultLineTextOffset_y||10,\"text-anchor\":e.textStyle.textAnchor},on:{touchstart:function(o){return e.onClick(e.relation,o)},click:function(o){return e.onClick(e.relation,o)}}},[e._v(\" \"+e._s(e.textStyle.text)+\" \")])]):e._e()])},Co=[];const ea=\"\",Ut={};var bo=G(xo,wo,Co,!1,Lo,\"28e1b060\",null,null);function Lo(e){for(let s in Ut)this[s]=Ut[s]}const jt=function(){return bo.exports}(),ko={name:\"SeeksRGLine\",props:{link:{mustUseProp:!0,default:()=>({}),type:Object},relation:{mustUseProp:!0,default:()=>({}),type:Object},relationIndex:{mustUseProp:!0,default:()=>0,type:Number}},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()},lineWidth(){return this.relation.lineWidth?this.relation.lineWidth:this.options.defaultLineWidth},lineColor(){return this.relation.color?this.relation.color:this.options.defaultLineColor},checked(){return this.relation.id===this.options.checkedLineId},textStyle(){return this.relationGraph.getLineTextStyle(this.link,this.relation,this.relationIndex)},pathRef(){return\"#\"+this.options.instanceId+\"-\"+this.relation.id}},data(){return{is_flashing:!1}},watch:{},mounted(){},methods:{onClick(e,s){this.relationGraph.onLineClick(e,this.link,s)}}};var Mo=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"g\",{class:[e.relation.className],attrs:{\"data-id\":e.relation.id}},[t(\"use\",{staticClass:\"c-rg-line-bg\",style:{pointerEvents:e.relation.disableDefaultClickEffect?\"none\":void 0,strokeWidth:(e.lineWidth<8?8:e.lineWidth)+\"px\"},attrs:{\"xlink:href\":e.pathRef},on:{touchstart:function(o){return e.onClick(e.relation,o)},click:function(o){return e.onClick(e.relation,o)}}}),t(\"use\",{staticClass:\"c-rg-line\",class:[e.relation.styleClass,e.relation.dashType?\"rg-line-dashtype-\"+e.relation.dashType:void 0,e.relation.animation?\"rg-line-anm-\"+e.relation.animation:void 0,e.checked?\"c-rg-line-checked\":void 0],style:{stroke:e.lineColor,opacity:e.relation.opacity,strokeWidth:e.lineWidth+\"px\",pointerEvents:e.relation.disableDefaultClickEffect?\"none\":void 0,fill:e.relation.lineShape===8?e.relation.color||e.options.defaultLineColor:\"none\"},attrs:{\"xlink:href\":e.pathRef},on:{touchstart:function(o){return e.onClick(e.relation,o)},click:function(o){return e.onClick(e.relation,o)}}}),e.textStyle&&e.options.defaultShowLineLabel&&e.options.canvasZoom>40?t(\"g\",{attrs:{transform:e.textStyle.textOffset}},[t(\"text\",{staticClass:\"c-rg-line-text\",class:{\"c-rg-line-text-checked\":e.checked},style:{opacity:e.relation.opacity,fill:e.relation.fontColor?e.relation.fontColor:e.options.defaultLineFontColor?e.options.defaultLineFontColor:e.relation.color?e.relation.color:e.options.defaultLineColor,pointerEvents:e.relation.disableDefaultClickEffect?\"none\":void 0},attrs:{rotate:e.textStyle.textRotate},on:{touchstart:function(o){return e.onClick(e.relation,o)},click:function(o){return e.onClick(e.relation,o)}}},[t(\"textPath\",{attrs:{\"xlink:href\":e.pathRef,startOffset:e.textStyle.textHPosition,\"text-anchor\":e.textStyle.textAnchor,method:\"align\",spacing:\"auto\"}},[e._v(\" \"+e._s(e.textStyle.text)+\" \")])])]):e._e()])},So=[];const oa=\"\",Xt={};var Eo=G(ko,Mo,So,!1,Po,\"6d84498c\",null,null);function Po(e){for(let s in Xt)this[s]=Xt[s]}const zo={name:\"SeeksRGLink\",components:{RGLineSmart:jt,RGLineTextByPath:function(){return Eo.exports}()},props:{linkProps:{mustUseProp:!0,default:()=>({}),type:Object}},data(){return{is_flashing:!1}},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},show(){this.isShow=!0},watch:{},mounted(){},methods:{isAllowShowNode(e){return x.isAllowShowNode(e)}}};var $o=function(){var e=this,s=e.$createElement,t=e._self._c||s;return e.isAllowShowNode(e.linkProps.fromNode)&&e.isAllowShowNode(e.linkProps.toNode)?t(\"g\",{ref:\"seeksRGLink\",staticClass:\"rel-link-peel\",class:[e.options.checkedLinkId==e.linkProps.seeks_id?\"c-rg-link-checked\":\"\"],attrs:{transform:\"translate(0,0)\",\"data-id\":e.linkProps.seeks_id}},[e._l(e.linkProps.relations,function(o,n){return[e.options.oldVueVersion&&!e.options.ovUseLineSlot?[(o.useTextPath!==void 0?o.useTextPath:e.options.lineUseTextPath)&&o.isHide!==!0?t(\"RGLineTextByPath\",{key:\"l-\"+o.id,attrs:{link:e.linkProps,relation:o,\"relation-index\":n}}):o.isHide===!1?t(\"RGLineSmart\",{key:\"l-\"+o.id,attrs:{link:e.linkProps,relation:o,\"relation-index\":n}}):e._e()]:e._t(\"line\",function(){return[(o.useTextPath!==void 0?o.useTextPath:e.options.lineUseTextPath)&&o.isHide!==!0?t(\"RGLineTextByPath\",{key:\"l-\"+o.id,attrs:{link:e.linkProps,relation:o,\"relation-index\":n}}):o.isHide===!1?t(\"RGLineSmart\",{key:\"l-\"+o.id,attrs:{link:e.linkProps,relation:o,\"relation-index\":n}}):e._e()]},{line:o,relationIndex:n})]})],2):e._e()},Oo=[];const ia=\"\",Yt={};var Ro=G(zo,$o,Oo,!1,Do,\"1a9e8306\",null,null);function Do(e){for(let s in Yt)this[s]=Yt[s]}const Zt=function(){return Ro.exports}(),Vo={name:\"SeeksRGLink\",props:{link:{mustUseProp:!0,default:()=>({}),type:Object},relation:{mustUseProp:!0,default:()=>({}),type:Object},relationIndex:{mustUseProp:!0,default:()=>0,type:Number}},inject:[\"graph\",\"graphInstance\"],computed:{checked(){return this.relation.id===this.options.checkedLineId},pathData(){const{path:e,textPosition:s}=this.relationGraph.createLinePath(this.link,this.relation,this.relationIndex);return e},options(){return this.graph.options},relationGraph(){return this.graphInstance()},style(){const e=this.relation.lineWidth!==void 0?this.relation.lineWidth:this.options.defaultLineWidth||1,s=this.relation.color?this.relation.color:this.options.defaultLineColor;return this.options.snapshotting?{stroke:s,opacity:this.relation.opacity,strokeWidth:e+\"px\",pointerEvents:this.relation.disableDefaultClickEffect?\"none\":void 0,fill:this.relation.lineShape===8?s:\"none\"}:{}}},data(){return{is_flashing:!1}},show(){this.isShow=!0},methods:{}};var No=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"path\",{class:[\"c-rg-line-path\",e.relation.styleClass,e.checked?\"c-rg-line-checked\":\"\"],style:e.style,attrs:{id:e.options.instanceId+\"-\"+e.relation.id,d:e.pathData,\"marker-start\":e.relationGraph.getArrow(e.relation,e.link,!0),\"marker-end\":e.relationGraph.getArrow(e.relation,e.link,!1)}})},Go=[];const Jt={};var Bo=G(Vo,No,Go,!1,To,null,null,null);function To(e){for(let s in Jt)this[s]=Jt[s]}const Ot=function(){return Bo.exports}(),Ao={name:\"RGCheckedLine\",inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()},pathData(){return this.relationGraph.createCheckedLinePath()},strokeWidth(){return this.relationGraph.createCheckedLineStrokeWidth()}},data(){return{is_flashing:!1}},show(){this.isShow=!0},watch:{}};var Io=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"g\",[e.pathData?t(\"path\",{staticClass:\"c-rg-line-checked-bg\",attrs:{d:e.pathData,fill:\"none\",stroke:\"red\",\"stroke-width\":e.strokeWidth}}):e._e()])},Ho=[];const sa=\"\",qt={};var Wo=G(Ao,Io,Ho,!1,Fo,\"3b2b9464\",null,null);function Fo(e){for(let s in qt)this[s]=qt[s]}const Uo=function(){return Wo.exports}(),jo={name:\"RGGraphDefs\",components:{SeeksRGLinePath:Ot},data(){return{}},inject:[\"graphData\",\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()},allLineColors(){return this.graph.allLineColors}}};var Xo=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"defs\",[t(\"linearGradient\",{attrs:{id:\"my-lineStyle\",gradientUnits:\"objectBoundingBox\",cx:\"0.5\",cy:\"0.5\"}},[t(\"stop\",{attrs:{offset:\"0%\",\"stop-color\":\"#e52c5c\",\"stop-opacity\":\"1\"}}),t(\"stop\",{attrs:{offset:\"100%\",\"stop-color\":\"#FD8B37\",\"stop-opacity\":\"0\"}})],1),t(\"marker\",{attrs:{id:e.options.instanceId+\"-arrow-default\",markerWidth:e.options.defaultLineMarker.markerWidth,markerHeight:e.options.defaultLineMarker.markerHeight,refX:e.options.defaultLineMarker.refX,refY:e.options.defaultLineMarker.refY,markerUnits:\"userSpaceOnUse\",orient:\"auto\",viewBox:\"0 0 12 12\"}},[t(\"path\",{style:{fill:e.options.defaultLineColor},attrs:{d:e.options.defaultLineMarker.data}})]),t(\"marker\",{attrs:{id:e.options.instanceId+\"-start-arrow-default\",markerWidth:e.options.defaultLineMarker.markerWidth,markerHeight:e.options.defaultLineMarker.markerHeight,refX:e.options.defaultLineMarker.refX,refY:e.options.defaultLineMarker.refY,markerUnits:\"userSpaceOnUse\",orient:\"auto\",viewBox:\"0 0 12 12\"}},[t(\"path\",{style:{fill:e.options.defaultLineColor},attrs:{d:e.options.defaultLineMarker.data,transform:\"translate(12,12)rotate(180)\"}})]),t(\"marker\",{attrs:{id:e.options.instanceId+\"-arrow-checked\",markerWidth:e.options.defaultLineMarker.markerWidth,markerHeight:e.options.defaultLineMarker.markerHeight,refX:e.options.defaultLineMarker.refX,refY:e.options.defaultLineMarker.refY,markerUnits:\"userSpaceOnUse\",orient:\"auto\",viewBox:\"0 0 12 12\"}},[t(\"path\",{style:{fill:e.options.checkedLineColor},attrs:{d:e.options.defaultLineMarker.data}})]),t(\"marker\",{attrs:{id:e.options.instanceId+\"-start-arrow-checked\",markerWidth:e.options.defaultLineMarker.markerWidth,markerHeight:e.options.defaultLineMarker.markerHeight,refX:e.options.defaultLineMarker.refX,refY:e.options.defaultLineMarker.refY,markerUnits:\"userSpaceOnUse\",orient:\"auto\",viewBox:\"0 0 12 12\"}},[t(\"path\",{style:{fill:e.options.checkedLineColor},attrs:{d:e.options.defaultLineMarker.data,transform:\"translate(12,12)rotate(180)\"}})]),e._l(e.allLineColors,function(o){return t(\"marker\",{key:o.id,attrs:{id:e.options.instanceId+\"-arrow-\"+o.id,markerWidth:e.options.defaultLineMarker.markerWidth,markerHeight:e.options.defaultLineMarker.markerHeight,refX:e.options.defaultLineMarker.refX,refY:e.options.defaultLineMarker.refY,markerUnits:\"userSpaceOnUse\",orient:\"auto\",viewBox:\"0 0 12 12\"}},[t(\"path\",{attrs:{fill:e.options.defaultLineMarker.color||o.color,d:e.options.defaultLineMarker.data}})])}),e._l(e.allLineColors,function(o){return t(\"marker\",{key:\"start-\"+o.id,attrs:{id:e.options.instanceId+\"-start-arrow-\"+o.id,markerWidth:e.options.defaultLineMarker.markerWidth,markerHeight:e.options.defaultLineMarker.markerHeight,refX:e.options.defaultLineMarker.refX,refY:e.options.defaultLineMarker.refY,markerUnits:\"userSpaceOnUse\",orient:\"auto\",viewBox:\"0 0 12 12\"}},[t(\"path\",{attrs:{fill:e.options.defaultLineMarker.color||o.color,d:e.options.defaultLineMarker.data,transform:\"translate(12,12)rotate(180)\"}})])}),e._l(e.graphData.links,function(o){return!e.options.showEasyView&&!o.invisiable?[e._l(o.relations,function(n,i){return[e.options.lineUseTextPath||n.useTextPath?t(\"SeeksRGLinePath\",{key:n.id,attrs:{link:o,relation:n,\"relation-index\":i}}):e._e()]})]:e._e()})],2)},Yo=[];const Kt={};var Zo=G(jo,Xo,Yo,!1,Jo,null,null,null);function Jo(e){for(let s in Kt)this[s]=Kt[s]}const qo={name:\"RelationGraphSingleGraph\",components:{RGGraphDefs:function(){return Zo.exports}(),RGLineChecked:Uo,SeeksRGNode:$t,SeeksRGLink:Zt,SeeksRGLinePath:Ot,RGLineSmart:jt},data(){return{}},inject:[\"graphData\",\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()},allLineColors(){return this.graph.allLineColors}},created(){u(\"[RGGraph created]\")},mounted(){u(\"[RGGraph mounted]\"),this.init()},beforeDestroy(){},methods:{init(){this.$refs.rgCanvas.style.setProperty(\"--stroke\",`url('#${this.options.instanceId}-lineStyle')`),this.$refs.rgCanvas.style.setProperty(\"--markerEnd\",`url('#${this.options.instanceId}-start-arrow-default')`),this.$refs.rgCanvas.style.setProperty(\"--markerStart\",`url('#${this.options.instanceId}-arrow-default')`),this.$refs.rgCanvas.style.setProperty(\"--markerEndChecked\",`url('#${this.options.instanceId}-arrow-checked')`),this.$refs.rgCanvas.style.setProperty(\"--markerStartChecked\",`url('#${this.options.instanceId}-start-arrow-checked')`)}}};var Ko=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-single-graph\",staticStyle:{overflow:\"visible\"}},[t(\"div\",{ref:\"rgCanvas\",staticClass:\"rel-linediv\"},[t(\"svg\",{staticClass:\"rel-lines-svg\",style:{width:e.options.canvasSize.width+\"px\",height:e.options.canvasSize.height+\"px\"},attrs:{xmlns:\"http://www.w3.org/2000/svg\"}},[t(\"RGGraphDefs\"),e.options.showEasyView?e._e():t(\"RGLineChecked\"),e._l(e.graphData.links,function(o){return!e.options.showEasyView&&!o.invisiable?t(\"SeeksRGLink\",{key:o.seeks_id,attrs:{\"link-props\":o},scopedSlots:e._u([{key:\"line\",fn:function(n){var i=n.line,a=n.lineIndex;return[e._t(\"line\",null,{line:i,link:o,lineIndex:a})]}}],null,!0)}):e._e()})],2)]),t(\"div\",{staticClass:\"rel-nodediv rel-nodediv-for-webkit\"},e._l(e.graphData.nodes,function(o){return!e.options.showEasyView&&!o.invisiable?t(\"SeeksRGNode\",{key:o.seeks_id,attrs:{\"node-props\":o},scopedSlots:e._u([{key:\"node\",fn:function(n){var i=n.node;return[e._t(\"node\",null,{node:i})]}},{key:\"node-expand-holder\",fn:function(n){var i=n.nodeProps,a=n.expandHolderPosition,l=n.expandButtonClass,r=n.color,h=n.expandOrCollapseNode;return[e._t(\"node-expand-holder\",null,{nodeProps:i,expandHolderPosition:a,expandButtonClass:l,color:r,expandOrCollapseNode:h})]}}],null,!0)}):e._e()}),1),t(\"div\",{staticClass:\"rel-linediv rel-linediv-el-lines\"},[t(\"svg\",{staticClass:\"rel-lines-svg rel-lines-svg-el-lines\",attrs:{xmlns:\"http://www.w3.org/2000/svg\"}},[e.options.snapshotting?t(\"RGGraphDefs\"):e._e(),e._l(e.graphData.elementLines,function(o){return[e._l(o.relations,function(n,i){return[e._t(\"line\",function(){return[(n.useTextPath!==void 0?n.useTextPath:e.options.lineUseTextPath)&&n.isHide!==!0?t(\"RGLineTextByPath\",{key:\"l-\"+n.id,attrs:{link:o,relation:n,\"relation-index\":i}}):n.isHide!==!0?t(\"RGLineSmart\",{key:\"l-\"+n.id,attrs:{link:o,relation:n,\"relation-index\":i}}):e._e()]},{line:n,relationIndex:i})]})]}),e.options.creatingLinePlot&&e.options.newLinkTemplate.fromNode?t(\"RGLineSmart\",{key:\"s-line-template\",attrs:{link:e.options.newLinkTemplate,relation:e.options.newLineTemplate,\"relation-index\":0}}):e._e()],2)])])},Qo=[];const Qt={};var tn=G(qo,Ko,Qo,!1,en,null,null,null);function en(e){for(let s in Qt)this[s]=Qt[s]}const on=function(){return tn.exports}(),nn={name:\"RGEasyView\",components:{},data(){return{}},inject:[\"graphData\",\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()},allLineColors(){return this.graph.allLineColors}},created(){u(\"[RGEasyView created]\")},mounted(){u(\"[RGEasyView mounted]\"),this.relationGraph.setEasyViewCanvas&&this.relationGraph.setEasyViewCanvas(this.$refs.rgEasyCanvas),this.init()},beforeDestroy(){},methods:{init(){}}};var sn=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-easy-view\",class:{\"rel-easy-view-active\":e.options.showEasyView}},[t(\"canvas\",{ref:\"rgEasyCanvas\",staticStyle:{width:\"100%\",height:\"100%\"}})])},an=[];const te={};var rn=G(nn,sn,an,!1,ln,null,null,null);function ln(e){for(let s in te)this[s]=te[s]}const hn={name:\"RelationGraphCanvas\",components:{RGEasyView:function(){return rn.exports}(),RelationGraphSingleGraph:on,SeeksRGNode:$t,SeeksRGLink:Zt,SeeksRGLinePath:Ot},data(){return{}},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()},canvasSizeAndPosition(){return{width:`${this.options.canvasSize.width}px`,height:`${this.options.canvasSize.height}px`,\"margin-left\":`${this.options.canvasOffset.x}px`,\"margin-top\":`${this.options.canvasOffset.y}px`,\"background-color\":\"transparent\",transform:`scale(${this.options.canvasZoom/100},${this.options.canvasZoom/100})`}}},watch:{},created(){u(\"[RGCanvas created]\")},mounted(){u(\"[RGCanvas mounted]\"),this.relationGraph.setCanvasDom(this.$refs.seeksRGCanvas)},beforeDestroy(){},methods:{mouseListener(e){this.relationGraph.onMouseWheel(e)},onDragStart(e){this.relationGraph.onCanvasDragStart(e)},contextmenu(e){this.relationGraph.onContextmenu(e)}}};var cn=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-map\",class:[e.options.canvasOpacity===1&&\"rel-map-ready\",e.options.layoutClassName,e.options.backgroundImageNoRepeat?\"rel-map-background-norepeat\":void 0],style:{width:\"100%\",height:\"100%\",\"background-color\":e.options.backgroundColor||void 0,\"background-image\":e.options.backgroundImage?\"url(\"+e.options.backgroundImage+\")\":void 0},on:{contextmenu:function(o){return o.preventDefault(),e.contextmenu(o)},mousedown:function(o){return!o.type.indexOf(\"key\")&&e._k(o.keyCode,\"left\",37,o.key,[\"Left\",\"ArrowLeft\"])||\"button\"in o&&o.button!==0?null:e.onDragStart(o)},touchstart:function(o){return e.onDragStart(o)},wheel:e.mouseListener}},[t(\"RGEasyView\"),t(\"div\",{ref:\"seeksRGCanvas\",staticClass:\"rel-map-canvas\",style:e.canvasSizeAndPosition},[t(\"div\",{staticClass:\"rel-canvas-slot rel-canvas-slot-behind\"},[e._t(\"canvas-plug\")],2),t(\"RelationGraphSingleGraph\",{scopedSlots:e._u([{key:\"node\",fn:function(o){var n=o.node;return[e._t(\"node\",null,{node:n})]}},{key:\"line\",fn:function(o){var n=o.line,i=o.link;return[e._t(\"line\",null,{line:n,link:i})]}},{key:\"node-expand-holder\",fn:function(o){var n=o.nodeProps,i=o.expandHolderPosition,a=o.expandButtonClass,l=o.color,r=o.expandOrCollapseNode;return[e._t(\"node-expand-holder\",null,{nodeProps:n,expandHolderPosition:i,expandButtonClass:a,color:l,expandOrCollapseNode:r})]}}],null,!0)}),t(\"div\",{staticClass:\"rel-canvas-slot rel-canvas-slot-above\"},[e._t(\"canvas-plug-above\")],2)],1)],1)},dn=[];const ee={};var un=G(hn,cn,dn,!1,pn,null,null,null);function pn(e){for(let s in ee)this[s]=ee[s]}const fn=function(){return un.exports}(),gn={name:\"GraphSettingPanel\",data(){return{search_text:\"\",showSettingPanel:!1,currentLayoutName:\"\"}},inject:[\"graph\",\"graphInstance\"],computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options}},methods:{toggleSettingPanel(){this.showSettingPanel=!this.showSettingPanel},printOptions(){this.relationGraph.printOptions()},printData(){this.relationGraph.printData()},enableDevlog(){this.relationGraph.enableDebugLog(!this.options.debug),u(\"debugLog:\",this.options.debug)}}};var _n=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",[t(\"div\",{staticClass:\"c-setting-panel-button\",class:[],on:{click:e.toggleSettingPanel}},[e._v(\" Debug \")]),e.showSettingPanel?t(\"div\",{staticClass:\"c-setting-panel\",class:[]},[t(\"div\",{staticClass:\"c-debug-tools-row\"},[t(\"button\",{on:{click:e.printOptions}},[e._v(\"print options in console\")])]),t(\"div\",{staticClass:\"c-debug-tools-row\"},[t(\"button\",{on:{click:e.printData}},[e._v(\"print json data in console\")])]),t(\"div\",{staticClass:\"c-debug-tools-row\"},[e._v(\"debug log status: \"+e._s(e.options.debug)),t(\"button\",{on:{click:e.enableDevlog}},[e._v(e._s(e.options.debug?\"disable\":\"enable\")+\" debug log\")])])]):e._e()])},mn=[];const oe={};var yn=G(gn,_n,mn,!1,vn,null,null,null);function vn(e){for(let s in oe)this[s]=oe[s]}const xn=function(){return yn.exports}(),wn={name:\"GraphMiniView\",data(){return{viewWidth:100,viewHeight:0,minX:0,maxX:0,minY:0,maxY:0,zoom:1}},inject:[\"graph\",\"graphData\",\"graphInstance\"],computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options}},mounted(){},methods:{miniViewHeight(){let e=9999,s=-9999,t=9999,o=-9999;for(let n=0;n<this.graphData.nodes.length;n++){const i=this.graphData.nodes[n];i.x<e&&(e=i.x),i.x>s&&(s=i.x),i.y<t&&(t=i.y),i.y>o&&(o=i.y)}return this.viewHeight=(o-t)*this.viewWidth/(s-e),this.minX=e,this.minY=t,this.maxX=s,this.maxY=o,this.viewHeight},getPositionData(){const e=this.viewWidth/this.options.canvasNVInfo.width,s=this.options.viewNVInfo.width*e,t=this.options.viewNVInfo.height*e;let o=(this.options.viewNVInfo.x-this.options.canvasNVInfo.x)*e*(this.options.canvasZoom/100),n=(this.options.viewNVInfo.y-this.options.canvasNVInfo.y)*e*(this.options.canvasZoom/100);return o=o*100/s,n=n*100/s,{width:s+\"px\",height:t+\"px\",left:o+\"px\",top:n+\"px\"}},isAllowShowNode(e){return x.isAllowShowNode(e)}}};var Cn=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{ref:\"miniView\",staticClass:\"c-mini-graph\"},[t(\"div\",{staticClass:\"c-mini-canvas\",style:{width:e.viewWidth+\"px\",height:e.miniViewHeight()+\"px\"}},[e._l(e.graphData.nodes,function(o){return[e.isAllowShowNode(o)?t(\"div\",{key:o.id,staticClass:\"c-mini-node\",style:{left:(o.x-e.minX)*e.viewWidth/(e.maxX-e.minX)+\"px\",top:(o.y-e.minY)*e.viewHeight/(e.maxY-e.minY)+\"px\"}}):e._e()]})],2)])},bn=[];const la=\"\",ne={};var Ln=G(wn,Cn,bn,!1,kn,\"46ea246f\",null,null);function kn(e){for(let s in ne)this[s]=ne[s]}const Mn=function(){return Ln.exports}(),Sn={name:\"GraphMiniToolBar\",data(){return{height:275,hits:0,downloadPanelWidth:106}},inject:[\"graph\",\"graphInstance\"],computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options}},mounted(){this.relationGraph.listeners.onDownloadExcel!==null&&(this.downloadPanelWidth+=50),this.options.layouts.length>1&&(this.height-=40)},methods:{refresh(){this.relationGraph.refresh()},switchLayout(e){u(\"change layout:\",e),this.relationGraph.switchLayout(e)},toggleAutoLayout(){this.relationGraph.toggleAutoLayout()},onDownloadExcel(){this.relationGraph.listeners.onDownloadExcel()},zoomToFit(){return C(this,null,function*(){yield this.relationGraph.setZoom(100),yield this.relationGraph.moveToCenter(),yield this.relationGraph.zoomToFit()})}}};var En=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"c-mini-toolbar\",style:{\"margin-left\":e.options.viewELSize.width-50+\"px\",\"margin-top\":(e.options.viewELSize.height-260)/2+\"px\"}},[t(\"div\",{staticClass:\"c-mb-button\",staticStyle:{\"margin-top\":\"0px\"},on:{click:function(o){return e.relationGraph.fullscreen()}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-resize-\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(e._s(e.options.fullscreen?\"\\u9000\\u51FA\":\"\\u5168\\u5C4F\"))])]),e.options.allowShowZoomMenu?t(\"div\",{staticClass:\"c-mb-button\",on:{click:function(o){return e.relationGraph.zoom(20)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-fangda\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u653E\\u5927\")])]):e._e(),e.options.allowShowZoomMenu?t(\"div\",{staticStyle:{float:\"left\",\"margin-top\":\"0px\",height:\"20px\",width:\"40px\",\"border-top\":\"0px\",\"border-bottom\":\"0px\",\"background-color\":\"#efefef\",color:\"#262626\",\"font-size\":\"10px\",\"text-align\":\"center\",\"line-height\":\"20px\"},on:{click:e.zoomToFit}},[e._v(e._s(e.options.canvasZoom)+\"%\")]):e._e(),e.options.allowShowZoomMenu?t(\"div\",{staticClass:\"c-mb-button\",staticStyle:{\"margin-top\":\"0px\"},on:{click:function(o){return e.relationGraph.zoom(-20)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-suoxiao\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u7F29\\u5C0F\")])]):e._e(),e.options.layouts.length>1?t(\"div\",{staticClass:\"c-mb-button\"},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-yuanquanfenxiang\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u5E03\\u5C40\")]),t(\"div\",{staticClass:\"c-mb-child-panel\",style:{width:e.options.layouts.length*70+6+\"px\",\"margin-left\":e.options.layouts.length*-70-5+\"px\"}},e._l(e.options.layouts,function(o){return t(\"div\",{key:o.label,staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.layoutLabel===o.label},staticStyle:{width:\"70px\"},on:{click:function(n){return e.switchLayout(o)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-yuanquanfenxiang\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(e._s(o.label))])])}),0)]):e._e(),e.options.allowSwitchLineShape?t(\"div\",{staticClass:\"c-mb-button\"},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-hj2\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u7EBF\\u6761\")]),t(\"div\",{staticClass:\"c-mb-child-panel\",staticStyle:{width:\"256px\",\"margin-left\":\"-255px\"}},[t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultLineShape===1},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultLineShape(1)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-hj2\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u76F4\\u7EBF\")])]),t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultLineShape===2},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultLineShape(2)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjieliu\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u7B80\\u6D01\")])]),t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultLineShape===6},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultLineShape(6)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjieliu\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u751F\\u52A8\")])]),t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultLineShape===5},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultLineShape(5)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjieliu\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u9C7C\\u5C3E\")])]),t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultLineShape===4},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultLineShape(4)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-hj2\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u6298\\u7EBF\")])])])]):e._e(),e.options.allowSwitchJunctionPoint?t(\"div\",{staticClass:\"c-mb-button\"},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjie_connecting5\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u8FDE\\u63A5\\u70B9\")]),t(\"div\",{staticClass:\"c-mb-child-panel\",staticStyle:{width:\"206px\",\"margin-left\":\"-205px\"}},[t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultJunctionPoint===\"border\"},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultJunctionPoint(\"border\")}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjie_connecting5\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u8FB9\\u7F18\")])]),t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultJunctionPoint===\"ltrb\"},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultJunctionPoint(\"ltrb\")}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjie_connecting5\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u56DB\\u70B9\")])]),t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultJunctionPoint===\"tb\"},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultJunctionPoint(\"tb\")}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjie_connecting5\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u4E0A\\u4E0B\")])]),t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",class:{\"c-mb-button-on\":e.options.defaultJunctionPoint===\"lr\"},staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.setDefaultJunctionPoint(\"lr\")}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjie_connecting5\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u5DE6\\u53F3\")])])])]):e._e(),e.options.allowAutoLayoutIfSupport&&e.options.isNeedShowAutoLayoutButton?t(\"div\",{staticClass:\"c-mb-button\",class:{\"c-mb-button-on\":e.options.autoLayouting},attrs:{title:e.options.autoLayouting?\"\\u70B9\\u51FB\\u505C\\u6B62\\u81EA\\u52A8\\u5E03\\u5C40\":\"\\u70B9\\u51FB\\u5F00\\u59CB\\u81EA\\u52A8\\u8C03\\u6574\\u5E03\\u5C40\"},on:{click:e.toggleAutoLayout}},[e.options.autoLayouting?t(\"svg\",{staticClass:\"c-loading-icon rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjiezhong\"}})]):t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-zidong\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u81EA\\u52A8\")])]):e._e(),e.options.allowShowRefreshButton?t(\"div\",{staticClass:\"c-mb-button\",on:{click:e.refresh}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-ico_reset\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u5237\\u65B0\")])]):e._e(),e.options.allowShowDownloadButton?t(\"div\",{staticClass:\"c-mb-button\"},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-ziyuan\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"\\u4E0B\\u8F7D\")]),t(\"div\",{staticClass:\"c-mb-child-panel\",style:{width:e.downloadPanelWidth+\"px\",\"margin-left\":e.downloadPanelWidth*-1+\"px\"}},[t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.downloadAsImage(\"png\")}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-tupian\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"PNG\")])]),t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",staticStyle:{width:\"50px\"},on:{click:function(o){return e.relationGraph.downloadAsImage(\"jpg\")}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-tupian\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"JPG\")])]),e.relationGraph.listeners.onDownloadExcel?t(\"div\",{staticClass:\"c-mb-button c-mb-button-c\",staticStyle:{width:\"50px\"},on:{click:function(o){return e.onDownloadExcel()}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-ziyuan\"}})]),t(\"span\",{staticClass:\"c-mb-text\"},[e._v(\"Excel\")])]):e._e()])]):e._e()])},Pn=[];const ha=\"\",ie={};var zn=G(Sn,En,Pn,!1,$n,\"412be0f2\",null,null);function $n(e){for(let s in ie)this[s]=ie[s]}const On=function(){return zn.exports}(),Rn={name:\"GraphMiniToolBar\",data(){return{}},inject:[\"graph\",\"graphInstance\"],computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options}},mounted(){},methods:{refresh(){this.relationGraph.refresh()},switchLayout(e){u(\"change layout:\",e),this.relationGraph.switchLayout(e)},toggleAutoLayout(){this.relationGraph.toggleAutoLayout()},downloadAsImage(){this.relationGraph.downloadAsImage(\"png\")},zoomToFit(){return C(this,null,function*(){yield this.relationGraph.setZoom(100),yield this.relationGraph.moveToCenter(),yield this.relationGraph.zoomToFit()})}}};var Dn=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-toolbar\",class:[\"rel-toolbar-h-\"+e.options.toolBarPositionH,\"rel-toolbar-v-\"+e.options.toolBarPositionV,\"rel-toolbar-\"+e.options.toolBarDirection]},[e.options.allowShowFullscreenMenu?t(\"div\",{staticClass:\"c-mb-button\",staticStyle:{\"margin-top\":\"0px\"},attrs:{title:\"\\u5168\\u5C4F/\\u9000\\u51FA\\u5168\\u5C4F\"},on:{click:function(o){return e.relationGraph.fullscreen()}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-resize-\"}})])]):e._e(),e.options.allowShowZoomMenu?t(\"div\",{staticClass:\"c-mb-button\",attrs:{title:\"\\u653E\\u5927\"},on:{click:function(o){return e.relationGraph.zoom(20)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-fangda\"}})])]):e._e(),e.options.allowShowZoomMenu?t(\"div\",{staticClass:\"c-current-zoom\",on:{dblclick:e.zoomToFit}},[e._v(e._s(e.options.canvasZoom)+\"%\")]):e._e(),e.options.allowShowZoomMenu?t(\"div\",{staticClass:\"c-mb-button\",staticStyle:{\"margin-top\":\"0px\"},attrs:{title:\"\\u7F29\\u5C0F\"},on:{click:function(o){return e.relationGraph.zoom(-20)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-suoxiao\"}})])]):e._e(),e.options.allowAutoLayoutIfSupport&&e.options.isNeedShowAutoLayoutButton?t(\"div\",{staticClass:\"c-mb-button\",class:{\"c-mb-button-on\":e.options.autoLayouting},attrs:{title:e.options.autoLayouting?\"\\u70B9\\u51FB\\u505C\\u6B62\\u81EA\\u52A8\\u5E03\\u5C40\":\"\\u70B9\\u51FB\\u5F00\\u59CB\\u81EA\\u52A8\\u8C03\\u6574\\u5E03\\u5C40\"},on:{click:e.toggleAutoLayout}},[e.options.autoLayouting?t(\"svg\",{staticClass:\"c-loading-icon rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjiezhong\"}})]):t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-zidong\"}})])]):e._e(),e.options.allowShowRefreshButton?t(\"div\",{staticClass:\"c-mb-button\",attrs:{title:\"\\u5237\\u65B0\"},on:{click:e.refresh}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-ico_reset\"}})])]):e._e(),e.options.allowShowDownloadButton?t(\"div\",{staticClass:\"c-mb-button\",attrs:{title:\"\\u4E0B\\u8F7D\\u56FE\\u7247\"},on:{click:e.downloadAsImage}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-tupian\"}})])]):e._e(),e._t(\"default\"),t(\"div\",{staticStyle:{clear:\"both\"}})],2)},Vn=[];const ca=\"\",se={};var Nn=G(Rn,Dn,Vn,!1,Gn,null,null,null);function Gn(e){for(let s in se)this[s]=se[s]}const ae=function(){return Nn.exports}(),Bn={name:\"GraphOperateStuff\",components:{SeeksRGNode:$t},inject:[\"graph\",\"graphInstance\"],computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options}},mounted(){},methods:{}};var Tn=function(){var e=this,s=e.$createElement,t=e._self._c||s;return e.options&&(e.options.creatingNodePlot||e.options.creatingSelection)?t(\"div\",{staticClass:\"rel-operate\"},[t(\"div\",{staticStyle:{position:\"relative\"}},[e.options.creatingNodePlot&&e.options.showTemplateNode?t(\"SeeksRGNode\",{attrs:{\"node-props\":e.options.newNodeTemplate},scopedSlots:e._u([{key:\"node\",fn:function(){return[e._t(\"node-template\",null,{node:e.options.newNodeTemplate})]},proxy:!0}],null,!0)}):e._e(),e.options.creatingSelection?t(\"div\",{staticClass:\"rel-selection\",style:{left:e.options.selectionView.x+\"px\",top:e.options.selectionView.y+\"px\",width:e.options.selectionView.width+\"px\",height:e.options.selectionView.height+\"px\"}}):e._e()],1)]):e._e()},An=[];const da=\"\",re={};var In=G(Bn,Tn,An,!1,Hn,\"42bdf56a\",null,null);function Hn(e){for(let s in re)this[s]=re[s]}const Wn=function(){return In.exports}(),le=e=>({onNodeClick:e.onNodeClick,onNodeExpand:e.onNodeExpand,onNodeDragging:e.onNodeDragging,onNodeDragStart:e.onNodeDragStart,onNodeDragEnd:e.onNodeDragEnd,onNodeCollapse:e.onNodeCollapse,onLineClick:e.onLineClick,onImageDownload:e.onImageDownload,onCanvasDragEnd:e.onCanvasDragEnd,beforeChangeLayout:e.beforeChangeLayout,onContextmenu:e.onContextmenu,onFullscreen:e.onFullscreen,onCanvasClick:e.onCanvasClick,onCanvasSelectionEnd:e.onCanvasSelectionEnd,onImageSaveAsFile:e.onImageSaveAsFile,onZoomEnd:e.onZoomEnd}),Fn={name:\"GraphLoading\",data(){return{}},inject:[\"graph\",\"graphInstance\"],computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options}},methods:{clickGraphMask(e){this.relationGraph.clickGraphMask(e)}}};var Un=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-graph-loading\",class:{\"rel-graph-loading-hide\":!e.options.graphLoading},on:{click:e.clickGraphMask}},[e.options.graphLoadingText?t(\"div\",{staticClass:\"rel-graph-loading-message\"},[t(\"svg\",{staticClass:\"c-graph-loading-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjiezhong\"}})]),e._v(\" \"+e._s(e.options.graphLoadingText||\"Loading...\")+\" \")]):e._e()])},jn=[];const he={};var Xn=G(Fn,Un,jn,!1,Yn,null,null,null);function Yn(e){for(let s in he)this[s]=he[s]}const Zn={name:\"SeeksRelationGraph\",components:{GraphLoading:function(){return Xn.exports}(),GraphOperateStuff:Wn,GraphMiniToolBar:On,GraphToolBar:ae,GraphMiniView:Mn,RGCanvas:fn,GraphDebugPanel:xn},props:{options:{mustUseProp:!1,default:()=>({}),type:Object},relationGraphCore:{mustUseProp:!1,default:null,type:Function},onNodeClick:{mustUseProp:!1,default:()=>()=>{},type:Function},onNodeExpand:{mustUseProp:!1,default:()=>()=>{},type:Function},onNodeCollapse:{mustUseProp:!1,default:()=>()=>{},type:Function},onLineClick:{mustUseProp:!1,default:()=>()=>{},type:Function},onNodeDragStart:{mustUseProp:!1,default:()=>()=>{},type:Function},onNodeDragEnd:{mustUseProp:!1,default:()=>()=>{},type:Function},onNodeDragging:{mustUseProp:!1,default:()=>()=>{},type:Function},onCanvasDragEnd:{mustUseProp:!1,default:()=>()=>{},type:Function},beforeChangeLayout:{mustUseProp:!1,default:()=>()=>{},type:Function},onContextmenu:{mustUseProp:!1,default:()=>()=>{},type:Function},onFullscreen:{mustUseProp:!1,default:null,type:Function},onCanvasClick:{mustUseProp:!1,default:()=>()=>{},type:Function},onDownloadExcel:{mustUseProp:!1,default:null,type:Function},onImageDownload:{mustUseProp:!1,default:null,type:Function},onImageSaveAsFile:{mustUseProp:!1,default:null,type:Function},onCanvasSelectionEnd:{mustUseProp:!1,default:null,type:Function},onZoomEnd:{mustUseProp:!1,default:null,type:Function}},data(){return{graphInstanceOK:!1,graphData:{rootNode:null,nodes:[],links:[],elementLines:[]},graph:{options:Ct({}),allLineColors:[]},oldVueVersion:!1}},provide(){return{graphData:this.graphData,graph:this.graph,graphInstance:this.getInstance}},created(){window&&(window.relationGraphDebug=this.options.debug),u(\"---------------------------graph created---------------------------\",this),Be(\"Vue2\");let e=!1;if(!ot.default||!ot.default.version||ot.default.version.startsWith(\"3\")){console.error(\"\\u5982\\u679C\\u60A8\\u4F7F\\u7528\\u7684\\u662Fvue3\\u6216react\\uFF0C\\u4F60\\u9700\\u8981\\u6CE8\\u610Fimport\\u65F6\\u4F7F\\u7528\\u7684\\u540D\\u79F0\\uFF1A\"),console.error(\"vue2:import RelationGraph from 'relation-graph'\"),console.error(\"vue3:import RelationGraph from 'relation-graph/vue3'\"),console.error(\"react:import RelationGraph from 'relation-graph/react'\");return}ot.default.version.slice(0,4)===\"2.5.\"&&(e=!0),ot.default.version.slice(0,4)===\"2.6.\"&&Number.parseInt(ot.default.version.split(\".\")[2])<=12&&(e=!0),e&&(this.oldVueVersion=!0,console.error(`\\u60A8\\u7684Vue\\u7248\\u672C\\uFF1A${ot.default.version}\\u6CE8\\u610F\\uFF1A\\u5F53\\u4F60\\u4F7F\\u7528\\u7684vue\\u7248\\u672C\\u7B49\\u4E8E\\u4F4E\\u4E8E2.6.12\\u65F6\\uFF0C\\u56FE\\u8C31\\u4F1A\\u663E\\u793A\\u4E0D\\u6B63\\u5E38\\uFF0C\\u53C2\\u8003\\u8FD9\\u4E2A\\u8FDE\\u63A5\\u89E3\\u51B3\\u8FD9\\u4E2A\\u95EE\\u9898\\uFF1Ahttps://github.com/seeksdream/relation-graph/issues/113`)),Y.default||console.error(\"[relation-graph]Please introduce component screenfull, for example:https://cdnjs.cloudflare.com/ajax/libs/screenfull.js/5.1.0/screenfull.min.js\"),Dt.default||console.error(\"[relation-graph]Please introduce component html2canvas, for example:https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js\")},mounted(){u(\"---------------------------graph mounted---------------------------\");const e=JSON.parse(JSON.stringify(this.options)),s=this.relationGraphCore?new this.relationGraphCore(e,le(this)):new Ht(e,le(this));s.options.oldVueVersion=this.oldVueVersion,this.relationGraph=s,s.setReactiveData(this.graphData,this.graph),s.setDom(this.$refs.seeksRelationGraph),s.setEventEmitHook((t,...o)=>{this.$emit(t,...o)}),s.ready(),s.id=Math.random(),this.graphInstanceOK=!0,Y.default&&Y.default.on&&Y.default.on(\"change\",this.doFullscreen)},beforeDestroy(){u(\"beforeDestroy:relation-graph\"),this.getRelationGraph().options.instanceDestroyed=!0,Y.default&&Y.default.off&&Y.default.off(\"change\",this.doFullscreen)},updated(){u(\"---------------------------graph updated---------------------------\")},methods:{getRelationGraph(){return this.relationGraph},doFullscreen(){K(\"Method [$graphRef.doFullscreen()] has been deprecated. Please use: $graphRef.getInstance().doFullscreen()\"),this.getRelationGraph().fullscreen(Y.default.isFullscreen)},getInstance(){return this.getRelationGraph()},setOptions(e,s){return C(this,null,function*(){K(\"Method [$graphRef.removeNodeById()] has been deprecated. Please use: $graphRef.getInstance().removeNodeById()\"),yield this.getRelationGraph().setOptions(e),s&&s(this.getRelationGraph())})},setJsonData(o,n,i){return C(this,arguments,function*(e,s,t){return arguments.length===2&&typeof s==\"function\"&&(t=s,s=!0),yield this.getRelationGraph().setJsonData(e,s),new Promise((a,l)=>{this.$nextTick(()=>C(this,null,function*(){yield this.getRelationGraph().refresh(!1),t&&t(this.getRelationGraph()),a()}))})})},appendJsonData(o,n,i){return C(this,arguments,function*(e,s,t){arguments.length===2&&typeof s==\"function\"&&(t=s,s=!0),yield this.getRelationGraph().appendJsonData(e,s),t&&t(this.getRelationGraph())})},setLayouter(e){K(\"Method [$graphRef.setLayouter()] has been deprecated. Please use: $graphRef.getInstance().setLayouter()\"),this.getRelationGraph().setLayouter(e)},onGraphResize(){K(\"Method [$graphRef.onGraphResize()] has been deprecated. Please use: $graphRef.getInstance().resetViewSize()\"),this.getRelationGraph().refreshNVAnalysisInfo()},refresh(){return C(this,null,function*(){K(\"Method [$graphRef.refresh()] has been deprecated. Please use: $graphRef.getInstance().refresh()\"),yield this.getRelationGraph().refresh()})},doLayout(){return C(this,null,function*(){K(\"Method [$graphRef.doLayout()] has been deprecated. Please use: $graphRef.getInstance().doLayout()\"),yield this.getRelationGraph().doLayout()})},focusRootNode(){return C(this,null,function*(){K(\"Method [$graphRef.focusRootNode()] has been deprecated. Please use: $graphRef.getInstance().focusRootNode()\"),yield this.getRelationGraph().focusRootNode()})},focusNodeById(e){return C(this,null,function*(){return K(\"Method [$graphRef.focusNodeById()] has been deprecated. Please use: $graphRef.getInstance().focusNodeById()\"),yield this.getRelationGraph().focusNodeById(e)})},getNodeById(e){return K(\"Method [$graphRef.getNodeById()] has been deprecated. Please use: $graphRef.getInstance().getNodeById()\"),this.getRelationGraph().getNodeById(e)},removeNodeById(e){return K(\"Method [$graphRef.removeNodeById()] has been deprecated. Please use: $graphRef.getInstance().removeNodeById()\"),this.getRelationGraph().removeNodeById(e)},getNodes(){return K(\"Method [$graphRef.getNodes()] has been deprecated. Please use: $graphRef.getInstance().getNodes()\"),this.getRelationGraph().getNodes()},getLinks(){return K(\"Method [$graphRef.getLinks()] has been deprecated. Please use: $graphRef.getInstance().getLinks()\"),this.getRelationGraph().getLinks()},getGraphJsonData(){return K(\"Method [$graphRef.getGraphJsonData()] has been deprecated. Please use: $graphRef.getInstance().getGraphJsonData()\"),this.getRelationGraph().getGraphJsonData()},getGraphJsonOptions(){return K(\"Method [$graphRef.getGraphJsonOptions()] has been deprecated. Please use: $graphRef.getInstance().getGraphJsonOptions()\"),this.getRelationGraph().getGraphJsonOptions()}}};var Jn=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{ref:\"seeksRelationGraph\",staticClass:\"relation-graph\",style:{width:\"100%\",height:\"100%\"}},[e.graphInstanceOK&&e.graph.options?[e.graph.options.showDebugPanel?t(\"GraphDebugPanel\"):e._e(),e.graph.options.allowShowMiniToolBar===!0?[e.graph.options.oldVueVersion&&!e.graph.options.ovUseToolbarSlot?t(\"GraphToolBar\"):e._t(\"tool-bar\",function(){return[e.graph.options.toolBarVersion===\"v2\"?t(\"GraphToolBar\"):t(\"GraphMiniToolBar\")]})]:e._e(),e._t(\"graph-plug\"),t(\"RGCanvas\",{scopedSlots:e._u([{key:\"node\",fn:function(o){var n=o.node;return[e._t(\"node\",null,{node:n})]}},{key:\"line\",fn:function(o){var n=o.line,i=o.link;return[e._t(\"line\",null,{line:n,link:i})]}},{key:\"canvas-plug\",fn:function(){return[e._t(\"canvas-plug\")]},proxy:!0},{key:\"canvas-plug-above\",fn:function(){return[e._t(\"default\")]},proxy:!0},{key:\"node-expand-holder\",fn:function(o){var n=o.nodeProps,i=o.expandHolderPosition,a=o.expandButtonClass,l=o.color,r=o.expandOrCollapseNode;return[e._t(\"node-expand-holder\",null,{nodeProps:n,expandHolderPosition:i,expandButtonClass:a,color:l,expandOrCollapseNode:r})]}}],null,!0)}),t(\"GraphOperateStuff\",{scopedSlots:e._u([{key:\"node-template\",fn:function(o){var n=o.node;return[e._t(\"node-template\",null,{node:n})]}}],null,!0)}),t(\"GraphLoading\")]:e._e()],2)},qn=[];const pa=\"\",ce={};var Kn=G(Zn,Jn,qn,!1,Qn,null,null,null);function Qn(e){for(let s in ce)this[s]=ce[s]}const de=function(){return Kn.exports}(),ti={name:\"GraphXsToolBar\",data(){return{}},props:{direction:{mustUseProp:!1,default:\"h\",type:String},positionH:{mustUseProp:!1,default:\"left\",type:String},positionV:{mustUseProp:!1,default:\"bottom\",type:String}},inject:[\"graph\",\"graphInstance\"],computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options}},mounted(){},methods:{refresh(){this.relationGraph.refresh()},switchLayout(e){u(\"change layout:\",e),this.relationGraph.switchLayout(e)},toggleAutoLayout(){this.relationGraph.toggleAutoLayout()},downloadAsImage(){this.relationGraph.downloadAsImage(\"png\")},zoomToFit(){return C(this,null,function*(){yield this.relationGraph.setZoom(100),yield this.relationGraph.moveToCenter(),yield this.relationGraph.zoomToFit()})}}};var ei=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-toolbar rel-xs-toolbar\",class:[\"rel-toolbar-h-\"+e.positionH,\"rel-toolbar-v-\"+e.positionV,\"rel-toolbar-\"+e.direction]},[e.options.allowShowFullscreenMenu?t(\"div\",{staticClass:\"c-mb-button\",staticStyle:{\"margin-top\":\"0px\"},attrs:{title:\"Full Screen\"},on:{click:function(o){return e.relationGraph.fullscreen()}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{t:\"1712757785584\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",width:\"18\",height:\"18\"}},[t(\"path\",{attrs:{d:\"M298.666667 597.333333H213.333333v213.333334h213.333334v-85.333334H298.666667v-128z m-85.333334-170.666666h85.333334V298.666667h128V213.333333H213.333333v213.333334z m512 298.666666h-128v85.333334h213.333334v-213.333334h-85.333334v128zM597.333333 213.333333v85.333334h128v128h85.333334V213.333333h-213.333334z\",\"p-id\":\"7390\"}})])]):e._e(),e.options.allowShowZoomMenu?t(\"div\",{staticClass:\"c-mb-button\",on:{click:function(o){return e.relationGraph.zoom(20)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-fangda\"}})])]):e._e(),e.options.allowShowZoomMenu?t(\"div\",{staticClass:\"c-current-zoom\",on:{click:e.zoomToFit}},[e._v(e._s(e.options.canvasZoom)+\"%\")]):e._e(),e.options.allowShowZoomMenu?t(\"div\",{staticClass:\"c-mb-button\",staticStyle:{\"margin-top\":\"0px\"},on:{click:function(o){return e.relationGraph.zoom(-20)}}},[t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-suoxiao\"}})])]):e._e(),e.options.allowAutoLayoutIfSupport&&e.options.isNeedShowAutoLayoutButton?t(\"div\",{staticClass:\"c-mb-button\",class:{\"c-mb-button-on\":e.options.autoLayouting},attrs:{title:e.options.autoLayouting?\"Stop Force Layout\":\"Start Force Layout\"},on:{click:e.toggleAutoLayout}},[e.options.autoLayouting?t(\"svg\",{staticClass:\"c-loading-icon rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-lianjiezhong\"}})]):t(\"svg\",{staticClass:\"rg-icon\",attrs:{\"aria-hidden\":\"true\"}},[t(\"use\",{attrs:{\"xlink:href\":\"#icon-zidong\"}})])]):e._e(),e._t(\"default\"),t(\"div\",{staticStyle:{clear:\"both\"}})],2)},oi=[];const fa=\"\",ue={};var ni=G(ti,ei,oi,!1,ii,null,null,null);function ii(e){for(let s in ue)this[s]=ue[s]}const si=function(){return ni.exports}(),ai={name:\"GraphBackground\",components:{},props:{forImage:{mustUseProp:!1,default:!0,type:Boolean},forDisplay:{mustUseProp:!1,default:!0,type:Boolean}},inject:[\"graph\",\"graphInstance\"],data(){return{originBackgroundColor:\"\",originBackgroundImage:\"\"}},computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options},show(){let e=!1;return this.options.snapshotting?this.forImage===!1?e=!1:e=!0:this.forDisplay===!1?e=!1:e=!0,e}},mounted(){this.originBackgroundColor=this.options.backgroundColor,this.originBackgroundImage=this.options.backgroundImage,this.options.backgroundColor=\"transparent\",this.options.backgroundImage=\"\",this.relationGraph.setBackgroundDom(this.$refs.backgroundRef,this.forImage,this.forDisplay)},methods:{},beforeDestroy(){this.options.backgroundColor=this.originBackgroundColor,this.options.backgroundImage=this.originBackgroundImage,this.relationGraph.setBackgroundDom(null,this.forImage,this.forDisplay)}};var ri=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.show,expression:\"show\"}],ref:\"backgroundRef\",staticClass:\"rel-background\"},[e._t(\"default\")],2)},li=[];const ga=\"\",pe={};var hi=G(ai,ri,li,!1,ci,\"46048452\",null,null);function ci(e){for(let s in pe)this[s]=pe[s]}const di=function(){return hi.exports}(),ui={name:\"GraphWatermark\",components:{},props:{forImage:{mustUseProp:!1,default:!0,type:Boolean},forDisplay:{mustUseProp:!1,default:!0,type:Boolean},position:{mustUseProp:!1,default:\"br\",type:String},width:{mustUseProp:!1,default:\"200px\",type:String},height:{mustUseProp:!1,default:\"200px\",type:String}},inject:[\"graph\",\"graphInstance\"],computed:{relationGraph(){return this.graphInstance()},options(){return this.graph.options},show(){let e=!1;return this.options.snapshotting?this.forImage===!1?e=!1:e=!0:this.forDisplay===!0?e=!0:e=!1,e}},mounted(){this.$refs.watermarkRef.style.setProperty(\"--mv-width\",this.width),this.$refs.watermarkRef.style.setProperty(\"--mv-height\",this.height),this.relationGraph.setWatermarkDom(this.$refs.watermarkRef,this.forImage,this.forDisplay,this.position)},methods:{},beforeDestroy(){this.relationGraph.setWatermarkDom(null,this.forImage,this.forDisplay)}};var pi=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.show,expression:\"show\"}],ref:\"watermarkRef\",staticClass:\"rel-watermark\",class:[\"rel-watermark-\"+e.position]},[e._t(\"default\")],2)},fi=[];const _a=\"\",fe={};var gi=G(ui,pi,fi,!1,_i,\"0bbcf676\",null,null);function _i(e){for(let s in fe)this[s]=fe[s]}const mi=function(){return gi.exports}(),yi={name:\"RGEditingNearNodeWidget\",props:{position:{mustUseProp:!1,default:\"top\",type:String}},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},data(){return{}},methods:{onMouseDown(e,s){s.stopPropagation(),this.relationGraph.onResizeStart(e,s)}}};var vi=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-editing-bar\",class:[\"rel-editing-bar-\"+e.position]},[e._t(\"default\")],2)},xi=[];const ma=\"\",ge={};var wi=G(yi,vi,xi,!1,Ci,\"3d0b34ee\",null,null);function Ci(e){for(let s in ge)this[s]=ge[s]}const _e=function(){return wi.exports}(),bi={name:\"RGEditingResize\",components:{},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},data(){return{}},methods:{onMouseDown(e,s){s.stopPropagation(),this.relationGraph.onResizeStart(e,s)}}};var Li=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-resize-ctl\"},[e.options.editingController.width>30?t(\"div\",{staticClass:\"rel-resize-ctl-handler rel-resize-ctl-tl\",on:{mousedown:function(o){return e.onMouseDown(\"tl\",o)}}}):e._e(),e.options.editingController.width>30?t(\"div\",{staticClass:\"rel-resize-ctl-handler rel-resize-ctl-tr\",on:{mousedown:function(o){return e.onMouseDown(\"tr\",o)}}}):e._e(),e.options.editingController.width>30?t(\"div\",{staticClass:\"rel-resize-ctl-handler rel-resize-ctl-bl\",on:{mousedown:function(o){return e.onMouseDown(\"bl\",o)}}}):e._e(),t(\"div\",{staticClass:\"rel-resize-ctl-handler rel-resize-ctl-br\",on:{mousedown:function(o){return e.onMouseDown(\"br\",o)}}}),e.options.editingController.width>60?t(\"div\",{staticClass:\"rel-resize-ctl-handler rel-resize-ctl-t\",on:{mousedown:function(o){return e.onMouseDown(\"t\",o)}}}):e._e(),e.options.editingController.width>60?t(\"div\",{staticClass:\"rel-resize-ctl-handler rel-resize-ctl-b\",on:{mousedown:function(o){return e.onMouseDown(\"b\",o)}}}):e._e(),e.options.editingController.height>60?t(\"div\",{staticClass:\"rel-resize-ctl-handler rel-resize-ctl-l\",on:{mousedown:function(o){return e.onMouseDown(\"l\",o)}}}):e._e(),e.options.editingController.height>60?t(\"div\",{staticClass:\"rel-resize-ctl-handler rel-resize-ctl-r\",on:{mousedown:function(o){return e.onMouseDown(\"r\",o)}}}):e._e()])},ki=[];const ya=\"\",me={};var Mi=G(bi,Li,ki,!1,Si,\"eb08d3d8\",null,null);function Si(e){for(let s in me)this[s]=me[s]}const ye=function(){return Mi.exports}(),Ei={name:\"RGEditingCreateLineHandle\",components:{},inject:[\"graph\",\"graphInstance\"],props:{lineTemplate:{mustUseProp:!1,default:()=>({}),type:Object}},computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},data(){return{}},methods:{onMouseDown(e,s){this.relationGraph.startCreateLineByTemplate(e,this.lineTemplate,s)}}};var Pi=function(){var e=this,s=e.$createElement,t=e._self._c||s;return e.options.editingController.nodes.length===1?t(\"div\",{staticClass:\"rel-editing-line-handle\",on:{mousedown:function(o){return e.onMouseDown(\"br\",o)}}},[e._t(\"default\")],2):e._e()},zi=[];const va=\"\",ve={};var $i=G(Ei,Pi,zi,!1,Oi,\"050f1ac0\",null,null);function Oi(e){for(let s in ve)this[s]=ve[s]}const xe=function(){return $i.exports}(),Ri={name:\"RGEditingController\",components:{RGEditingCreateLineHandle:xe,RGEditingResize:ye,RGEditingToolbar:_e},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},data(){return{}},methods:{}};var Di=function(){var e=this,s=e.$createElement,t=e._self._c||s;return e.options.editingController.show||e.options.snapshotting?t(\"div\",{staticClass:\"rel-editing-ctrl\",style:{left:e.options.editingController.x+\"px\",top:e.options.editingController.y+\"px\",width:e.options.editingController.width+\"px\",height:e.options.editingController.height+\"px\"}},[e._t(\"default\")],2):e._e()},Vi=[];const xa=\"\",we={};var Ni=G(Ri,Di,Vi,!1,Gi,\"5d6122ed\",null,null);function Gi(e){for(let s in we)this[s]=we[s]}const Bi=function(){return Ni.exports}(),Ti={name:\"RGMiniView\",components:{},props:{position:{mustUseProp:!1,default:\"br\",type:String},width:{mustUseProp:!1,default:\"200px\",type:String},height:{mustUseProp:!1,default:\"200px\",type:String}},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},data(){return{}},mounted(){this.options.showMiniView=!0,this.$refs.rgMiniView.style.setProperty(\"--mv-width\",this.width),this.$refs.rgMiniView.style.setProperty(\"--mv-height\",this.height),this.relationGraph.setMiniViewCanvas(this.$refs.rgMiniViewCanvas)},methods:{onMouseDown(e){this.relationGraph.onVisiableViewHandleDragStart(e)},onClickCanvas(e){this.relationGraph.resetByVisiableView(e)}},beforeDestroy(){this.options.showMiniView=!1}};var Ai=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{ref:\"rgMiniView\",staticClass:\"rel-miniview\",class:[\"rel-miniview-\"+e.position]},[t(\"canvas\",{ref:\"rgMiniViewCanvas\",class:{\"rel-mv-canvas-reset\":e.options.miniViewVisibleHandle.emptyContent},on:{click:e.onClickCanvas}}),t(\"div\",{staticClass:\"rel-mv-visible-area\",style:{left:e.options.miniViewVisibleHandle.x+\"px\",top:e.options.miniViewVisibleHandle.y+\"px\",width:e.options.miniViewVisibleHandle.width+\"px\",height:e.options.miniViewVisibleHandle.height+\"px\"},on:{mousedown:e.onMouseDown}})])},Ii=[];const wa=\"\",Ce={};var Hi=G(Ti,Ai,Ii,!1,Wi,\"95ed7564\",null,null);function Wi(e){for(let s in Ce)this[s]=Ce[s]}const Fi=function(){return Hi.exports}(),Ui={name:\"RGEditingLineController\",components:{},inject:[\"graph\",\"graphInstance\"],props:{textEditable:{mustUseProp:!1,default:!1}},computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()},show(){return this.options.editingLineController.show},text(){return this.options.editingLineController.line&&this.options.editingLineController.line.text}},data(){return{lineText:\"\",editing:!1}},watch:{show(e){e||(this.editing=!1,this.lineText=\"\")},text(e){e&&(this.lineText=e,this.$nextTick(()=>{this.relationGraph.updateEditingLineView()}))}},methods:{onMouseDown(e,s){this.relationGraph.startMoveLineVertex(e,s)},startMoveText(e){this.relationGraph.startMoveLineText(e)},startEditingLineText(e){this.editing=!this.editing},onLineTextChange(e){const s=this.options.editingLineController.line;s&&(s.text=e.target.value)}}};var ji=function(){var e=this,s=e.$createElement,t=e._self._c||s;return e.show?t(\"div\",{staticClass:\"rel-editing-line-ctrl\"},[e._t(\"default\"),t(\"div\",{staticClass:\"rel-line-ctrl-dot start-dot\",style:{left:e.options.editingLineController.startPoint.x+\"px\",top:e.options.editingLineController.startPoint.y+\"px\"},on:{mousedown:function(o){return e.onMouseDown(\"start\",o)}}}),t(\"div\",{staticClass:\"rel-line-ctrl-dot end-dot\",style:{left:e.options.editingLineController.endPoint.x+\"px\",top:e.options.editingLineController.endPoint.y+\"px\"},on:{mousedown:function(o){return e.onMouseDown(\"end\",o)}}}),e.textEditable&&e.options.editingLineController.line?t(\"div\",{class:[\"rel-line-ctrl-text\",e.editing&&\"rel-line-ctrl-text-editing\"],style:{width:e.options.editingLineController.text.width+\"px\",height:e.options.editingLineController.text.height+\"px\",left:e.options.editingLineController.text.x+\"px\",top:e.options.editingLineController.text.y+\"px\"},on:{dblclick:e.startEditingLineText,mousedown:function(o){return e.startMoveText(o)}}},[e.editing?t(\"input\",{directives:[{name:\"model\",rawName:\"v-model\",value:e.lineText,expression:\"lineText\"}],staticClass:\"rel-line-text-input\",domProps:{value:e.lineText},on:{blur:e.onLineTextChange,input:function(o){o.target.composing||(e.lineText=o.target.value)}}}):t(\"span\",[e._v(e._s(e.text))])]):e._e()],2):e._e()},Xi=[];const Ca=\"\",be={};var Yi=G(Ui,ji,Xi,!1,Zi,\"5d52d38c\",null,null);function Zi(e){for(let s in be)this[s]=be[s]}const Ji=function(){return Yi.exports}(),qi={name:\"RGEditingConnectPoints\",components:{},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},data(){return{}},methods:{onMouseUp(e,s){this.relationGraph.onLineVertexBeDropped(e,s)}}};var Ki=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{staticClass:\"rel-connect-ctl\"},[t(\"div\",{staticClass:\"rel-connect-ctl-handler rel-connect-ctl-t\",on:{mouseup:function(o){return e.onMouseUp(\"top\",o)}}}),t(\"div\",{staticClass:\"rel-connect-ctl-handler rel-connect-ctl-b\",on:{mouseup:function(o){return e.onMouseUp(\"bottom\",o)}}}),t(\"div\",{staticClass:\"rel-connect-ctl-handler rel-connect-ctl-center\",on:{mouseup:function(o){return e.onMouseUp(\"border\",o)}}}),t(\"div\",{staticClass:\"rel-connect-ctl-handler rel-connect-ctl-l\",on:{mouseup:function(o){return e.onMouseUp(\"left\",o)}}}),t(\"div\",{staticClass:\"rel-connect-ctl-handler rel-connect-ctl-r\",on:{mouseup:function(o){return e.onMouseUp(\"right\",o)}}}),t(\"div\",{staticClass:\"rel-connect-ctl-handler rel-connect-ctl-lr\",on:{mouseup:function(o){return e.onMouseUp(\"lr\",o)}}}),t(\"div\",{staticClass:\"rel-connect-ctl-handler rel-connect-ctl-tb\",on:{mouseup:function(o){return e.onMouseUp(\"tb\",o)}}})])},Qi=[];const ba=\"\",Le={};var ts=G(qi,Ki,Qi,!1,es,\"45afaa90\",null,null);function es(e){for(let s in Le)this[s]=Le[s]}const ke=function(){return ts.exports}(),os={name:\"RGEditingConnectController\",components:{RGEditingConnectPoints:ke},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},data(){return{}},methods:{}};var ns=function(){var e=this,s=e.$createElement,t=e._self._c||s;return e.options.nodeConnectController.show?t(\"div\",{staticClass:\"rel-editing-connect-ctrl\",style:{left:e.options.nodeConnectController.x+\"px\",top:e.options.nodeConnectController.y+\"px\",width:e.options.nodeConnectController.width+\"px\",height:e.options.nodeConnectController.height+\"px\"}},[e._t(\"default\",function(){return[t(\"RGEditingConnectPoints\")]})],2):e._e()},is=[];const La=\"\",Me={};var ss=G(os,ns,is,!1,as,\"4d1fe75a\",null,null);function as(e){for(let s in Me)this[s]=Me[s]}const rs=function(){return ss.exports}(),ls={name:\"RGEditingReferenceLine\",components:{},inject:[\"graph\",\"graphInstance\"],computed:{options(){return this.graph.options},relationGraph(){return this.graphInstance()}},data(){return{}},mounted(){this.options.showReferenceLine=!0},methods:{},beforeDestroy(){this.options.showReferenceLine=!1}};var hs=function(){var e=this,s=e.$createElement,t=e._self._c||s;return t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.options.editingReferenceLine.show,expression:\"options.editingReferenceLine.show\"}],staticClass:\"rel-editing-referline\"},[t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.options.editingReferenceLine.directionV,expression:\"options.editingReferenceLine.directionV\"}],staticClass:\"rel-editing-referline-v\",style:{left:e.options.editingReferenceLine.v_x+\"px\",top:e.options.editingReferenceLine.v_y+\"px\",height:e.options.editingReferenceLine.v_height+\"px\"}},[t(\"div\",{staticClass:\"referline\"},[t(\"div\",[e._v(e._s(e.options.editingReferenceLine.v_height)+\"px\")])])]),t(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.options.editingReferenceLine.directionH,expression:\"options.editingReferenceLine.directionH\"}],staticClass:\"rel-editing-referline-h\",style:{left:e.options.editingReferenceLine.h_x+\"px\",top:e.options.editingReferenceLine.h_y+\"px\",width:e.options.editingReferenceLine.h_width+\"px\"}},[t(\"div\",{staticClass:\"referline\"},[t(\"div\",[e._v(e._s(e.options.editingReferenceLine.h_width)+\"px\")])])])])},cs=[];const ka=\"\",Se={};var ds=G(ls,hs,cs,!1,us,\"da91b22c\",null,null);function us(e){for(let s in Se)this[s]=Se[s]}const ps=function(){return ds.exports}(),fs=Ht,gs=ae,_s=si,ms=Fi,ys=di,vs=mi,xs=Bi,ws=ye,Cs=_e,bs=Ji,Ls=rs,ks=xe,Ms=ke,Ss=ps,Es={BaseLayouter:ct,BidirectionalTreeLayouter:Gt,CenterLayouter:Bt,CircleLayouter:Tt,FixedLayouter:At,ForceLayouter:dt},Ps=Xe,zs=Ze,$s=We,Os=Ie,Rs=q,Ds=Te,Vs=no,Ee=(e,s)=>{e.component(\"RelationGraph\",de)};typeof window!=\"undefined\"&&window.Vue&&Ee(window.Vue);const Ns=De(Re({},de),{version:Vt,install:Ee});P.GraphToolBar=gs,P.Layout=Es,P.RGBackground=ys,P.RGEditingConnectController=Ls,P.RGEditingConnectPoints=Ms,P.RGEditingController=xs,P.RGEditingCreateLineHandle=ks,P.RGEditingLineController=bs,P.RGEditingNearNodeWidget=Cs,P.RGEditingReferenceLine=Ss,P.RGEditingResize=ws,P.RGEffectUtils=Vs,P.RGEventNames=$,P.RGGraphMath=Rs,P.RGLayouterUtils=Ps,P.RGLinkUtils=$s,P.RGMiniToolBar=_s,P.RGMiniView=ms,P.RGNodeUtils=Os,P.RGNodesAnalyticUtils=Ds,P.RGOptionsUtils=zs,P.RGWatermark=vs,P.RelationGraphCore=fs,P.default=Ns,Object.defineProperties(P,{__esModule:{value:!0},[Symbol.toStringTag]:{value:\"Module\"}})});\n"
  },
  {
    "path": "src/GraphRag.Net.Web/wwwroot/js/vue2.js",
    "content": "/*!\n * Vue.js v2.7.16\n * (c) 2014-2023 Evan You\n * Released under the MIT License.\n */\n/*!\n * Vue.js v2.7.16\n * (c) 2014-2023 Evan You\n * Released under the MIT License.\n */\n!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).Vue=e()}(this,(function(){\"use strict\";var t=Object.freeze({}),e=Array.isArray;function n(t){return null==t}function r(t){return null!=t}function o(t){return!0===t}function i(t){return\"string\"==typeof t||\"number\"==typeof t||\"symbol\"==typeof t||\"boolean\"==typeof t}function a(t){return\"function\"==typeof t}function s(t){return null!==t&&\"object\"==typeof t}var c=Object.prototype.toString;function u(t){return\"[object Object]\"===c.call(t)}function l(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function f(t){return r(t)&&\"function\"==typeof t.then&&\"function\"==typeof t.catch}function d(t){return null==t?\"\":Array.isArray(t)||u(t)&&t.toString===c?JSON.stringify(t,p,2):String(t)}function p(t,e){return e&&e.__v_isRef?e.value:e}function v(t){var e=parseFloat(t);return isNaN(e)?t:e}function h(t,e){for(var n=Object.create(null),r=t.split(\",\"),o=0;o<r.length;o++)n[r[o]]=!0;return e?function(t){return n[t.toLowerCase()]}:function(t){return n[t]}}var m=h(\"slot,component\",!0),g=h(\"key,ref,slot,slot-scope,is\");function y(t,e){var n=t.length;if(n){if(e===t[n-1])return void(t.length=n-1);var r=t.indexOf(e);if(r>-1)return t.splice(r,1)}}var _=Object.prototype.hasOwnProperty;function b(t,e){return _.call(t,e)}function $(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var w=/-(\\w)/g,x=$((function(t){return t.replace(w,(function(t,e){return e?e.toUpperCase():\"\"}))})),C=$((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),k=/\\B([A-Z])/g,S=$((function(t){return t.replace(k,\"-$1\").toLowerCase()}));var O=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function T(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function A(t,e){for(var n in e)t[n]=e[n];return t}function j(t){for(var e={},n=0;n<t.length;n++)t[n]&&A(e,t[n]);return e}function E(t,e,n){}var N=function(t,e,n){return!1},P=function(t){return t};function D(t,e){if(t===e)return!0;var n=s(t),r=s(e);if(!n||!r)return!n&&!r&&String(t)===String(e);try{var o=Array.isArray(t),i=Array.isArray(e);if(o&&i)return t.length===e.length&&t.every((function(t,n){return D(t,e[n])}));if(t instanceof Date&&e instanceof Date)return t.getTime()===e.getTime();if(o||i)return!1;var a=Object.keys(t),c=Object.keys(e);return a.length===c.length&&a.every((function(n){return D(t[n],e[n])}))}catch(t){return!1}}function M(t,e){for(var n=0;n<t.length;n++)if(D(t[n],e))return n;return-1}function I(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments))}}function L(t,e){return t===e?0===t&&1/t!=1/e:t==t||e==e}var R=\"data-server-rendered\",F=[\"component\",\"directive\",\"filter\"],H=[\"beforeCreate\",\"created\",\"beforeMount\",\"mounted\",\"beforeUpdate\",\"updated\",\"beforeDestroy\",\"destroyed\",\"activated\",\"deactivated\",\"errorCaptured\",\"serverPrefetch\",\"renderTracked\",\"renderTriggered\"],B={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:N,isReservedAttr:N,isUnknownElement:N,getTagNamespace:E,parsePlatformTagName:P,mustUseProp:N,async:!0,_lifecycleHooks:H},U=/a-zA-Z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F-\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD/;function z(t){var e=(t+\"\").charCodeAt(0);return 36===e||95===e}function V(t,e,n,r){Object.defineProperty(t,e,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var K=new RegExp(\"[^\".concat(U.source,\".$_\\\\d]\"));var J=\"__proto__\"in{},q=\"undefined\"!=typeof window,W=q&&window.navigator.userAgent.toLowerCase(),Z=W&&/msie|trident/.test(W),G=W&&W.indexOf(\"msie 9.0\")>0,X=W&&W.indexOf(\"edge/\")>0;W&&W.indexOf(\"android\");var Y=W&&/iphone|ipad|ipod|ios/.test(W);W&&/chrome\\/\\d+/.test(W),W&&/phantomjs/.test(W);var Q,tt=W&&W.match(/firefox\\/(\\d+)/),et={}.watch,nt=!1;if(q)try{var rt={};Object.defineProperty(rt,\"passive\",{get:function(){nt=!0}}),window.addEventListener(\"test-passive\",null,rt)}catch(t){}var ot=function(){return void 0===Q&&(Q=!q&&\"undefined\"!=typeof global&&(global.process&&\"server\"===global.process.env.VUE_ENV)),Q},it=q&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function at(t){return\"function\"==typeof t&&/native code/.test(t.toString())}var st,ct=\"undefined\"!=typeof Symbol&&at(Symbol)&&\"undefined\"!=typeof Reflect&&at(Reflect.ownKeys);st=\"undefined\"!=typeof Set&&at(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var ut=null;function lt(t){void 0===t&&(t=null),t||ut&&ut._scope.off(),ut=t,t&&t._scope.on()}var ft=function(){function t(t,e,n,r,o,i,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,\"child\",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),dt=function(t){void 0===t&&(t=\"\");var e=new ft;return e.text=t,e.isComment=!0,e};function pt(t){return new ft(void 0,void 0,void 0,String(t))}function vt(t){var e=new ft(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}\"function\"==typeof SuppressedError&&SuppressedError;var ht=0,mt=[],gt=function(){for(var t=0;t<mt.length;t++){var e=mt[t];e.subs=e.subs.filter((function(t){return t})),e._pending=!1}mt.length=0},yt=function(){function t(){this._pending=!1,this.id=ht++,this.subs=[]}return t.prototype.addSub=function(t){this.subs.push(t)},t.prototype.removeSub=function(t){this.subs[this.subs.indexOf(t)]=null,this._pending||(this._pending=!0,mt.push(this))},t.prototype.depend=function(e){t.target&&t.target.addDep(this)},t.prototype.notify=function(t){for(var e=this.subs.filter((function(t){return t})),n=0,r=e.length;n<r;n++){e[n].update()}},t}();yt.target=null;var _t=[];function bt(t){_t.push(t),yt.target=t}function $t(){_t.pop(),yt.target=_t[_t.length-1]}var wt=Array.prototype,xt=Object.create(wt);[\"push\",\"pop\",\"shift\",\"unshift\",\"splice\",\"sort\",\"reverse\"].forEach((function(t){var e=wt[t];V(xt,t,(function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];var o,i=e.apply(this,n),a=this.__ob__;switch(t){case\"push\":case\"unshift\":o=n;break;case\"splice\":o=n.slice(2)}return o&&a.observeArray(o),a.dep.notify(),i}))}));var Ct=Object.getOwnPropertyNames(xt),kt={},St=!0;function Ot(t){St=t}var Tt={notify:E,depend:E,addSub:E,removeSub:E},At=function(){function t(t,n,r){if(void 0===n&&(n=!1),void 0===r&&(r=!1),this.value=t,this.shallow=n,this.mock=r,this.dep=r?Tt:new yt,this.vmCount=0,V(t,\"__ob__\",this),e(t)){if(!r)if(J)t.__proto__=xt;else for(var o=0,i=Ct.length;o<i;o++){V(t,s=Ct[o],xt[s])}n||this.observeArray(t)}else{var a=Object.keys(t);for(o=0;o<a.length;o++){var s;Et(t,s=a[o],kt,void 0,n,r)}}}return t.prototype.observeArray=function(t){for(var e=0,n=t.length;e<n;e++)jt(t[e],!1,this.mock)},t}();function jt(t,n,r){return t&&b(t,\"__ob__\")&&t.__ob__ instanceof At?t.__ob__:!St||!r&&ot()||!e(t)&&!u(t)||!Object.isExtensible(t)||t.__v_skip||Bt(t)||t instanceof ft?void 0:new At(t,n,r)}function Et(t,n,r,o,i,a,s){void 0===s&&(s=!1);var c=new yt,u=Object.getOwnPropertyDescriptor(t,n);if(!u||!1!==u.configurable){var l=u&&u.get,f=u&&u.set;l&&!f||r!==kt&&2!==arguments.length||(r=t[n]);var d=i?r&&r.__ob__:jt(r,!1,a);return Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:function(){var n=l?l.call(t):r;return yt.target&&(c.depend(),d&&(d.dep.depend(),e(n)&&Dt(n))),Bt(n)&&!i?n.value:n},set:function(e){var n=l?l.call(t):r;if(L(n,e)){if(f)f.call(t,e);else{if(l)return;if(!i&&Bt(n)&&!Bt(e))return void(n.value=e);r=e}d=i?e&&e.__ob__:jt(e,!1,a),c.notify()}}}),c}}function Nt(t,n,r){if(!Ft(t)){var o=t.__ob__;return e(t)&&l(n)?(t.length=Math.max(t.length,n),t.splice(n,1,r),o&&!o.shallow&&o.mock&&jt(r,!1,!0),r):n in t&&!(n in Object.prototype)?(t[n]=r,r):t._isVue||o&&o.vmCount?r:o?(Et(o.value,n,r,void 0,o.shallow,o.mock),o.dep.notify(),r):(t[n]=r,r)}}function Pt(t,n){if(e(t)&&l(n))t.splice(n,1);else{var r=t.__ob__;t._isVue||r&&r.vmCount||Ft(t)||b(t,n)&&(delete t[n],r&&r.dep.notify())}}function Dt(t){for(var n=void 0,r=0,o=t.length;r<o;r++)(n=t[r])&&n.__ob__&&n.__ob__.dep.depend(),e(n)&&Dt(n)}function Mt(t){return It(t,!0),V(t,\"__v_isShallow\",!0),t}function It(t,e){Ft(t)||jt(t,e,ot())}function Lt(t){return Ft(t)?Lt(t.__v_raw):!(!t||!t.__ob__)}function Rt(t){return!(!t||!t.__v_isShallow)}function Ft(t){return!(!t||!t.__v_isReadonly)}var Ht=\"__v_isRef\";function Bt(t){return!(!t||!0!==t.__v_isRef)}function Ut(t,e){if(Bt(t))return t;var n={};return V(n,Ht,!0),V(n,\"__v_isShallow\",e),V(n,\"dep\",Et(n,\"value\",t,null,e,ot())),n}function zt(t,e,n){Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:function(){var t=e[n];if(Bt(t))return t.value;var r=t&&t.__ob__;return r&&r.dep.depend(),t},set:function(t){var r=e[n];Bt(r)&&!Bt(t)?r.value=t:e[n]=t}})}function Vt(t,e,n){var r=t[e];if(Bt(r))return r;var o={get value(){var r=t[e];return void 0===r?n:r},set value(n){t[e]=n}};return V(o,Ht,!0),o}var Kt=\"__v_rawToReadonly\",Jt=\"__v_rawToShallowReadonly\";function qt(t){return Wt(t,!1)}function Wt(t,e){if(!u(t))return t;if(Ft(t))return t;var n=e?Jt:Kt,r=t[n];if(r)return r;var o=Object.create(Object.getPrototypeOf(t));V(t,n,o),V(o,\"__v_isReadonly\",!0),V(o,\"__v_raw\",t),Bt(t)&&V(o,Ht,!0),(e||Rt(t))&&V(o,\"__v_isShallow\",!0);for(var i=Object.keys(t),a=0;a<i.length;a++)Zt(o,t,i[a],e);return o}function Zt(t,e,n,r){Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:function(){var t=e[n];return r||!u(t)?t:qt(t)},set:function(){}})}var Gt=$((function(t){var e=\"&\"===t.charAt(0),n=\"~\"===(t=e?t.slice(1):t).charAt(0),r=\"!\"===(t=n?t.slice(1):t).charAt(0);return{name:t=r?t.slice(1):t,once:n,capture:r,passive:e}}));function Xt(t,n){function r(){var t=r.fns;if(!e(t))return _n(t,null,arguments,n,\"v-on handler\");for(var o=t.slice(),i=0;i<o.length;i++)_n(o[i],null,arguments,n,\"v-on handler\")}return r.fns=t,r}function Yt(t,e,r,i,a,s){var c,u,l,f;for(c in t)u=t[c],l=e[c],f=Gt(c),n(u)||(n(l)?(n(u.fns)&&(u=t[c]=Xt(u,s)),o(f.once)&&(u=t[c]=a(f.name,u,f.capture)),r(f.name,u,f.capture,f.passive,f.params)):u!==l&&(l.fns=u,t[c]=l));for(c in e)n(t[c])&&i((f=Gt(c)).name,e[c],f.capture)}function Qt(t,e,i){var a;t instanceof ft&&(t=t.data.hook||(t.data.hook={}));var s=t[e];function c(){i.apply(this,arguments),y(a.fns,c)}n(s)?a=Xt([c]):r(s.fns)&&o(s.merged)?(a=s).fns.push(c):a=Xt([s,c]),a.merged=!0,t[e]=a}function te(t,e,n,o,i){if(r(e)){if(b(e,n))return t[n]=e[n],i||delete e[n],!0;if(b(e,o))return t[n]=e[o],i||delete e[o],!0}return!1}function ee(t){return i(t)?[pt(t)]:e(t)?re(t):void 0}function ne(t){return r(t)&&r(t.text)&&!1===t.isComment}function re(t,a){var s,c,u,l,f=[];for(s=0;s<t.length;s++)n(c=t[s])||\"boolean\"==typeof c||(l=f[u=f.length-1],e(c)?c.length>0&&(ne((c=re(c,\"\".concat(a||\"\",\"_\").concat(s)))[0])&&ne(l)&&(f[u]=pt(l.text+c[0].text),c.shift()),f.push.apply(f,c)):i(c)?ne(l)?f[u]=pt(l.text+c):\"\"!==c&&f.push(pt(c)):ne(c)&&ne(l)?f[u]=pt(l.text+c.text):(o(t._isVList)&&r(c.tag)&&n(c.key)&&r(a)&&(c.key=\"__vlist\".concat(a,\"_\").concat(s,\"__\")),f.push(c)));return f}var oe=1,ie=2;function ae(t,n,c,u,l,f){return(e(c)||i(c))&&(l=u,u=c,c=void 0),o(f)&&(l=ie),function(t,n,o,i,c){if(r(o)&&r(o.__ob__))return dt();r(o)&&r(o.is)&&(n=o.is);if(!n)return dt();e(i)&&a(i[0])&&((o=o||{}).scopedSlots={default:i[0]},i.length=0);c===ie?i=ee(i):c===oe&&(i=function(t){for(var n=0;n<t.length;n++)if(e(t[n]))return Array.prototype.concat.apply([],t);return t}(i));var u,l;if(\"string\"==typeof n){var f=void 0;l=t.$vnode&&t.$vnode.ns||B.getTagNamespace(n),u=B.isReservedTag(n)?new ft(B.parsePlatformTagName(n),o,i,void 0,void 0,t):o&&o.pre||!r(f=kr(t.$options,\"components\",n))?new ft(n,o,i,void 0,void 0,t):hr(f,o,t,i,n)}else u=hr(n,o,t,i);return e(u)?u:r(u)?(r(l)&&se(u,l),r(o)&&function(t){s(t.style)&&Wn(t.style);s(t.class)&&Wn(t.class)}(o),u):dt()}(t,n,c,u,l)}function se(t,e,i){if(t.ns=e,\"foreignObject\"===t.tag&&(e=void 0,i=!0),r(t.children))for(var a=0,s=t.children.length;a<s;a++){var c=t.children[a];r(c.tag)&&(n(c.ns)||o(i)&&\"svg\"!==c.tag)&&se(c,e,i)}}function ce(t,n){var o,i,a,c,u=null;if(e(t)||\"string\"==typeof t)for(u=new Array(t.length),o=0,i=t.length;o<i;o++)u[o]=n(t[o],o);else if(\"number\"==typeof t)for(u=new Array(t),o=0;o<t;o++)u[o]=n(o+1,o);else if(s(t))if(ct&&t[Symbol.iterator]){u=[];for(var l=t[Symbol.iterator](),f=l.next();!f.done;)u.push(n(f.value,u.length)),f=l.next()}else for(a=Object.keys(t),u=new Array(a.length),o=0,i=a.length;o<i;o++)c=a[o],u[o]=n(t[c],c,o);return r(u)||(u=[]),u._isVList=!0,u}function ue(t,e,n,r){var o,i=this.$scopedSlots[t];i?(n=n||{},r&&(n=A(A({},r),n)),o=i(n)||(a(e)?e():e)):o=this.$slots[t]||(a(e)?e():e);var s=n&&n.slot;return s?this.$createElement(\"template\",{slot:s},o):o}function le(t){return kr(this.$options,\"filters\",t)||P}function fe(t,n){return e(t)?-1===t.indexOf(n):t!==n}function de(t,e,n,r,o){var i=B.keyCodes[e]||n;return o&&r&&!B.keyCodes[e]?fe(o,r):i?fe(i,t):r?S(r)!==e:void 0===t}function pe(t,n,r,o,i){if(r)if(s(r)){e(r)&&(r=j(r));var a=void 0,c=function(e){if(\"class\"===e||\"style\"===e||g(e))a=t;else{var s=t.attrs&&t.attrs.type;a=o||B.mustUseProp(n,s,e)?t.domProps||(t.domProps={}):t.attrs||(t.attrs={})}var c=x(e),u=S(e);c in a||u in a||(a[e]=r[e],i&&((t.on||(t.on={}))[\"update:\".concat(e)]=function(t){r[e]=t}))};for(var u in r)c(u)}else;return t}function ve(t,e){var n=this._staticTrees||(this._staticTrees=[]),r=n[t];return r&&!e||me(r=n[t]=this.$options.staticRenderFns[t].call(this._renderProxy,this._c,this),\"__static__\".concat(t),!1),r}function he(t,e,n){return me(t,\"__once__\".concat(e).concat(n?\"_\".concat(n):\"\"),!0),t}function me(t,n,r){if(e(t))for(var o=0;o<t.length;o++)t[o]&&\"string\"!=typeof t[o]&&ge(t[o],\"\".concat(n,\"_\").concat(o),r);else ge(t,n,r)}function ge(t,e,n){t.isStatic=!0,t.key=e,t.isOnce=n}function ye(t,e){if(e)if(u(e)){var n=t.on=t.on?A({},t.on):{};for(var r in e){var o=n[r],i=e[r];n[r]=o?[].concat(o,i):i}}else;return t}function _e(t,n,r,o){n=n||{$stable:!r};for(var i=0;i<t.length;i++){var a=t[i];e(a)?_e(a,n,r):a&&(a.proxy&&(a.fn.proxy=!0),n[a.key]=a.fn)}return o&&(n.$key=o),n}function be(t,e){for(var n=0;n<e.length;n+=2){var r=e[n];\"string\"==typeof r&&r&&(t[e[n]]=e[n+1])}return t}function $e(t,e){return\"string\"==typeof t?e+t:t}function we(t){t._o=he,t._n=v,t._s=d,t._l=ce,t._t=ue,t._q=D,t._i=M,t._m=ve,t._f=le,t._k=de,t._b=pe,t._v=pt,t._e=dt,t._u=_e,t._g=ye,t._d=be,t._p=$e}function xe(t,e){if(!t||!t.length)return{};for(var n={},r=0,o=t.length;r<o;r++){var i=t[r],a=i.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,i.context!==e&&i.fnContext!==e||!a||null==a.slot)(n.default||(n.default=[])).push(i);else{var s=a.slot,c=n[s]||(n[s]=[]);\"template\"===i.tag?c.push.apply(c,i.children||[]):c.push(i)}}for(var u in n)n[u].every(Ce)&&delete n[u];return n}function Ce(t){return t.isComment&&!t.asyncFactory||\" \"===t.text}function ke(t){return t.isComment&&t.asyncFactory}function Se(e,n,r,o){var i,a=Object.keys(r).length>0,s=n?!!n.$stable:!a,c=n&&n.$key;if(n){if(n._normalized)return n._normalized;if(s&&o&&o!==t&&c===o.$key&&!a&&!o.$hasNormal)return o;for(var u in i={},n)n[u]&&\"$\"!==u[0]&&(i[u]=Oe(e,r,u,n[u]))}else i={};for(var l in r)l in i||(i[l]=Te(r,l));return n&&Object.isExtensible(n)&&(n._normalized=i),V(i,\"$stable\",s),V(i,\"$key\",c),V(i,\"$hasNormal\",a),i}function Oe(t,n,r,o){var i=function(){var n=ut;lt(t);var r=arguments.length?o.apply(null,arguments):o({}),i=(r=r&&\"object\"==typeof r&&!e(r)?[r]:ee(r))&&r[0];return lt(n),r&&(!i||1===r.length&&i.isComment&&!ke(i))?void 0:r};return o.proxy&&Object.defineProperty(n,r,{get:i,enumerable:!0,configurable:!0}),i}function Te(t,e){return function(){return t[e]}}function Ae(e){return{get attrs(){if(!e._attrsProxy){var n=e._attrsProxy={};V(n,\"_v_attr_proxy\",!0),je(n,e.$attrs,t,e,\"$attrs\")}return e._attrsProxy},get listeners(){e._listenersProxy||je(e._listenersProxy={},e.$listeners,t,e,\"$listeners\");return e._listenersProxy},get slots(){return function(t){t._slotsProxy||Ne(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(e)},emit:O(e.$emit,e),expose:function(t){t&&Object.keys(t).forEach((function(n){return zt(e,t,n)}))}}}function je(t,e,n,r,o){var i=!1;for(var a in e)a in t?e[a]!==n[a]&&(i=!0):(i=!0,Ee(t,a,r,o));for(var a in t)a in e||(i=!0,delete t[a]);return i}function Ee(t,e,n,r){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[r][e]}})}function Ne(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}function Pe(){var t=ut;return t._setupContext||(t._setupContext=Ae(t))}var De,Me,Ie=null;function Le(t,e){return(t.__esModule||ct&&\"Module\"===t[Symbol.toStringTag])&&(t=t.default),s(t)?e.extend(t):t}function Re(t){if(e(t))for(var n=0;n<t.length;n++){var o=t[n];if(r(o)&&(r(o.componentOptions)||ke(o)))return o}}function Fe(t,e){De.$on(t,e)}function He(t,e){De.$off(t,e)}function Be(t,e){var n=De;return function r(){null!==e.apply(null,arguments)&&n.$off(t,r)}}function Ue(t,e,n){De=t,Yt(e,n||{},Fe,He,Be,t),De=void 0}var ze=function(){function t(t){void 0===t&&(t=!1),this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Me,!t&&Me&&(this.index=(Me.scopes||(Me.scopes=[])).push(this)-1)}return t.prototype.run=function(t){if(this.active){var e=Me;try{return Me=this,t()}finally{Me=e}}},t.prototype.on=function(){Me=this},t.prototype.off=function(){Me=this.parent},t.prototype.stop=function(t){if(this.active){var e=void 0,n=void 0;for(e=0,n=this.effects.length;e<n;e++)this.effects[e].teardown();for(e=0,n=this.cleanups.length;e<n;e++)this.cleanups[e]();if(this.scopes)for(e=0,n=this.scopes.length;e<n;e++)this.scopes[e].stop(!0);if(!this.detached&&this.parent&&!t){var r=this.parent.scopes.pop();r&&r!==this&&(this.parent.scopes[this.index]=r,r.index=this.index)}this.parent=void 0,this.active=!1}},t}();function Ve(){return Me}var Ke=null;function Je(t){var e=Ke;return Ke=t,function(){Ke=e}}function qe(t){for(;t&&(t=t.$parent);)if(t._inactive)return!0;return!1}function We(t,e){if(e){if(t._directInactive=!1,qe(t))return}else if(t._directInactive)return;if(t._inactive||null===t._inactive){t._inactive=!1;for(var n=0;n<t.$children.length;n++)We(t.$children[n]);Ge(t,\"activated\")}}function Ze(t,e){if(!(e&&(t._directInactive=!0,qe(t))||t._inactive)){t._inactive=!0;for(var n=0;n<t.$children.length;n++)Ze(t.$children[n]);Ge(t,\"deactivated\")}}function Ge(t,e,n,r){void 0===r&&(r=!0),bt();var o=ut,i=Ve();r&&lt(t);var a=t.$options[e],s=\"\".concat(e,\" hook\");if(a)for(var c=0,u=a.length;c<u;c++)_n(a[c],t,n||null,t,s);t._hasHookEvent&&t.$emit(\"hook:\"+e),r&&(lt(o),i&&i.on()),$t()}var Xe=[],Ye=[],Qe={},tn=!1,en=!1,nn=0;var rn=0,on=Date.now;if(q&&!Z){var an=window.performance;an&&\"function\"==typeof an.now&&on()>document.createEvent(\"Event\").timeStamp&&(on=function(){return an.now()})}var sn=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function cn(){var t,e;for(rn=on(),en=!0,Xe.sort(sn),nn=0;nn<Xe.length;nn++)(t=Xe[nn]).before&&t.before(),e=t.id,Qe[e]=null,t.run();var n=Ye.slice(),r=Xe.slice();nn=Xe.length=Ye.length=0,Qe={},tn=en=!1,function(t){for(var e=0;e<t.length;e++)t[e]._inactive=!0,We(t[e],!0)}(n),function(t){var e=t.length;for(;e--;){var n=t[e],r=n.vm;r&&r._watcher===n&&r._isMounted&&!r._isDestroyed&&Ge(r,\"updated\")}}(r),gt(),it&&B.devtools&&it.emit(\"flush\")}function un(t){var e=t.id;if(null==Qe[e]&&(t!==yt.target||!t.noRecurse)){if(Qe[e]=!0,en){for(var n=Xe.length-1;n>nn&&Xe[n].id>t.id;)n--;Xe.splice(n+1,0,t)}else Xe.push(t);tn||(tn=!0,En(cn))}}var ln=\"watcher\",fn=\"\".concat(ln,\" callback\"),dn=\"\".concat(ln,\" getter\"),pn=\"\".concat(ln,\" cleanup\");function vn(t,e){return mn(t,null,{flush:\"post\"})}var hn={};function mn(n,r,o){var i=void 0===o?t:o,s=i.immediate,c=i.deep,u=i.flush,l=void 0===u?\"pre\":u;i.onTrack,i.onTrigger;var f,d,p=ut,v=function(t,e,n){void 0===n&&(n=null);var r=_n(t,null,n,p,e);return c&&r&&r.__ob__&&r.__ob__.dep.depend(),r},h=!1,m=!1;if(Bt(n)?(f=function(){return n.value},h=Rt(n)):Lt(n)?(f=function(){return n.__ob__.dep.depend(),n},c=!0):e(n)?(m=!0,h=n.some((function(t){return Lt(t)||Rt(t)})),f=function(){return n.map((function(t){return Bt(t)?t.value:Lt(t)?(t.__ob__.dep.depend(),Wn(t)):a(t)?v(t,dn):void 0}))}):f=a(n)?r?function(){return v(n,dn)}:function(){if(!p||!p._isDestroyed)return d&&d(),v(n,ln,[y])}:E,r&&c){var g=f;f=function(){return Wn(g())}}var y=function(t){d=_.onStop=function(){v(t,pn)}};if(ot())return y=E,r?s&&v(r,fn,[f(),m?[]:void 0,y]):f(),E;var _=new Xn(ut,f,E,{lazy:!0});_.noRecurse=!r;var b=m?[]:hn;return _.run=function(){if(_.active)if(r){var t=_.get();(c||h||(m?t.some((function(t,e){return L(t,b[e])})):L(t,b)))&&(d&&d(),v(r,fn,[t,b===hn?void 0:b,y]),b=t)}else _.get()},\"sync\"===l?_.update=_.run:\"post\"===l?(_.post=!0,_.update=function(){return un(_)}):_.update=function(){if(p&&p===ut&&!p._isMounted){var t=p._preWatchers||(p._preWatchers=[]);t.indexOf(_)<0&&t.push(_)}else un(_)},r?s?_.run():b=_.get():\"post\"===l&&p?p.$once(\"hook:mounted\",(function(){return _.get()})):_.get(),function(){_.teardown()}}function gn(t){var e=t._provided,n=t.$parent&&t.$parent._provided;return n===e?t._provided=Object.create(n):e}function yn(t,e,n){bt();try{if(e)for(var r=e;r=r.$parent;){var o=r.$options.errorCaptured;if(o)for(var i=0;i<o.length;i++)try{if(!1===o[i].call(r,t,e,n))return}catch(t){bn(t,r,\"errorCaptured hook\")}}bn(t,e,n)}finally{$t()}}function _n(t,e,n,r,o){var i;try{(i=n?t.apply(e,n):t.call(e))&&!i._isVue&&f(i)&&!i._handled&&(i.catch((function(t){return yn(t,r,o+\" (Promise/async)\")})),i._handled=!0)}catch(t){yn(t,r,o)}return i}function bn(t,e,n){if(B.errorHandler)try{return B.errorHandler.call(null,t,e,n)}catch(e){e!==t&&$n(e)}$n(t)}function $n(t,e,n){if(!q||\"undefined\"==typeof console)throw t;console.error(t)}var wn,xn=!1,Cn=[],kn=!1;function Sn(){kn=!1;var t=Cn.slice(0);Cn.length=0;for(var e=0;e<t.length;e++)t[e]()}if(\"undefined\"!=typeof Promise&&at(Promise)){var On=Promise.resolve();wn=function(){On.then(Sn),Y&&setTimeout(E)},xn=!0}else if(Z||\"undefined\"==typeof MutationObserver||!at(MutationObserver)&&\"[object MutationObserverConstructor]\"!==MutationObserver.toString())wn=\"undefined\"!=typeof setImmediate&&at(setImmediate)?function(){setImmediate(Sn)}:function(){setTimeout(Sn,0)};else{var Tn=1,An=new MutationObserver(Sn),jn=document.createTextNode(String(Tn));An.observe(jn,{characterData:!0}),wn=function(){Tn=(Tn+1)%2,jn.data=String(Tn)},xn=!0}function En(t,e){var n;if(Cn.push((function(){if(t)try{t.call(e)}catch(t){yn(t,e,\"nextTick\")}else n&&n(e)})),kn||(kn=!0,wn()),!t&&\"undefined\"!=typeof Promise)return new Promise((function(t){n=t}))}function Nn(t){return function(e,n){if(void 0===n&&(n=ut),n)return function(t,e,n){var r=t.$options;r[e]=$r(r[e],n)}(n,t,e)}}var Pn=Nn(\"beforeMount\"),Dn=Nn(\"mounted\"),Mn=Nn(\"beforeUpdate\"),In=Nn(\"updated\"),Ln=Nn(\"beforeDestroy\"),Rn=Nn(\"destroyed\"),Fn=Nn(\"activated\"),Hn=Nn(\"deactivated\"),Bn=Nn(\"serverPrefetch\"),Un=Nn(\"renderTracked\"),zn=Nn(\"renderTriggered\"),Vn=Nn(\"errorCaptured\");var Kn=\"2.7.16\";var Jn=Object.freeze({__proto__:null,version:Kn,defineComponent:function(t){return t},ref:function(t){return Ut(t,!1)},shallowRef:function(t){return Ut(t,!0)},isRef:Bt,toRef:Vt,toRefs:function(t){var n=e(t)?new Array(t.length):{};for(var r in t)n[r]=Vt(t,r);return n},unref:function(t){return Bt(t)?t.value:t},proxyRefs:function(t){if(Lt(t))return t;for(var e={},n=Object.keys(t),r=0;r<n.length;r++)zt(e,t,n[r]);return e},customRef:function(t){var e=new yt,n=t((function(){e.depend()}),(function(){e.notify()})),r=n.get,o=n.set,i={get value(){return r()},set value(t){o(t)}};return V(i,Ht,!0),i},triggerRef:function(t){t.dep&&t.dep.notify()},reactive:function(t){return It(t,!1),t},isReactive:Lt,isReadonly:Ft,isShallow:Rt,isProxy:function(t){return Lt(t)||Ft(t)},shallowReactive:Mt,markRaw:function(t){return Object.isExtensible(t)&&V(t,\"__v_skip\",!0),t},toRaw:function t(e){var n=e&&e.__v_raw;return n?t(n):e},readonly:qt,shallowReadonly:function(t){return Wt(t,!0)},computed:function(t,e){var n,r,o=a(t);o?(n=t,r=E):(n=t.get,r=t.set);var i=ot()?null:new Xn(ut,n,E,{lazy:!0}),s={effect:i,get value(){return i?(i.dirty&&i.evaluate(),yt.target&&i.depend(),i.value):n()},set value(t){r(t)}};return V(s,Ht,!0),V(s,\"__v_isReadonly\",o),s},watch:function(t,e,n){return mn(t,e,n)},watchEffect:function(t,e){return mn(t,null,e)},watchPostEffect:vn,watchSyncEffect:function(t,e){return mn(t,null,{flush:\"sync\"})},EffectScope:ze,effectScope:function(t){return new ze(t)},onScopeDispose:function(t){Me&&Me.cleanups.push(t)},getCurrentScope:Ve,provide:function(t,e){ut&&(gn(ut)[t]=e)},inject:function(t,e,n){void 0===n&&(n=!1);var r=ut;if(r){var o=r.$parent&&r.$parent._provided;if(o&&t in o)return o[t];if(arguments.length>1)return n&&a(e)?e.call(r):e}},h:function(t,e,n){return ae(ut,t,e,n,2,!0)},getCurrentInstance:function(){return ut&&{proxy:ut}},useSlots:function(){return Pe().slots},useAttrs:function(){return Pe().attrs},useListeners:function(){return Pe().listeners},mergeDefaults:function(t,n){var r=e(t)?t.reduce((function(t,e){return t[e]={},t}),{}):t;for(var o in n){var i=r[o];i?e(i)||a(i)?r[o]={type:i,default:n[o]}:i.default=n[o]:null===i&&(r[o]={default:n[o]})}return r},nextTick:En,set:Nt,del:Pt,useCssModule:function(e){return t},useCssVars:function(t){if(q){var e=ut;e&&vn((function(){var n=e.$el,r=t(e,e._setupProxy);if(n&&1===n.nodeType){var o=n.style;for(var i in r)o.setProperty(\"--\".concat(i),r[i])}}))}},defineAsyncComponent:function(t){a(t)&&(t={loader:t});var e=t.loader,n=t.loadingComponent,r=t.errorComponent,o=t.delay,i=void 0===o?200:o,s=t.timeout;t.suspensible;var c=t.onError,u=null,l=0,f=function(){var t;return u||(t=u=e().catch((function(t){if(t=t instanceof Error?t:new Error(String(t)),c)return new Promise((function(e,n){c(t,(function(){return e((l++,u=null,f()))}),(function(){return n(t)}),l+1)}));throw t})).then((function(e){return t!==u&&u?u:(e&&(e.__esModule||\"Module\"===e[Symbol.toStringTag])&&(e=e.default),e)})))};return function(){return{component:f(),delay:i,timeout:s,error:r,loading:n}}},onBeforeMount:Pn,onMounted:Dn,onBeforeUpdate:Mn,onUpdated:In,onBeforeUnmount:Ln,onUnmounted:Rn,onActivated:Fn,onDeactivated:Hn,onServerPrefetch:Bn,onRenderTracked:Un,onRenderTriggered:zn,onErrorCaptured:function(t,e){void 0===e&&(e=ut),Vn(t,e)}}),qn=new st;function Wn(t){return Zn(t,qn),qn.clear(),t}function Zn(t,n){var r,o,i=e(t);if(!(!i&&!s(t)||t.__v_skip||Object.isFrozen(t)||t instanceof ft)){if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(i)for(r=t.length;r--;)Zn(t[r],n);else if(Bt(t))Zn(t.value,n);else for(r=(o=Object.keys(t)).length;r--;)Zn(t[o[r]],n)}}var Gn=0,Xn=function(){function t(t,e,n,r,o){!function(t,e){void 0===e&&(e=Me),e&&e.active&&e.effects.push(t)}(this,Me&&!Me._vm?Me:t?t._scope:void 0),(this.vm=t)&&o&&(t._watcher=this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync,this.before=r.before):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++Gn,this.active=!0,this.post=!1,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new st,this.newDepIds=new st,this.expression=\"\",a(e)?this.getter=e:(this.getter=function(t){if(!K.test(t)){var e=t.split(\".\");return function(t){for(var n=0;n<e.length;n++){if(!t)return;t=t[e[n]]}return t}}}(e),this.getter||(this.getter=E)),this.value=this.lazy?void 0:this.get()}return t.prototype.get=function(){var t;bt(this);var e=this.vm;try{t=this.getter.call(e,e)}catch(t){if(!this.user)throw t;yn(t,e,'getter for watcher \"'.concat(this.expression,'\"'))}finally{this.deep&&Wn(t),$t(),this.cleanupDeps()}return t},t.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},t.prototype.cleanupDeps=function(){for(var t=this.deps.length;t--;){var e=this.deps[t];this.newDepIds.has(e.id)||e.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},t.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():un(this)},t.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||s(t)||this.deep){var e=this.value;if(this.value=t,this.user){var n='callback for watcher \"'.concat(this.expression,'\"');_n(this.cb,this.vm,[t,e],this.vm,n)}else this.cb.call(this.vm,t,e)}}},t.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},t.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},t.prototype.teardown=function(){if(this.vm&&!this.vm._isBeingDestroyed&&y(this.vm._scope.effects,this),this.active){for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1,this.onStop&&this.onStop()}},t}(),Yn={enumerable:!0,configurable:!0,get:E,set:E};function Qn(t,e,n){Yn.get=function(){return this[e][n]},Yn.set=function(t){this[e][n]=t},Object.defineProperty(t,n,Yn)}function tr(t){var n=t.$options;if(n.props&&function(t,e){var n=t.$options.propsData||{},r=t._props=Mt({}),o=t.$options._propKeys=[],i=!t.$parent;i||Ot(!1);var a=function(i){o.push(i);var a=Sr(i,e,n,t);Et(r,i,a,void 0,!0),i in t||Qn(t,\"_props\",i)};for(var s in e)a(s);Ot(!0)}(t,n.props),function(t){var e=t.$options,n=e.setup;if(n){var r=t._setupContext=Ae(t);lt(t),bt();var o=_n(n,null,[t._props||Mt({}),r],t,\"setup\");if($t(),lt(),a(o))e.render=o;else if(s(o))if(t._setupState=o,o.__sfc){var i=t._setupProxy={};for(var c in o)\"__sfc\"!==c&&zt(i,o,c)}else for(var c in o)z(c)||zt(t,o,c)}}(t),n.methods&&function(t,e){for(var n in t.$options.props,e)t[n]=\"function\"!=typeof e[n]?E:O(e[n],t)}(t,n.methods),n.data)!function(t){var e=t.$options.data;e=t._data=a(e)?function(t,e){bt();try{return t.call(e,e)}catch(t){return yn(t,e,\"data()\"),{}}finally{$t()}}(e,t):e||{},u(e)||(e={});var n=Object.keys(e),r=t.$options.props;t.$options.methods;var o=n.length;for(;o--;){var i=n[o];r&&b(r,i)||z(i)||Qn(t,\"_data\",i)}var s=jt(e);s&&s.vmCount++}(t);else{var r=jt(t._data={});r&&r.vmCount++}n.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=ot();for(var o in e){var i=e[o],s=a(i)?i:i.get;r||(n[o]=new Xn(t,s||E,E,er)),o in t||nr(t,o,i)}}(t,n.computed),n.watch&&n.watch!==et&&function(t,n){for(var r in n){var o=n[r];if(e(o))for(var i=0;i<o.length;i++)ir(t,r,o[i]);else ir(t,r,o)}}(t,n.watch)}var er={lazy:!0};function nr(t,e,n){var r=!ot();a(n)?(Yn.get=r?rr(e):or(n),Yn.set=E):(Yn.get=n.get?r&&!1!==n.cache?rr(e):or(n.get):E,Yn.set=n.set||E),Object.defineProperty(t,e,Yn)}function rr(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),yt.target&&e.depend(),e.value}}function or(t){return function(){return t.call(this,this)}}function ir(t,e,n,r){return u(n)&&(r=n,n=n.handler),\"string\"==typeof n&&(n=t[n]),t.$watch(e,n,r)}function ar(t,e){if(t){for(var n=Object.create(null),r=ct?Reflect.ownKeys(t):Object.keys(t),o=0;o<r.length;o++){var i=r[o];if(\"__ob__\"!==i){var s=t[i].from;if(s in e._provided)n[i]=e._provided[s];else if(\"default\"in t[i]){var c=t[i].default;n[i]=a(c)?c.call(e):c}}}return n}}var sr=0;function cr(t){var e=t.options;if(t.super){var n=cr(t.super);if(n!==t.superOptions){t.superOptions=n;var r=function(t){var e,n=t.options,r=t.sealedOptions;for(var o in n)n[o]!==r[o]&&(e||(e={}),e[o]=n[o]);return e}(t);r&&A(t.extendOptions,r),(e=t.options=Cr(n,t.extendOptions)).name&&(e.components[e.name]=t)}}return e}function ur(n,r,i,a,s){var c,u=this,l=s.options;b(a,\"_uid\")?(c=Object.create(a))._original=a:(c=a,a=a._original);var f=o(l._compiled),d=!f;this.data=n,this.props=r,this.children=i,this.parent=a,this.listeners=n.on||t,this.injections=ar(l.inject,a),this.slots=function(){return u.$slots||Se(a,n.scopedSlots,u.$slots=xe(i,a)),u.$slots},Object.defineProperty(this,\"scopedSlots\",{enumerable:!0,get:function(){return Se(a,n.scopedSlots,this.slots())}}),f&&(this.$options=l,this.$slots=this.slots(),this.$scopedSlots=Se(a,n.scopedSlots,this.$slots)),l._scopeId?this._c=function(t,n,r,o){var i=ae(c,t,n,r,o,d);return i&&!e(i)&&(i.fnScopeId=l._scopeId,i.fnContext=a),i}:this._c=function(t,e,n,r){return ae(c,t,e,n,r,d)}}function lr(t,e,n,r,o){var i=vt(t);return i.fnContext=n,i.fnOptions=r,e.slot&&((i.data||(i.data={})).slot=e.slot),i}function fr(t,e){for(var n in e)t[x(n)]=e[n]}function dr(t){return t.name||t.__name||t._componentTag}we(ur.prototype);var pr={init:function(t,e){if(t.componentInstance&&!t.componentInstance._isDestroyed&&t.data.keepAlive){var n=t;pr.prepatch(n,n)}else{(t.componentInstance=function(t,e){var n={_isComponent:!0,_parentVnode:t,parent:e},o=t.data.inlineTemplate;r(o)&&(n.render=o.render,n.staticRenderFns=o.staticRenderFns);return new t.componentOptions.Ctor(n)}(t,Ke)).$mount(e?t.elm:void 0,e)}},prepatch:function(e,n){var r=n.componentOptions;!function(e,n,r,o,i){var a=o.data.scopedSlots,s=e.$scopedSlots,c=!!(a&&!a.$stable||s!==t&&!s.$stable||a&&e.$scopedSlots.$key!==a.$key||!a&&e.$scopedSlots.$key),u=!!(i||e.$options._renderChildren||c),l=e.$vnode;e.$options._parentVnode=o,e.$vnode=o,e._vnode&&(e._vnode.parent=o),e.$options._renderChildren=i;var f=o.data.attrs||t;e._attrsProxy&&je(e._attrsProxy,f,l.data&&l.data.attrs||t,e,\"$attrs\")&&(u=!0),e.$attrs=f,r=r||t;var d=e.$options._parentListeners;if(e._listenersProxy&&je(e._listenersProxy,r,d||t,e,\"$listeners\"),e.$listeners=e.$options._parentListeners=r,Ue(e,r,d),n&&e.$options.props){Ot(!1);for(var p=e._props,v=e.$options._propKeys||[],h=0;h<v.length;h++){var m=v[h],g=e.$options.props;p[m]=Sr(m,g,n,e)}Ot(!0),e.$options.propsData=n}u&&(e.$slots=xe(i,o.context),e.$forceUpdate())}(n.componentInstance=e.componentInstance,r.propsData,r.listeners,n,r.children)},insert:function(t){var e,n=t.context,r=t.componentInstance;r._isMounted||(r._isMounted=!0,Ge(r,\"mounted\")),t.data.keepAlive&&(n._isMounted?((e=r)._inactive=!1,Ye.push(e)):We(r,!0))},destroy:function(t){var e=t.componentInstance;e._isDestroyed||(t.data.keepAlive?Ze(e,!0):e.$destroy())}},vr=Object.keys(pr);function hr(i,a,c,u,l){if(!n(i)){var d=c.$options._base;if(s(i)&&(i=d.extend(i)),\"function\"==typeof i){var p;if(n(i.cid)&&(i=function(t,e){if(o(t.error)&&r(t.errorComp))return t.errorComp;if(r(t.resolved))return t.resolved;var i=Ie;if(i&&r(t.owners)&&-1===t.owners.indexOf(i)&&t.owners.push(i),o(t.loading)&&r(t.loadingComp))return t.loadingComp;if(i&&!r(t.owners)){var a=t.owners=[i],c=!0,u=null,l=null;i.$on(\"hook:destroyed\",(function(){return y(a,i)}));var d=function(t){for(var e=0,n=a.length;e<n;e++)a[e].$forceUpdate();t&&(a.length=0,null!==u&&(clearTimeout(u),u=null),null!==l&&(clearTimeout(l),l=null))},p=I((function(n){t.resolved=Le(n,e),c?a.length=0:d(!0)})),v=I((function(e){r(t.errorComp)&&(t.error=!0,d(!0))})),h=t(p,v);return s(h)&&(f(h)?n(t.resolved)&&h.then(p,v):f(h.component)&&(h.component.then(p,v),r(h.error)&&(t.errorComp=Le(h.error,e)),r(h.loading)&&(t.loadingComp=Le(h.loading,e),0===h.delay?t.loading=!0:u=setTimeout((function(){u=null,n(t.resolved)&&n(t.error)&&(t.loading=!0,d(!1))}),h.delay||200)),r(h.timeout)&&(l=setTimeout((function(){l=null,n(t.resolved)&&v(null)}),h.timeout)))),c=!1,t.loading?t.loadingComp:t.resolved}}(p=i,d),void 0===i))return function(t,e,n,r,o){var i=dt();return i.asyncFactory=t,i.asyncMeta={data:e,context:n,children:r,tag:o},i}(p,a,c,u,l);a=a||{},cr(i),r(a.model)&&function(t,n){var o=t.model&&t.model.prop||\"value\",i=t.model&&t.model.event||\"input\";(n.attrs||(n.attrs={}))[o]=n.model.value;var a=n.on||(n.on={}),s=a[i],c=n.model.callback;r(s)?(e(s)?-1===s.indexOf(c):s!==c)&&(a[i]=[c].concat(s)):a[i]=c}(i.options,a);var v=function(t,e,o){var i=e.options.props;if(!n(i)){var a={},s=t.attrs,c=t.props;if(r(s)||r(c))for(var u in i){var l=S(u);te(a,c,u,l,!0)||te(a,s,u,l,!1)}return a}}(a,i);if(o(i.options.functional))return function(n,o,i,a,s){var c=n.options,u={},l=c.props;if(r(l))for(var f in l)u[f]=Sr(f,l,o||t);else r(i.attrs)&&fr(u,i.attrs),r(i.props)&&fr(u,i.props);var d=new ur(i,u,s,a,n),p=c.render.call(null,d._c,d);if(p instanceof ft)return lr(p,i,d.parent,c);if(e(p)){for(var v=ee(p)||[],h=new Array(v.length),m=0;m<v.length;m++)h[m]=lr(v[m],i,d.parent,c);return h}}(i,v,a,c,u);var h=a.on;if(a.on=a.nativeOn,o(i.options.abstract)){var m=a.slot;a={},m&&(a.slot=m)}!function(t){for(var e=t.hook||(t.hook={}),n=0;n<vr.length;n++){var r=vr[n],o=e[r],i=pr[r];o===i||o&&o._merged||(e[r]=o?mr(i,o):i)}}(a);var g=dr(i.options)||l;return new ft(\"vue-component-\".concat(i.cid).concat(g?\"-\".concat(g):\"\"),a,void 0,void 0,void 0,c,{Ctor:i,propsData:v,listeners:h,tag:l,children:u},p)}}}function mr(t,e){var n=function(n,r){t(n,r),e(n,r)};return n._merged=!0,n}var gr=E,yr=B.optionMergeStrategies;function _r(t,e,n){if(void 0===n&&(n=!0),!e)return t;for(var r,o,i,a=ct?Reflect.ownKeys(e):Object.keys(e),s=0;s<a.length;s++)\"__ob__\"!==(r=a[s])&&(o=t[r],i=e[r],n&&b(t,r)?o!==i&&u(o)&&u(i)&&_r(o,i):Nt(t,r,i));return t}function br(t,e,n){return n?function(){var r=a(e)?e.call(n,n):e,o=a(t)?t.call(n,n):t;return r?_r(r,o):o}:e?t?function(){return _r(a(e)?e.call(this,this):e,a(t)?t.call(this,this):t)}:e:t}function $r(t,n){var r=n?t?t.concat(n):e(n)?n:[n]:t;return r?function(t){for(var e=[],n=0;n<t.length;n++)-1===e.indexOf(t[n])&&e.push(t[n]);return e}(r):r}function wr(t,e,n,r){var o=Object.create(t||null);return e?A(o,e):o}yr.data=function(t,e,n){return n?br(t,e,n):e&&\"function\"!=typeof e?t:br(t,e)},H.forEach((function(t){yr[t]=$r})),F.forEach((function(t){yr[t+\"s\"]=wr})),yr.watch=function(t,n,r,o){if(t===et&&(t=void 0),n===et&&(n=void 0),!n)return Object.create(t||null);if(!t)return n;var i={};for(var a in A(i,t),n){var s=i[a],c=n[a];s&&!e(s)&&(s=[s]),i[a]=s?s.concat(c):e(c)?c:[c]}return i},yr.props=yr.methods=yr.inject=yr.computed=function(t,e,n,r){if(!t)return e;var o=Object.create(null);return A(o,t),e&&A(o,e),o},yr.provide=function(t,e){return t?function(){var n=Object.create(null);return _r(n,a(t)?t.call(this):t),e&&_r(n,a(e)?e.call(this):e,!1),n}:e};var xr=function(t,e){return void 0===e?t:e};function Cr(t,n,r){if(a(n)&&(n=n.options),function(t,n){var r=t.props;if(r){var o,i,a={};if(e(r))for(o=r.length;o--;)\"string\"==typeof(i=r[o])&&(a[x(i)]={type:null});else if(u(r))for(var s in r)i=r[s],a[x(s)]=u(i)?i:{type:i};t.props=a}}(n),function(t,n){var r=t.inject;if(r){var o=t.inject={};if(e(r))for(var i=0;i<r.length;i++)o[r[i]]={from:r[i]};else if(u(r))for(var a in r){var s=r[a];o[a]=u(s)?A({from:a},s):{from:s}}}}(n),function(t){var e=t.directives;if(e)for(var n in e){var r=e[n];a(r)&&(e[n]={bind:r,update:r})}}(n),!n._base&&(n.extends&&(t=Cr(t,n.extends,r)),n.mixins))for(var o=0,i=n.mixins.length;o<i;o++)t=Cr(t,n.mixins[o],r);var s,c={};for(s in t)l(s);for(s in n)b(t,s)||l(s);function l(e){var o=yr[e]||xr;c[e]=o(t[e],n[e],r,e)}return c}function kr(t,e,n,r){if(\"string\"==typeof n){var o=t[e];if(b(o,n))return o[n];var i=x(n);if(b(o,i))return o[i];var a=C(i);return b(o,a)?o[a]:o[n]||o[i]||o[a]}}function Sr(t,e,n,r){var o=e[t],i=!b(n,t),s=n[t],c=jr(Boolean,o.type);if(c>-1)if(i&&!b(o,\"default\"))s=!1;else if(\"\"===s||s===S(t)){var u=jr(String,o.type);(u<0||c<u)&&(s=!0)}if(void 0===s){s=function(t,e,n){if(!b(e,\"default\"))return;var r=e.default;if(t&&t.$options.propsData&&void 0===t.$options.propsData[n]&&void 0!==t._props[n])return t._props[n];return a(r)&&\"Function\"!==Tr(e.type)?r.call(t):r}(r,o,t);var l=St;Ot(!0),jt(s),Ot(l)}return s}var Or=/^\\s*function (\\w+)/;function Tr(t){var e=t&&t.toString().match(Or);return e?e[1]:\"\"}function Ar(t,e){return Tr(t)===Tr(e)}function jr(t,n){if(!e(n))return Ar(n,t)?0:-1;for(var r=0,o=n.length;r<o;r++)if(Ar(n[r],t))return r;return-1}function Er(t){this._init(t)}function Nr(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r=n.cid,o=t._Ctor||(t._Ctor={});if(o[r])return o[r];var i=dr(t)||dr(n.options),a=function(t){this._init(t)};return(a.prototype=Object.create(n.prototype)).constructor=a,a.cid=e++,a.options=Cr(n.options,t),a.super=n,a.options.props&&function(t){var e=t.options.props;for(var n in e)Qn(t.prototype,\"_props\",n)}(a),a.options.computed&&function(t){var e=t.options.computed;for(var n in e)nr(t.prototype,n,e[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,F.forEach((function(t){a[t]=n[t]})),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=t,a.sealedOptions=A({},a.options),o[r]=a,a}}function Pr(t){return t&&(dr(t.Ctor.options)||t.tag)}function Dr(t,n){return e(t)?t.indexOf(n)>-1:\"string\"==typeof t?t.split(\",\").indexOf(n)>-1:(r=t,\"[object RegExp]\"===c.call(r)&&t.test(n));var r}function Mr(t,e){var n=t.cache,r=t.keys,o=t._vnode,i=t.$vnode;for(var a in n){var s=n[a];if(s){var c=s.name;c&&!e(c)&&Ir(n,a,r,o)}}i.componentOptions.children=void 0}function Ir(t,e,n,r){var o=t[e];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),t[e]=null,y(n,e)}!function(e){e.prototype._init=function(e){var n=this;n._uid=sr++,n._isVue=!0,n.__v_skip=!0,n._scope=new ze(!0),n._scope.parent=void 0,n._scope._vm=!0,e&&e._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(n,e):n.$options=Cr(cr(n.constructor),e||{},n),n._renderProxy=n,n._self=n,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(n),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ue(t,e)}(n),function(e){e._vnode=null,e._staticTrees=null;var n=e.$options,r=e.$vnode=n._parentVnode,o=r&&r.context;e.$slots=xe(n._renderChildren,o),e.$scopedSlots=r?Se(e.$parent,r.data.scopedSlots,e.$slots):t,e._c=function(t,n,r,o){return ae(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return ae(e,t,n,r,o,!0)};var i=r&&r.data;Et(e,\"$attrs\",i&&i.attrs||t,null,!0),Et(e,\"$listeners\",n._parentListeners||t,null,!0)}(n),Ge(n,\"beforeCreate\",void 0,!1),function(t){var e=ar(t.$options.inject,t);e&&(Ot(!1),Object.keys(e).forEach((function(n){Et(t,n,e[n])})),Ot(!0))}(n),tr(n),function(t){var e=t.$options.provide;if(e){var n=a(e)?e.call(t):e;if(!s(n))return;for(var r=gn(t),o=ct?Reflect.ownKeys(n):Object.keys(n),i=0;i<o.length;i++){var c=o[i];Object.defineProperty(r,c,Object.getOwnPropertyDescriptor(n,c))}}}(n),Ge(n,\"created\"),n.$options.el&&n.$mount(n.$options.el)}}(Er),function(t){var e={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(t.prototype,\"$data\",e),Object.defineProperty(t.prototype,\"$props\",n),t.prototype.$set=Nt,t.prototype.$delete=Pt,t.prototype.$watch=function(t,e,n){var r=this;if(u(e))return ir(r,t,e,n);(n=n||{}).user=!0;var o=new Xn(r,t,e,n);if(n.immediate){var i='callback for immediate watcher \"'.concat(o.expression,'\"');bt(),_n(e,r,[o.value],r,i),$t()}return function(){o.teardown()}}}(Er),function(t){var n=/^hook:/;t.prototype.$on=function(t,r){var o=this;if(e(t))for(var i=0,a=t.length;i<a;i++)o.$on(t[i],r);else(o._events[t]||(o._events[t]=[])).push(r),n.test(t)&&(o._hasHookEvent=!0);return o},t.prototype.$once=function(t,e){var n=this;function r(){n.$off(t,r),e.apply(n,arguments)}return r.fn=e,n.$on(t,r),n},t.prototype.$off=function(t,n){var r=this;if(!arguments.length)return r._events=Object.create(null),r;if(e(t)){for(var o=0,i=t.length;o<i;o++)r.$off(t[o],n);return r}var a,s=r._events[t];if(!s)return r;if(!n)return r._events[t]=null,r;for(var c=s.length;c--;)if((a=s[c])===n||a.fn===n){s.splice(c,1);break}return r},t.prototype.$emit=function(t){var e=this,n=e._events[t];if(n){n=n.length>1?T(n):n;for(var r=T(arguments,1),o='event handler for \"'.concat(t,'\"'),i=0,a=n.length;i<a;i++)_n(n[i],e,r,e,o)}return e}}(Er),function(t){t.prototype._update=function(t,e){var n=this,r=n.$el,o=n._vnode,i=Je(n);n._vnode=t,n.$el=o?n.__patch__(o,t):n.__patch__(n.$el,t,e,!1),i(),r&&(r.__vue__=null),n.$el&&(n.$el.__vue__=n);for(var a=n;a&&a.$vnode&&a.$parent&&a.$vnode===a.$parent._vnode;)a.$parent.$el=a.$el,a=a.$parent},t.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},t.prototype.$destroy=function(){var t=this;if(!t._isBeingDestroyed){Ge(t,\"beforeDestroy\"),t._isBeingDestroyed=!0;var e=t.$parent;!e||e._isBeingDestroyed||t.$options.abstract||y(e.$children,t),t._scope.stop(),t._data.__ob__&&t._data.__ob__.vmCount--,t._isDestroyed=!0,t.__patch__(t._vnode,null),Ge(t,\"destroyed\"),t.$off(),t.$el&&(t.$el.__vue__=null),t.$vnode&&(t.$vnode.parent=null)}}}(Er),function(t){we(t.prototype),t.prototype.$nextTick=function(t){return En(t,this)},t.prototype._render=function(){var t=this,n=t.$options,r=n.render,o=n._parentVnode;o&&t._isMounted&&(t.$scopedSlots=Se(t.$parent,o.data.scopedSlots,t.$slots,t.$scopedSlots),t._slotsProxy&&Ne(t._slotsProxy,t.$scopedSlots)),t.$vnode=o;var i,a=ut,s=Ie;try{lt(t),Ie=t,i=r.call(t._renderProxy,t.$createElement)}catch(e){yn(e,t,\"render\"),i=t._vnode}finally{Ie=s,lt(a)}return e(i)&&1===i.length&&(i=i[0]),i instanceof ft||(i=dt()),i.parent=o,i}}(Er);var Lr=[String,RegExp,Array],Rr={name:\"keep-alive\",abstract:!0,props:{include:Lr,exclude:Lr,max:[String,Number]},methods:{cacheVNode:function(){var t=this,e=t.cache,n=t.keys,r=t.vnodeToCache,o=t.keyToCache;if(r){var i=r.tag,a=r.componentInstance,s=r.componentOptions;e[o]={name:Pr(s),tag:i,componentInstance:a},n.push(o),this.max&&n.length>parseInt(this.max)&&Ir(e,n[0],n,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)Ir(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch(\"include\",(function(e){Mr(t,(function(t){return Dr(e,t)}))})),this.$watch(\"exclude\",(function(e){Mr(t,(function(t){return!Dr(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Re(t),n=e&&e.componentOptions;if(n){var r=Pr(n),o=this.include,i=this.exclude;if(o&&(!r||!Dr(o,r))||i&&r&&Dr(i,r))return e;var a=this.cache,s=this.keys,c=null==e.key?n.Ctor.cid+(n.tag?\"::\".concat(n.tag):\"\"):e.key;a[c]?(e.componentInstance=a[c].componentInstance,y(s,c),s.push(c)):(this.vnodeToCache=e,this.keyToCache=c),e.data.keepAlive=!0}return e||t&&t[0]}},Fr={KeepAlive:Rr};!function(t){var e={get:function(){return B}};Object.defineProperty(t,\"config\",e),t.util={warn:gr,extend:A,mergeOptions:Cr,defineReactive:Et},t.set=Nt,t.delete=Pt,t.nextTick=En,t.observable=function(t){return jt(t),t},t.options=Object.create(null),F.forEach((function(e){t.options[e+\"s\"]=Object.create(null)})),t.options._base=t,A(t.options.components,Fr),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=T(arguments,1);return n.unshift(this),a(t.install)?t.install.apply(t,n):a(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Cr(this.options,t),this}}(t),Nr(t),function(t){F.forEach((function(e){t[e]=function(t,n){return n?(\"component\"===e&&u(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),\"directive\"===e&&a(n)&&(n={bind:n,update:n}),this.options[e+\"s\"][t]=n,n):this.options[e+\"s\"][t]}}))}(t)}(Er),Object.defineProperty(Er.prototype,\"$isServer\",{get:ot}),Object.defineProperty(Er.prototype,\"$ssrContext\",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(Er,\"FunctionalRenderContext\",{value:ur}),Er.version=Kn;var Hr=h(\"style,class\"),Br=h(\"input,textarea,option,select,progress\"),Ur=function(t,e,n){return\"value\"===n&&Br(t)&&\"button\"!==e||\"selected\"===n&&\"option\"===t||\"checked\"===n&&\"input\"===t||\"muted\"===n&&\"video\"===t},zr=h(\"contenteditable,draggable,spellcheck\"),Vr=h(\"events,caret,typing,plaintext-only\"),Kr=function(t,e){return Gr(e)||\"false\"===e?\"false\":\"contenteditable\"===t&&Vr(e)?e:\"true\"},Jr=h(\"allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible\"),qr=\"http://www.w3.org/1999/xlink\",Wr=function(t){return\":\"===t.charAt(5)&&\"xlink\"===t.slice(0,5)},Zr=function(t){return Wr(t)?t.slice(6,t.length):\"\"},Gr=function(t){return null==t||!1===t};function Xr(t){for(var e=t.data,n=t,o=t;r(o.componentInstance);)(o=o.componentInstance._vnode)&&o.data&&(e=Yr(o.data,e));for(;r(n=n.parent);)n&&n.data&&(e=Yr(e,n.data));return function(t,e){if(r(t)||r(e))return Qr(t,to(e));return\"\"}(e.staticClass,e.class)}function Yr(t,e){return{staticClass:Qr(t.staticClass,e.staticClass),class:r(t.class)?[t.class,e.class]:e.class}}function Qr(t,e){return t?e?t+\" \"+e:t:e||\"\"}function to(t){return Array.isArray(t)?function(t){for(var e,n=\"\",o=0,i=t.length;o<i;o++)r(e=to(t[o]))&&\"\"!==e&&(n&&(n+=\" \"),n+=e);return n}(t):s(t)?function(t){var e=\"\";for(var n in t)t[n]&&(e&&(e+=\" \"),e+=n);return e}(t):\"string\"==typeof t?t:\"\"}var eo={svg:\"http://www.w3.org/2000/svg\",math:\"http://www.w3.org/1998/Math/MathML\"},no=h(\"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot\"),ro=h(\"svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignobject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view\",!0),oo=function(t){return no(t)||ro(t)};function io(t){return ro(t)?\"svg\":\"math\"===t?\"math\":void 0}var ao=Object.create(null);var so=h(\"text,number,password,search,email,tel,url\");function co(t){if(\"string\"==typeof t){var e=document.querySelector(t);return e||document.createElement(\"div\")}return t}var uo=Object.freeze({__proto__:null,createElement:function(t,e){var n=document.createElement(t);return\"select\"!==t||e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute(\"multiple\",\"multiple\"),n},createElementNS:function(t,e){return document.createElementNS(eo[t],e)},createTextNode:function(t){return document.createTextNode(t)},createComment:function(t){return document.createComment(t)},insertBefore:function(t,e,n){t.insertBefore(e,n)},removeChild:function(t,e){t.removeChild(e)},appendChild:function(t,e){t.appendChild(e)},parentNode:function(t){return t.parentNode},nextSibling:function(t){return t.nextSibling},tagName:function(t){return t.tagName},setTextContent:function(t,e){t.textContent=e},setStyleScope:function(t,e){t.setAttribute(e,\"\")}}),lo={create:function(t,e){fo(e)},update:function(t,e){t.data.ref!==e.data.ref&&(fo(t,!0),fo(e))},destroy:function(t){fo(t,!0)}};function fo(t,n){var o=t.data.ref;if(r(o)){var i=t.context,s=t.componentInstance||t.elm,c=n?null:s,u=n?void 0:s;if(a(o))_n(o,i,[c],i,\"template ref function\");else{var l=t.data.refInFor,f=\"string\"==typeof o||\"number\"==typeof o,d=Bt(o),p=i.$refs;if(f||d)if(l){var v=f?p[o]:o.value;n?e(v)&&y(v,s):e(v)?v.includes(s)||v.push(s):f?(p[o]=[s],po(i,o,p[o])):o.value=[s]}else if(f){if(n&&p[o]!==s)return;p[o]=u,po(i,o,c)}else if(d){if(n&&o.value!==s)return;o.value=c}}}}function po(t,e,n){var r=t._setupState;r&&b(r,e)&&(Bt(r[e])?r[e].value=n:r[e]=n)}var vo=new ft(\"\",{},[]),ho=[\"create\",\"activate\",\"update\",\"remove\",\"destroy\"];function mo(t,e){return t.key===e.key&&t.asyncFactory===e.asyncFactory&&(t.tag===e.tag&&t.isComment===e.isComment&&r(t.data)===r(e.data)&&function(t,e){if(\"input\"!==t.tag)return!0;var n,o=r(n=t.data)&&r(n=n.attrs)&&n.type,i=r(n=e.data)&&r(n=n.attrs)&&n.type;return o===i||so(o)&&so(i)}(t,e)||o(t.isAsyncPlaceholder)&&n(e.asyncFactory.error))}function go(t,e,n){var o,i,a={};for(o=e;o<=n;++o)r(i=t[o].key)&&(a[i]=o);return a}var yo={create:_o,update:_o,destroy:function(t){_o(t,vo)}};function _o(t,e){(t.data.directives||e.data.directives)&&function(t,e){var n,r,o,i=t===vo,a=e===vo,s=$o(t.data.directives,t.context),c=$o(e.data.directives,e.context),u=[],l=[];for(n in c)r=s[n],o=c[n],r?(o.oldValue=r.value,o.oldArg=r.arg,xo(o,\"update\",e,t),o.def&&o.def.componentUpdated&&l.push(o)):(xo(o,\"bind\",e,t),o.def&&o.def.inserted&&u.push(o));if(u.length){var f=function(){for(var n=0;n<u.length;n++)xo(u[n],\"inserted\",e,t)};i?Qt(e,\"insert\",f):f()}l.length&&Qt(e,\"postpatch\",(function(){for(var n=0;n<l.length;n++)xo(l[n],\"componentUpdated\",e,t)}));if(!i)for(n in s)c[n]||xo(s[n],\"unbind\",t,t,a)}(t,e)}var bo=Object.create(null);function $o(t,e){var n,r,o=Object.create(null);if(!t)return o;for(n=0;n<t.length;n++){if((r=t[n]).modifiers||(r.modifiers=bo),o[wo(r)]=r,e._setupState&&e._setupState.__sfc){var i=r.def||kr(e,\"_setupState\",\"v-\"+r.name);r.def=\"function\"==typeof i?{bind:i,update:i}:i}r.def=r.def||kr(e.$options,\"directives\",r.name)}return o}function wo(t){return t.rawName||\"\".concat(t.name,\".\").concat(Object.keys(t.modifiers||{}).join(\".\"))}function xo(t,e,n,r,o){var i=t.def&&t.def[e];if(i)try{i(n.elm,t,n,r,o)}catch(r){yn(r,n.context,\"directive \".concat(t.name,\" \").concat(e,\" hook\"))}}var Co=[lo,yo];function ko(t,e){var i=e.componentOptions;if(!(r(i)&&!1===i.Ctor.options.inheritAttrs||n(t.data.attrs)&&n(e.data.attrs))){var a,s,c=e.elm,u=t.data.attrs||{},l=e.data.attrs||{};for(a in(r(l.__ob__)||o(l._v_attr_proxy))&&(l=e.data.attrs=A({},l)),l)s=l[a],u[a]!==s&&So(c,a,s,e.data.pre);for(a in(Z||X)&&l.value!==u.value&&So(c,\"value\",l.value),u)n(l[a])&&(Wr(a)?c.removeAttributeNS(qr,Zr(a)):zr(a)||c.removeAttribute(a))}}function So(t,e,n,r){r||t.tagName.indexOf(\"-\")>-1?Oo(t,e,n):Jr(e)?Gr(n)?t.removeAttribute(e):(n=\"allowfullscreen\"===e&&\"EMBED\"===t.tagName?\"true\":e,t.setAttribute(e,n)):zr(e)?t.setAttribute(e,Kr(e,n)):Wr(e)?Gr(n)?t.removeAttributeNS(qr,Zr(e)):t.setAttributeNS(qr,e,n):Oo(t,e,n)}function Oo(t,e,n){if(Gr(n))t.removeAttribute(e);else{if(Z&&!G&&\"TEXTAREA\"===t.tagName&&\"placeholder\"===e&&\"\"!==n&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener(\"input\",r)};t.addEventListener(\"input\",r),t.__ieph=!0}t.setAttribute(e,n)}}var To={create:ko,update:ko};function Ao(t,e){var o=e.elm,i=e.data,a=t.data;if(!(n(i.staticClass)&&n(i.class)&&(n(a)||n(a.staticClass)&&n(a.class)))){var s=Xr(e),c=o._transitionClasses;r(c)&&(s=Qr(s,to(c))),s!==o._prevClass&&(o.setAttribute(\"class\",s),o._prevClass=s)}}var jo,Eo,No,Po,Do,Mo,Io={create:Ao,update:Ao},Lo=/[\\w).+\\-_$\\]]/;function Ro(t){var e,n,r,o,i,a=!1,s=!1,c=!1,u=!1,l=0,f=0,d=0,p=0;for(r=0;r<t.length;r++)if(n=e,e=t.charCodeAt(r),a)39===e&&92!==n&&(a=!1);else if(s)34===e&&92!==n&&(s=!1);else if(c)96===e&&92!==n&&(c=!1);else if(u)47===e&&92!==n&&(u=!1);else if(124!==e||124===t.charCodeAt(r+1)||124===t.charCodeAt(r-1)||l||f||d){switch(e){case 34:s=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:d++;break;case 41:d--;break;case 91:f++;break;case 93:f--;break;case 123:l++;break;case 125:l--}if(47===e){for(var v=r-1,h=void 0;v>=0&&\" \"===(h=t.charAt(v));v--);h&&Lo.test(h)||(u=!0)}}else void 0===o?(p=r+1,o=t.slice(0,r).trim()):m();function m(){(i||(i=[])).push(t.slice(p,r).trim()),p=r+1}if(void 0===o?o=t.slice(0,r).trim():0!==p&&m(),i)for(r=0;r<i.length;r++)o=Fo(o,i[r]);return o}function Fo(t,e){var n=e.indexOf(\"(\");if(n<0)return'_f(\"'.concat(e,'\")(').concat(t,\")\");var r=e.slice(0,n),o=e.slice(n+1);return'_f(\"'.concat(r,'\")(').concat(t).concat(\")\"!==o?\",\"+o:o)}function Ho(t,e){console.error(\"[Vue compiler]: \".concat(t))}function Bo(t,e){return t?t.map((function(t){return t[e]})).filter((function(t){return t})):[]}function Uo(t,e,n,r,o){(t.props||(t.props=[])).push(Xo({name:e,value:n,dynamic:o},r)),t.plain=!1}function zo(t,e,n,r,o){(o?t.dynamicAttrs||(t.dynamicAttrs=[]):t.attrs||(t.attrs=[])).push(Xo({name:e,value:n,dynamic:o},r)),t.plain=!1}function Vo(t,e,n,r){t.attrsMap[e]=n,t.attrsList.push(Xo({name:e,value:n},r))}function Ko(t,e,n,r,o,i,a,s){(t.directives||(t.directives=[])).push(Xo({name:e,rawName:n,value:r,arg:o,isDynamicArg:i,modifiers:a},s)),t.plain=!1}function Jo(t,e,n){return n?\"_p(\".concat(e,',\"').concat(t,'\")'):t+e}function qo(e,n,r,o,i,a,s,c){var u;(o=o||t).right?c?n=\"(\".concat(n,\")==='click'?'contextmenu':(\").concat(n,\")\"):\"click\"===n&&(n=\"contextmenu\",delete o.right):o.middle&&(c?n=\"(\".concat(n,\")==='click'?'mouseup':(\").concat(n,\")\"):\"click\"===n&&(n=\"mouseup\")),o.capture&&(delete o.capture,n=Jo(\"!\",n,c)),o.once&&(delete o.once,n=Jo(\"~\",n,c)),o.passive&&(delete o.passive,n=Jo(\"&\",n,c)),o.native?(delete o.native,u=e.nativeEvents||(e.nativeEvents={})):u=e.events||(e.events={});var l=Xo({value:r.trim(),dynamic:c},s);o!==t&&(l.modifiers=o);var f=u[n];Array.isArray(f)?i?f.unshift(l):f.push(l):u[n]=f?i?[l,f]:[f,l]:l,e.plain=!1}function Wo(t,e,n){var r=Zo(t,\":\"+e)||Zo(t,\"v-bind:\"+e);if(null!=r)return Ro(r);if(!1!==n){var o=Zo(t,e);if(null!=o)return JSON.stringify(o)}}function Zo(t,e,n){var r;if(null!=(r=t.attrsMap[e]))for(var o=t.attrsList,i=0,a=o.length;i<a;i++)if(o[i].name===e){o.splice(i,1);break}return n&&delete t.attrsMap[e],r}function Go(t,e){for(var n=t.attrsList,r=0,o=n.length;r<o;r++){var i=n[r];if(e.test(i.name))return n.splice(r,1),i}}function Xo(t,e){return e&&(null!=e.start&&(t.start=e.start),null!=e.end&&(t.end=e.end)),t}function Yo(t,e,n){var r=n||{},o=r.number,i=\"$$v\",a=i;r.trim&&(a=\"(typeof \".concat(i,\" === 'string'\")+\"? \".concat(i,\".trim()\")+\": \".concat(i,\")\")),o&&(a=\"_n(\".concat(a,\")\"));var s=Qo(e,a);t.model={value:\"(\".concat(e,\")\"),expression:JSON.stringify(e),callback:\"function (\".concat(i,\") {\").concat(s,\"}\")}}function Qo(t,e){var n=function(t){if(t=t.trim(),jo=t.length,t.indexOf(\"[\")<0||t.lastIndexOf(\"]\")<jo-1)return(Po=t.lastIndexOf(\".\"))>-1?{exp:t.slice(0,Po),key:'\"'+t.slice(Po+1)+'\"'}:{exp:t,key:null};Eo=t,Po=Do=Mo=0;for(;!ei();)ni(No=ti())?oi(No):91===No&&ri(No);return{exp:t.slice(0,Do),key:t.slice(Do+1,Mo)}}(t);return null===n.key?\"\".concat(t,\"=\").concat(e):\"$set(\".concat(n.exp,\", \").concat(n.key,\", \").concat(e,\")\")}function ti(){return Eo.charCodeAt(++Po)}function ei(){return Po>=jo}function ni(t){return 34===t||39===t}function ri(t){var e=1;for(Do=Po;!ei();)if(ni(t=ti()))oi(t);else if(91===t&&e++,93===t&&e--,0===e){Mo=Po;break}}function oi(t){for(var e=t;!ei()&&(t=ti())!==e;);}var ii,ai=\"__r\",si=\"__c\";function ci(t,e,n){var r=ii;return function o(){null!==e.apply(null,arguments)&&fi(t,o,n,r)}}var ui=xn&&!(tt&&Number(tt[1])<=53);function li(t,e,n,r){if(ui){var o=rn,i=e;e=i._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=o||t.timeStamp<=0||t.target.ownerDocument!==document)return i.apply(this,arguments)}}ii.addEventListener(t,e,nt?{capture:n,passive:r}:n)}function fi(t,e,n,r){(r||ii).removeEventListener(t,e._wrapper||e,n)}function di(t,e){if(!n(t.data.on)||!n(e.data.on)){var o=e.data.on||{},i=t.data.on||{};ii=e.elm||t.elm,function(t){if(r(t[ai])){var e=Z?\"change\":\"input\";t[e]=[].concat(t[ai],t[e]||[]),delete t[ai]}r(t[si])&&(t.change=[].concat(t[si],t.change||[]),delete t[si])}(o),Yt(o,i,li,fi,ci,e.context),ii=void 0}}var pi,vi={create:di,update:di,destroy:function(t){return di(t,vo)}};function hi(t,e){if(!n(t.data.domProps)||!n(e.data.domProps)){var i,a,s=e.elm,c=t.data.domProps||{},u=e.data.domProps||{};for(i in(r(u.__ob__)||o(u._v_attr_proxy))&&(u=e.data.domProps=A({},u)),c)i in u||(s[i]=\"\");for(i in u){if(a=u[i],\"textContent\"===i||\"innerHTML\"===i){if(e.children&&(e.children.length=0),a===c[i])continue;1===s.childNodes.length&&s.removeChild(s.childNodes[0])}if(\"value\"===i&&\"PROGRESS\"!==s.tagName){s._value=a;var l=n(a)?\"\":String(a);mi(s,l)&&(s.value=l)}else if(\"innerHTML\"===i&&ro(s.tagName)&&n(s.innerHTML)){(pi=pi||document.createElement(\"div\")).innerHTML=\"<svg>\".concat(a,\"</svg>\");for(var f=pi.firstChild;s.firstChild;)s.removeChild(s.firstChild);for(;f.firstChild;)s.appendChild(f.firstChild)}else if(a!==c[i])try{s[i]=a}catch(t){}}}}function mi(t,e){return!t.composing&&(\"OPTION\"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,o=t._vModifiers;if(r(o)){if(o.number)return v(n)!==v(e);if(o.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var gi={create:hi,update:hi},yi=$((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\\))/g).forEach((function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}})),e}));function _i(t){var e=bi(t.style);return t.staticStyle?A(t.staticStyle,e):e}function bi(t){return Array.isArray(t)?j(t):\"string\"==typeof t?yi(t):t}var $i,wi=/^--/,xi=/\\s*!important$/,Ci=function(t,e,n){if(wi.test(e))t.style.setProperty(e,n);else if(xi.test(n))t.style.setProperty(S(e),n.replace(xi,\"\"),\"important\");else{var r=Si(e);if(Array.isArray(n))for(var o=0,i=n.length;o<i;o++)t.style[r]=n[o];else t.style[r]=n}},ki=[\"Webkit\",\"Moz\",\"ms\"],Si=$((function(t){if($i=$i||document.createElement(\"div\").style,\"filter\"!==(t=x(t))&&t in $i)return t;for(var e=t.charAt(0).toUpperCase()+t.slice(1),n=0;n<ki.length;n++){var r=ki[n]+e;if(r in $i)return r}}));function Oi(t,e){var o=e.data,i=t.data;if(!(n(o.staticStyle)&&n(o.style)&&n(i.staticStyle)&&n(i.style))){var a,s,c=e.elm,u=i.staticStyle,l=i.normalizedStyle||i.style||{},f=u||l,d=bi(e.data.style)||{};e.data.normalizedStyle=r(d.__ob__)?A({},d):d;var p=function(t,e){var n,r={};if(e)for(var o=t;o.componentInstance;)(o=o.componentInstance._vnode)&&o.data&&(n=_i(o.data))&&A(r,n);(n=_i(t.data))&&A(r,n);for(var i=t;i=i.parent;)i.data&&(n=_i(i.data))&&A(r,n);return r}(e,!0);for(s in f)n(p[s])&&Ci(c,s,\"\");for(s in p)a=p[s],Ci(c,s,null==a?\"\":a)}}var Ti={create:Oi,update:Oi},Ai=/\\s+/;function ji(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(\" \")>-1?e.split(Ai).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=\" \".concat(t.getAttribute(\"class\")||\"\",\" \");n.indexOf(\" \"+e+\" \")<0&&t.setAttribute(\"class\",(n+e).trim())}}function Ei(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(\" \")>-1?e.split(Ai).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute(\"class\");else{for(var n=\" \".concat(t.getAttribute(\"class\")||\"\",\" \"),r=\" \"+e+\" \";n.indexOf(r)>=0;)n=n.replace(r,\" \");(n=n.trim())?t.setAttribute(\"class\",n):t.removeAttribute(\"class\")}}function Ni(t){if(t){if(\"object\"==typeof t){var e={};return!1!==t.css&&A(e,Pi(t.name||\"v\")),A(e,t),e}return\"string\"==typeof t?Pi(t):void 0}}var Pi=$((function(t){return{enterClass:\"\".concat(t,\"-enter\"),enterToClass:\"\".concat(t,\"-enter-to\"),enterActiveClass:\"\".concat(t,\"-enter-active\"),leaveClass:\"\".concat(t,\"-leave\"),leaveToClass:\"\".concat(t,\"-leave-to\"),leaveActiveClass:\"\".concat(t,\"-leave-active\")}})),Di=q&&!G,Mi=\"transition\",Ii=\"animation\",Li=\"transition\",Ri=\"transitionend\",Fi=\"animation\",Hi=\"animationend\";Di&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Li=\"WebkitTransition\",Ri=\"webkitTransitionEnd\"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Fi=\"WebkitAnimation\",Hi=\"webkitAnimationEnd\"));var Bi=q?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function Ui(t){Bi((function(){Bi(t)}))}function zi(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),ji(t,e))}function Vi(t,e){t._transitionClasses&&y(t._transitionClasses,e),Ei(t,e)}function Ki(t,e,n){var r=qi(t,e),o=r.type,i=r.timeout,a=r.propCount;if(!o)return n();var s=o===Mi?Ri:Hi,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout((function(){c<a&&u()}),i+1),t.addEventListener(s,l)}var Ji=/\\b(transform|all)(,|$)/;function qi(t,e){var n,r=window.getComputedStyle(t),o=(r[Li+\"Delay\"]||\"\").split(\", \"),i=(r[Li+\"Duration\"]||\"\").split(\", \"),a=Wi(o,i),s=(r[Fi+\"Delay\"]||\"\").split(\", \"),c=(r[Fi+\"Duration\"]||\"\").split(\", \"),u=Wi(s,c),l=0,f=0;return e===Mi?a>0&&(n=Mi,l=a,f=i.length):e===Ii?u>0&&(n=Ii,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Mi:Ii:null)?n===Mi?i.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Mi&&Ji.test(r[Li+\"Property\"])}}function Wi(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max.apply(null,e.map((function(e,n){return Zi(e)+Zi(t[n])})))}function Zi(t){return 1e3*Number(t.slice(0,-1).replace(\",\",\".\"))}function Gi(t,e){var o=t.elm;r(o._leaveCb)&&(o._leaveCb.cancelled=!0,o._leaveCb());var i=Ni(t.data.transition);if(!n(i)&&!r(o._enterCb)&&1===o.nodeType){for(var c=i.css,u=i.type,l=i.enterClass,f=i.enterToClass,d=i.enterActiveClass,p=i.appearClass,h=i.appearToClass,m=i.appearActiveClass,g=i.beforeEnter,y=i.enter,_=i.afterEnter,b=i.enterCancelled,$=i.beforeAppear,w=i.appear,x=i.afterAppear,C=i.appearCancelled,k=i.duration,S=Ke,O=Ke.$vnode;O&&O.parent;)S=O.context,O=O.parent;var T=!S._isMounted||!t.isRootInsert;if(!T||w||\"\"===w){var A=T&&p?p:l,j=T&&m?m:d,E=T&&h?h:f,N=T&&$||g,P=T&&a(w)?w:y,D=T&&x||_,M=T&&C||b,L=v(s(k)?k.enter:k),R=!1!==c&&!G,F=Qi(P),H=o._enterCb=I((function(){R&&(Vi(o,E),Vi(o,j)),H.cancelled?(R&&Vi(o,A),M&&M(o)):D&&D(o),o._enterCb=null}));t.data.show||Qt(t,\"insert\",(function(){var e=o.parentNode,n=e&&e._pending&&e._pending[t.key];n&&n.tag===t.tag&&n.elm._leaveCb&&n.elm._leaveCb(),P&&P(o,H)})),N&&N(o),R&&(zi(o,A),zi(o,j),Ui((function(){Vi(o,A),H.cancelled||(zi(o,E),F||(Yi(L)?setTimeout(H,L):Ki(o,u,H)))}))),t.data.show&&(e&&e(),P&&P(o,H)),R||F||H()}}}function Xi(t,e){var o=t.elm;r(o._enterCb)&&(o._enterCb.cancelled=!0,o._enterCb());var i=Ni(t.data.transition);if(n(i)||1!==o.nodeType)return e();if(!r(o._leaveCb)){var a=i.css,c=i.type,u=i.leaveClass,l=i.leaveToClass,f=i.leaveActiveClass,d=i.beforeLeave,p=i.leave,h=i.afterLeave,m=i.leaveCancelled,g=i.delayLeave,y=i.duration,_=!1!==a&&!G,b=Qi(p),$=v(s(y)?y.leave:y),w=o._leaveCb=I((function(){o.parentNode&&o.parentNode._pending&&(o.parentNode._pending[t.key]=null),_&&(Vi(o,l),Vi(o,f)),w.cancelled?(_&&Vi(o,u),m&&m(o)):(e(),h&&h(o)),o._leaveCb=null}));g?g(x):x()}function x(){w.cancelled||(!t.data.show&&o.parentNode&&((o.parentNode._pending||(o.parentNode._pending={}))[t.key]=t),d&&d(o),_&&(zi(o,u),zi(o,f),Ui((function(){Vi(o,u),w.cancelled||(zi(o,l),b||(Yi($)?setTimeout(w,$):Ki(o,c,w)))}))),p&&p(o,w),_||b||w())}}function Yi(t){return\"number\"==typeof t&&!isNaN(t)}function Qi(t){if(n(t))return!1;var e=t.fns;return r(e)?Qi(Array.isArray(e)?e[0]:e):(t._length||t.length)>1}function ta(t,e){!0!==e.data.show&&Gi(e)}var ea=function(t){var a,s,c={},u=t.modules,l=t.nodeOps;for(a=0;a<ho.length;++a)for(c[ho[a]]=[],s=0;s<u.length;++s)r(u[s][ho[a]])&&c[ho[a]].push(u[s][ho[a]]);function f(t){var e=l.parentNode(t);r(e)&&l.removeChild(e,t)}function d(t,e,n,i,a,s,u){if(r(t.elm)&&r(s)&&(t=s[u]=vt(t)),t.isRootInsert=!a,!function(t,e,n,i){var a=t.data;if(r(a)){var s=r(t.componentInstance)&&a.keepAlive;if(r(a=a.hook)&&r(a=a.init)&&a(t,!1),r(t.componentInstance))return p(t,e),v(n,t.elm,i),o(s)&&function(t,e,n,o){var i,a=t;for(;a.componentInstance;)if(r(i=(a=a.componentInstance._vnode).data)&&r(i=i.transition)){for(i=0;i<c.activate.length;++i)c.activate[i](vo,a);e.push(a);break}v(n,t.elm,o)}(t,e,n,i),!0}}(t,e,n,i)){var f=t.data,d=t.children,h=t.tag;r(h)?(t.elm=t.ns?l.createElementNS(t.ns,h):l.createElement(h,t),_(t),m(t,d,e),r(f)&&y(t,e),v(n,t.elm,i)):o(t.isComment)?(t.elm=l.createComment(t.text),v(n,t.elm,i)):(t.elm=l.createTextNode(t.text),v(n,t.elm,i))}}function p(t,e){r(t.data.pendingInsert)&&(e.push.apply(e,t.data.pendingInsert),t.data.pendingInsert=null),t.elm=t.componentInstance.$el,g(t)?(y(t,e),_(t)):(fo(t),e.push(t))}function v(t,e,n){r(t)&&(r(n)?l.parentNode(n)===t&&l.insertBefore(t,e,n):l.appendChild(t,e))}function m(t,n,r){if(e(n))for(var o=0;o<n.length;++o)d(n[o],r,t.elm,null,!0,n,o);else i(t.text)&&l.appendChild(t.elm,l.createTextNode(String(t.text)))}function g(t){for(;t.componentInstance;)t=t.componentInstance._vnode;return r(t.tag)}function y(t,e){for(var n=0;n<c.create.length;++n)c.create[n](vo,t);r(a=t.data.hook)&&(r(a.create)&&a.create(vo,t),r(a.insert)&&e.push(t))}function _(t){var e;if(r(e=t.fnScopeId))l.setStyleScope(t.elm,e);else for(var n=t;n;)r(e=n.context)&&r(e=e.$options._scopeId)&&l.setStyleScope(t.elm,e),n=n.parent;r(e=Ke)&&e!==t.context&&e!==t.fnContext&&r(e=e.$options._scopeId)&&l.setStyleScope(t.elm,e)}function b(t,e,n,r,o,i){for(;r<=o;++r)d(n[r],i,t,e,!1,n,r)}function $(t){var e,n,o=t.data;if(r(o))for(r(e=o.hook)&&r(e=e.destroy)&&e(t),e=0;e<c.destroy.length;++e)c.destroy[e](t);if(r(e=t.children))for(n=0;n<t.children.length;++n)$(t.children[n])}function w(t,e,n){for(;e<=n;++e){var o=t[e];r(o)&&(r(o.tag)?(x(o),$(o)):f(o.elm))}}function x(t,e){if(r(e)||r(t.data)){var n,o=c.remove.length+1;for(r(e)?e.listeners+=o:e=function(t,e){function n(){0==--n.listeners&&f(t)}return n.listeners=e,n}(t.elm,o),r(n=t.componentInstance)&&r(n=n._vnode)&&r(n.data)&&x(n,e),n=0;n<c.remove.length;++n)c.remove[n](t,e);r(n=t.data.hook)&&r(n=n.remove)?n(t,e):e()}else f(t.elm)}function C(t,e,n,o){for(var i=n;i<o;i++){var a=e[i];if(r(a)&&mo(t,a))return i}}function k(t,e,i,a,s,u){if(t!==e){r(e.elm)&&r(a)&&(e=a[s]=vt(e));var f=e.elm=t.elm;if(o(t.isAsyncPlaceholder))r(e.asyncFactory.resolved)?T(t.elm,e,i):e.isAsyncPlaceholder=!0;else if(o(e.isStatic)&&o(t.isStatic)&&e.key===t.key&&(o(e.isCloned)||o(e.isOnce)))e.componentInstance=t.componentInstance;else{var p,v=e.data;r(v)&&r(p=v.hook)&&r(p=p.prepatch)&&p(t,e);var h=t.children,m=e.children;if(r(v)&&g(e)){for(p=0;p<c.update.length;++p)c.update[p](t,e);r(p=v.hook)&&r(p=p.update)&&p(t,e)}n(e.text)?r(h)&&r(m)?h!==m&&function(t,e,o,i,a){for(var s,c,u,f=0,p=0,v=e.length-1,h=e[0],m=e[v],g=o.length-1,y=o[0],_=o[g],$=!a;f<=v&&p<=g;)n(h)?h=e[++f]:n(m)?m=e[--v]:mo(h,y)?(k(h,y,i,o,p),h=e[++f],y=o[++p]):mo(m,_)?(k(m,_,i,o,g),m=e[--v],_=o[--g]):mo(h,_)?(k(h,_,i,o,g),$&&l.insertBefore(t,h.elm,l.nextSibling(m.elm)),h=e[++f],_=o[--g]):mo(m,y)?(k(m,y,i,o,p),$&&l.insertBefore(t,m.elm,h.elm),m=e[--v],y=o[++p]):(n(s)&&(s=go(e,f,v)),n(c=r(y.key)?s[y.key]:C(y,e,f,v))?d(y,i,t,h.elm,!1,o,p):mo(u=e[c],y)?(k(u,y,i,o,p),e[c]=void 0,$&&l.insertBefore(t,u.elm,h.elm)):d(y,i,t,h.elm,!1,o,p),y=o[++p]);f>v?b(t,n(o[g+1])?null:o[g+1].elm,o,p,g,i):p>g&&w(e,f,v)}(f,h,m,i,u):r(m)?(r(t.text)&&l.setTextContent(f,\"\"),b(f,null,m,0,m.length-1,i)):r(h)?w(h,0,h.length-1):r(t.text)&&l.setTextContent(f,\"\"):t.text!==e.text&&l.setTextContent(f,e.text),r(v)&&r(p=v.hook)&&r(p=p.postpatch)&&p(t,e)}}}function S(t,e,n){if(o(n)&&r(t.parent))t.parent.data.pendingInsert=e;else for(var i=0;i<e.length;++i)e[i].data.hook.insert(e[i])}var O=h(\"attrs,class,staticClass,staticStyle,key\");function T(t,e,n,i){var a,s=e.tag,c=e.data,u=e.children;if(i=i||c&&c.pre,e.elm=t,o(e.isComment)&&r(e.asyncFactory))return e.isAsyncPlaceholder=!0,!0;if(r(c)&&(r(a=c.hook)&&r(a=a.init)&&a(e,!0),r(a=e.componentInstance)))return p(e,n),!0;if(r(s)){if(r(u))if(t.hasChildNodes())if(r(a=c)&&r(a=a.domProps)&&r(a=a.innerHTML)){if(a!==t.innerHTML)return!1}else{for(var l=!0,f=t.firstChild,d=0;d<u.length;d++){if(!f||!T(f,u[d],n,i)){l=!1;break}f=f.nextSibling}if(!l||f)return!1}else m(e,u,n);if(r(c)){var v=!1;for(var h in c)if(!O(h)){v=!0,y(e,n);break}!v&&c.class&&Wn(c.class)}}else t.data!==e.text&&(t.data=e.text);return!0}return function(t,e,i,a){if(!n(e)){var s,u=!1,f=[];if(n(t))u=!0,d(e,f);else{var p=r(t.nodeType);if(!p&&mo(t,e))k(t,e,f,null,null,a);else{if(p){if(1===t.nodeType&&t.hasAttribute(R)&&(t.removeAttribute(R),i=!0),o(i)&&T(t,e,f))return S(e,f,!0),t;s=t,t=new ft(l.tagName(s).toLowerCase(),{},[],void 0,s)}var v=t.elm,h=l.parentNode(v);if(d(e,f,v._leaveCb?null:h,l.nextSibling(v)),r(e.parent))for(var m=e.parent,y=g(e);m;){for(var _=0;_<c.destroy.length;++_)c.destroy[_](m);if(m.elm=e.elm,y){for(var b=0;b<c.create.length;++b)c.create[b](vo,m);var x=m.data.hook.insert;if(x.merged)for(var C=x.fns.slice(1),O=0;O<C.length;O++)C[O]()}else fo(m);m=m.parent}r(h)?w([t],0,0):r(t.tag)&&$(t)}}return S(e,f,u),e.elm}r(t)&&$(t)}}({nodeOps:uo,modules:[To,Io,vi,gi,Ti,q?{create:ta,activate:ta,remove:function(t,e){!0!==t.data.show?Xi(t,e):e()}}:{}].concat(Co)});G&&document.addEventListener(\"selectionchange\",(function(){var t=document.activeElement;t&&t.vmodel&&ua(t,\"input\")}));var na={inserted:function(t,e,n,r){\"select\"===n.tag?(r.elm&&!r.elm._vOptions?Qt(n,\"postpatch\",(function(){na.componentUpdated(t,e,n)})):ra(t,e,n.context),t._vOptions=[].map.call(t.options,aa)):(\"textarea\"===n.tag||so(t.type))&&(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener(\"compositionstart\",sa),t.addEventListener(\"compositionend\",ca),t.addEventListener(\"change\",ca),G&&(t.vmodel=!0)))},componentUpdated:function(t,e,n){if(\"select\"===n.tag){ra(t,e,n.context);var r=t._vOptions,o=t._vOptions=[].map.call(t.options,aa);if(o.some((function(t,e){return!D(t,r[e])})))(t.multiple?e.value.some((function(t){return ia(t,o)})):e.value!==e.oldValue&&ia(e.value,o))&&ua(t,\"change\")}}};function ra(t,e,n){oa(t,e),(Z||X)&&setTimeout((function(){oa(t,e)}),0)}function oa(t,e,n){var r=e.value,o=t.multiple;if(!o||Array.isArray(r)){for(var i,a,s=0,c=t.options.length;s<c;s++)if(a=t.options[s],o)i=M(r,aa(a))>-1,a.selected!==i&&(a.selected=i);else if(D(aa(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));o||(t.selectedIndex=-1)}}function ia(t,e){return e.every((function(e){return!D(e,t)}))}function aa(t){return\"_value\"in t?t._value:t.value}function sa(t){t.target.composing=!0}function ca(t){t.target.composing&&(t.target.composing=!1,ua(t.target,\"input\"))}function ua(t,e){var n=document.createEvent(\"HTMLEvents\");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function la(t){return!t.componentInstance||t.data&&t.data.transition?t:la(t.componentInstance._vnode)}var fa={bind:function(t,e,n){var r=e.value,o=(n=la(n)).data&&n.data.transition,i=t.__vOriginalDisplay=\"none\"===t.style.display?\"\":t.style.display;r&&o?(n.data.show=!0,Gi(n,(function(){t.style.display=i}))):t.style.display=r?i:\"none\"},update:function(t,e,n){var r=e.value;!r!=!e.oldValue&&((n=la(n)).data&&n.data.transition?(n.data.show=!0,r?Gi(n,(function(){t.style.display=t.__vOriginalDisplay})):Xi(n,(function(){t.style.display=\"none\"}))):t.style.display=r?t.__vOriginalDisplay:\"none\")},unbind:function(t,e,n,r,o){o||(t.style.display=t.__vOriginalDisplay)}},da={model:na,show:fa},pa={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function va(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?va(Re(e.children)):t}function ha(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var o=n._parentListeners;for(var r in o)e[x(r)]=o[r];return e}function ma(t,e){if(/\\d-keep-alive$/.test(e.tag))return t(\"keep-alive\",{props:e.componentOptions.propsData})}var ga=function(t){return t.tag||ke(t)},ya=function(t){return\"show\"===t.name},_a={name:\"transition\",props:pa,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(ga)).length){var r=this.mode,o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var a=va(o);if(!a)return o;if(this._leaving)return ma(t,o);var s=\"__transition-\".concat(this._uid,\"-\");a.key=null==a.key?a.isComment?s+\"comment\":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=ha(this),u=this._vnode,l=va(u);if(a.data.directives&&a.data.directives.some(ya)&&(a.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(a,l)&&!ke(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if(\"out-in\"===r)return this._leaving=!0,Qt(f,\"afterLeave\",(function(){e._leaving=!1,e.$forceUpdate()})),ma(t,o);if(\"in-out\"===r){if(ke(a))return u;var d,p=function(){d()};Qt(c,\"afterEnter\",p),Qt(c,\"enterCancelled\",p),Qt(f,\"delayLeave\",(function(t){d=t}))}}return o}}},ba=A({tag:String,moveClass:String},pa);delete ba.mode;var $a={props:ba,beforeMount:function(){var t=this,e=this._update;this._update=function(n,r){var o=Je(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,o(),e.call(t,n,r)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||\"span\",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=ha(this),s=0;s<o.length;s++){(l=o[s]).tag&&null!=l.key&&0!==String(l.key).indexOf(\"__vlist\")&&(i.push(l),n[l.key]=l,(l.data||(l.data={})).transition=a)}if(r){var c=[],u=[];for(s=0;s<r.length;s++){var l;(l=r[s]).data.transition=a,l.data.pos=l.elm.getBoundingClientRect(),n[l.key]?c.push(l):u.push(l)}this.kept=t(e,null,c),this.removed=u}return t(e,null,i)},updated:function(){var t=this.prevChildren,e=this.moveClass||(this.name||\"v\")+\"-move\";t.length&&this.hasMove(t[0].elm,e)&&(t.forEach(wa),t.forEach(xa),t.forEach(Ca),this._reflow=document.body.offsetHeight,t.forEach((function(t){if(t.data.moved){var n=t.elm,r=n.style;zi(n,e),r.transform=r.WebkitTransform=r.transitionDuration=\"\",n.addEventListener(Ri,n._moveCb=function t(r){r&&r.target!==n||r&&!/transform$/.test(r.propertyName)||(n.removeEventListener(Ri,t),n._moveCb=null,Vi(n,e))})}})))},methods:{hasMove:function(t,e){if(!Di)return!1;if(this._hasMove)return this._hasMove;var n=t.cloneNode();t._transitionClasses&&t._transitionClasses.forEach((function(t){Ei(n,t)})),ji(n,e),n.style.display=\"none\",this.$el.appendChild(n);var r=qi(n);return this.$el.removeChild(n),this._hasMove=r.hasTransform}}};function wa(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function xa(t){t.data.newPos=t.elm.getBoundingClientRect()}function Ca(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,o=e.top-n.top;if(r||o){t.data.moved=!0;var i=t.elm.style;i.transform=i.WebkitTransform=\"translate(\".concat(r,\"px,\").concat(o,\"px)\"),i.transitionDuration=\"0s\"}}var ka={Transition:_a,TransitionGroup:$a};Er.config.mustUseProp=Ur,Er.config.isReservedTag=oo,Er.config.isReservedAttr=Hr,Er.config.getTagNamespace=io,Er.config.isUnknownElement=function(t){if(!q)return!0;if(oo(t))return!1;if(t=t.toLowerCase(),null!=ao[t])return ao[t];var e=document.createElement(t);return t.indexOf(\"-\")>-1?ao[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:ao[t]=/HTMLUnknownElement/.test(e.toString())},A(Er.options.directives,da),A(Er.options.components,ka),Er.prototype.__patch__=q?ea:E,Er.prototype.$mount=function(t,e){return function(t,e,n){var r;t.$el=e,t.$options.render||(t.$options.render=dt),Ge(t,\"beforeMount\"),r=function(){t._update(t._render(),n)},new Xn(t,r,E,{before:function(){t._isMounted&&!t._isDestroyed&&Ge(t,\"beforeUpdate\")}},!0),n=!1;var o=t._preWatchers;if(o)for(var i=0;i<o.length;i++)o[i].run();return null==t.$vnode&&(t._isMounted=!0,Ge(t,\"mounted\")),t}(this,t=t&&q?co(t):void 0,e)},q&&setTimeout((function(){B.devtools&&it&&it.emit(\"init\",Er)}),0);var Sa=/\\{\\{((?:.|\\r?\\n)+?)\\}\\}/g,Oa=/[-.*+?^${}()|[\\]\\/\\\\]/g,Ta=$((function(t){var e=t[0].replace(Oa,\"\\\\$&\"),n=t[1].replace(Oa,\"\\\\$&\");return new RegExp(e+\"((?:.|\\\\n)+?)\"+n,\"g\")}));var Aa={staticKeys:[\"staticClass\"],transformNode:function(t,e){e.warn;var n=Zo(t,\"class\");n&&(t.staticClass=JSON.stringify(n.replace(/\\s+/g,\" \").trim()));var r=Wo(t,\"class\",!1);r&&(t.classBinding=r)},genData:function(t){var e=\"\";return t.staticClass&&(e+=\"staticClass:\".concat(t.staticClass,\",\")),t.classBinding&&(e+=\"class:\".concat(t.classBinding,\",\")),e}};var ja,Ea={staticKeys:[\"staticStyle\"],transformNode:function(t,e){e.warn;var n=Zo(t,\"style\");n&&(t.staticStyle=JSON.stringify(yi(n)));var r=Wo(t,\"style\",!1);r&&(t.styleBinding=r)},genData:function(t){var e=\"\";return t.staticStyle&&(e+=\"staticStyle:\".concat(t.staticStyle,\",\")),t.styleBinding&&(e+=\"style:(\".concat(t.styleBinding,\"),\")),e}},Na=function(t){return(ja=ja||document.createElement(\"div\")).innerHTML=t,ja.textContent},Pa=h(\"area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr\"),Da=h(\"colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source\"),Ma=h(\"address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track\"),Ia=/^\\s*([^\\s\"'<>\\/=]+)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/,La=/^\\s*((?:v-[\\w-]+:|@|:|#)\\[[^=]+?\\][^\\s\"'<>\\/=]*)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/,Ra=\"[a-zA-Z_][\\\\-\\\\.0-9_a-zA-Z\".concat(U.source,\"]*\"),Fa=\"((?:\".concat(Ra,\"\\\\:)?\").concat(Ra,\")\"),Ha=new RegExp(\"^<\".concat(Fa)),Ba=/^\\s*(\\/?)>/,Ua=new RegExp(\"^<\\\\/\".concat(Fa,\"[^>]*>\")),za=/^<!DOCTYPE [^>]+>/i,Va=/^<!\\--/,Ka=/^<!\\[/,Ja=h(\"script,style,textarea\",!0),qa={},Wa={\"&lt;\":\"<\",\"&gt;\":\">\",\"&quot;\":'\"',\"&amp;\":\"&\",\"&#10;\":\"\\n\",\"&#9;\":\"\\t\",\"&#39;\":\"'\"},Za=/&(?:lt|gt|quot|amp|#39);/g,Ga=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Xa=h(\"pre,textarea\",!0),Ya=function(t,e){return t&&Xa(t)&&\"\\n\"===e[0]};function Qa(t,e){var n=e?Ga:Za;return t.replace(n,(function(t){return Wa[t]}))}function ts(t,e){for(var n,r,o=[],i=e.expectHTML,a=e.isUnaryTag||N,s=e.canBeLeftOpenTag||N,c=0,u=function(){if(n=t,r&&Ja(r)){var u=0,d=r.toLowerCase(),p=qa[d]||(qa[d]=new RegExp(\"([\\\\s\\\\S]*?)(</\"+d+\"[^>]*>)\",\"i\"));w=t.replace(p,(function(t,n,r){return u=r.length,Ja(d)||\"noscript\"===d||(n=n.replace(/<!\\--([\\s\\S]*?)-->/g,\"$1\").replace(/<!\\[CDATA\\[([\\s\\S]*?)]]>/g,\"$1\")),Ya(d,n)&&(n=n.slice(1)),e.chars&&e.chars(n),\"\"}));c+=t.length-w.length,t=w,f(d,c-u,c)}else{var v=t.indexOf(\"<\");if(0===v){if(Va.test(t)){var h=t.indexOf(\"--\\x3e\");if(h>=0)return e.shouldKeepComment&&e.comment&&e.comment(t.substring(4,h),c,c+h+3),l(h+3),\"continue\"}if(Ka.test(t)){var m=t.indexOf(\"]>\");if(m>=0)return l(m+2),\"continue\"}var g=t.match(za);if(g)return l(g[0].length),\"continue\";var y=t.match(Ua);if(y){var _=c;return l(y[0].length),f(y[1],_,c),\"continue\"}var b=function(){var e=t.match(Ha);if(e){var n={tagName:e[1],attrs:[],start:c};l(e[0].length);for(var r=void 0,o=void 0;!(r=t.match(Ba))&&(o=t.match(La)||t.match(Ia));)o.start=c,l(o[0].length),o.end=c,n.attrs.push(o);if(r)return n.unarySlash=r[1],l(r[0].length),n.end=c,n}}();if(b)return function(t){var n=t.tagName,c=t.unarySlash;i&&(\"p\"===r&&Ma(n)&&f(r),s(n)&&r===n&&f(n));for(var u=a(n)||!!c,l=t.attrs.length,d=new Array(l),p=0;p<l;p++){var v=t.attrs[p],h=v[3]||v[4]||v[5]||\"\",m=\"a\"===n&&\"href\"===v[1]?e.shouldDecodeNewlinesForHref:e.shouldDecodeNewlines;d[p]={name:v[1],value:Qa(h,m)}}u||(o.push({tag:n,lowerCasedTag:n.toLowerCase(),attrs:d,start:t.start,end:t.end}),r=n);e.start&&e.start(n,d,u,t.start,t.end)}(b),Ya(b.tagName,t)&&l(1),\"continue\"}var $=void 0,w=void 0,x=void 0;if(v>=0){for(w=t.slice(v);!(Ua.test(w)||Ha.test(w)||Va.test(w)||Ka.test(w)||(x=w.indexOf(\"<\",1))<0);)v+=x,w=t.slice(v);$=t.substring(0,v)}v<0&&($=t),$&&l($.length),e.chars&&$&&e.chars($,c-$.length,c)}if(t===n)return e.chars&&e.chars(t),\"break\"};t;){if(\"break\"===u())break}function l(e){c+=e,t=t.substring(e)}function f(t,n,i){var a,s;if(null==n&&(n=c),null==i&&(i=c),t)for(s=t.toLowerCase(),a=o.length-1;a>=0&&o[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=o.length-1;u>=a;u--)e.end&&e.end(o[u].tag,n,i);o.length=a,r=a&&o[a-1].tag}else\"br\"===s?e.start&&e.start(t,[],!0,n,i):\"p\"===s&&(e.start&&e.start(t,[],!1,n,i),e.end&&e.end(t,n,i))}f()}var es,ns,rs,os,is,as,ss,cs,us=/^@|^v-on:/,ls=/^v-|^@|^:|^#/,fs=/([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/,ds=/,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/,ps=/^\\(|\\)$/g,vs=/^\\[.*\\]$/,hs=/:(.*)$/,ms=/^:|^\\.|^v-bind:/,gs=/\\.[^.\\]]+(?=[^\\]]*$)/g,ys=/^v-slot(:|$)|^#/,_s=/[\\r\\n]/,bs=/[ \\f\\t\\r\\n]+/g,$s=$(Na),ws=\"_empty_\";function xs(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:js(e),rawAttrsMap:{},parent:n,children:[]}}function Cs(t,e){es=e.warn||Ho,as=e.isPreTag||N,ss=e.mustUseProp||N,cs=e.getTagNamespace||N,e.isReservedTag,rs=Bo(e.modules,\"transformNode\"),os=Bo(e.modules,\"preTransformNode\"),is=Bo(e.modules,\"postTransformNode\"),ns=e.delimiters;var n,r,o=[],i=!1!==e.preserveWhitespace,a=e.whitespace,s=!1,c=!1;function u(t){if(l(t),s||t.processed||(t=ks(t,e)),o.length||t===n||n.if&&(t.elseif||t.else)&&Os(n,{exp:t.elseif,block:t}),r&&!t.forbidden)if(t.elseif||t.else)a=t,u=function(t){for(var e=t.length;e--;){if(1===t[e].type)return t[e];t.pop()}}(r.children),u&&u.if&&Os(u,{exp:a.elseif,block:a});else{if(t.slotScope){var i=t.slotTarget||'\"default\"';(r.scopedSlots||(r.scopedSlots={}))[i]=t}r.children.push(t),t.parent=r}var a,u;t.children=t.children.filter((function(t){return!t.slotScope})),l(t),t.pre&&(s=!1),as(t.tag)&&(c=!1);for(var f=0;f<is.length;f++)is[f](t,e)}function l(t){if(!c)for(var e=void 0;(e=t.children[t.children.length-1])&&3===e.type&&\" \"===e.text;)t.children.pop()}return ts(t,{warn:es,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,shouldDecodeNewlinesForHref:e.shouldDecodeNewlinesForHref,shouldKeepComment:e.comments,outputSourceRange:e.outputSourceRange,start:function(t,i,a,l,f){var d=r&&r.ns||cs(t);Z&&\"svg\"===d&&(i=function(t){for(var e=[],n=0;n<t.length;n++){var r=t[n];Es.test(r.name)||(r.name=r.name.replace(Ns,\"\"),e.push(r))}return e}(i));var p,v=xs(t,i,r);d&&(v.ns=d),\"style\"!==(p=v).tag&&(\"script\"!==p.tag||p.attrsMap.type&&\"text/javascript\"!==p.attrsMap.type)||ot()||(v.forbidden=!0);for(var h=0;h<os.length;h++)v=os[h](v,e)||v;s||(!function(t){null!=Zo(t,\"v-pre\")&&(t.pre=!0)}(v),v.pre&&(s=!0)),as(v.tag)&&(c=!0),s?function(t){var e=t.attrsList,n=e.length;if(n)for(var r=t.attrs=new Array(n),o=0;o<n;o++)r[o]={name:e[o].name,value:JSON.stringify(e[o].value)},null!=e[o].start&&(r[o].start=e[o].start,r[o].end=e[o].end);else t.pre||(t.plain=!0)}(v):v.processed||(Ss(v),function(t){var e=Zo(t,\"v-if\");if(e)t.if=e,Os(t,{exp:e,block:t});else{null!=Zo(t,\"v-else\")&&(t.else=!0);var n=Zo(t,\"v-else-if\");n&&(t.elseif=n)}}(v),function(t){var e=Zo(t,\"v-once\");null!=e&&(t.once=!0)}(v)),n||(n=v),a?u(v):(r=v,o.push(v))},end:function(t,e,n){var i=o[o.length-1];o.length-=1,r=o[o.length-1],u(i)},chars:function(t,e,n){if(r&&(!Z||\"textarea\"!==r.tag||r.attrsMap.placeholder!==t)){var o,u=r.children;if(t=c||t.trim()?\"script\"===(o=r).tag||\"style\"===o.tag?t:$s(t):u.length?a?\"condense\"===a&&_s.test(t)?\"\":\" \":i?\" \":\"\":\"\"){c||\"condense\"!==a||(t=t.replace(bs,\" \"));var l=void 0,f=void 0;!s&&\" \"!==t&&(l=function(t,e){var n=e?Ta(e):Sa;if(n.test(t)){for(var r,o,i,a=[],s=[],c=n.lastIndex=0;r=n.exec(t);){(o=r.index)>c&&(s.push(i=t.slice(c,o)),a.push(JSON.stringify(i)));var u=Ro(r[1].trim());a.push(\"_s(\".concat(u,\")\")),s.push({\"@binding\":u}),c=o+r[0].length}return c<t.length&&(s.push(i=t.slice(c)),a.push(JSON.stringify(i))),{expression:a.join(\"+\"),tokens:s}}}(t,ns))?f={type:2,expression:l.expression,tokens:l.tokens,text:t}:\" \"===t&&u.length&&\" \"===u[u.length-1].text||(f={type:3,text:t}),f&&u.push(f)}}},comment:function(t,e,n){if(r){var o={type:3,text:t,isComment:!0};r.children.push(o)}}}),n}function ks(t,e){var n,r;(r=Wo(n=t,\"key\"))&&(n.key=r),t.plain=!t.key&&!t.scopedSlots&&!t.attrsList.length,function(t){var e=Wo(t,\"ref\");e&&(t.ref=e,t.refInFor=function(t){var e=t;for(;e;){if(void 0!==e.for)return!0;e=e.parent}return!1}(t))}(t),function(t){var e;\"template\"===t.tag?(e=Zo(t,\"scope\"),t.slotScope=e||Zo(t,\"slot-scope\")):(e=Zo(t,\"slot-scope\"))&&(t.slotScope=e);var n=Wo(t,\"slot\");n&&(t.slotTarget='\"\"'===n?'\"default\"':n,t.slotTargetDynamic=!(!t.attrsMap[\":slot\"]&&!t.attrsMap[\"v-bind:slot\"]),\"template\"===t.tag||t.slotScope||zo(t,\"slot\",n,function(t,e){return t.rawAttrsMap[\":\"+e]||t.rawAttrsMap[\"v-bind:\"+e]||t.rawAttrsMap[e]}(t,\"slot\")));if(\"template\"===t.tag){if(a=Go(t,ys)){var r=Ts(a),o=r.name,i=r.dynamic;t.slotTarget=o,t.slotTargetDynamic=i,t.slotScope=a.value||ws}}else{var a;if(a=Go(t,ys)){var s=t.scopedSlots||(t.scopedSlots={}),c=Ts(a),u=c.name,l=(i=c.dynamic,s[u]=xs(\"template\",[],t));l.slotTarget=u,l.slotTargetDynamic=i,l.children=t.children.filter((function(t){if(!t.slotScope)return t.parent=l,!0})),l.slotScope=a.value||ws,t.children=[],t.plain=!1}}}(t),function(t){\"slot\"===t.tag&&(t.slotName=Wo(t,\"name\"))}(t),function(t){var e;(e=Wo(t,\"is\"))&&(t.component=e);null!=Zo(t,\"inline-template\")&&(t.inlineTemplate=!0)}(t);for(var o=0;o<rs.length;o++)t=rs[o](t,e)||t;return function(t){var e,n,r,o,i,a,s,c,u=t.attrsList;for(e=0,n=u.length;e<n;e++)if(r=o=u[e].name,i=u[e].value,ls.test(r))if(t.hasBindings=!0,(a=As(r.replace(ls,\"\")))&&(r=r.replace(gs,\"\")),ms.test(r))r=r.replace(ms,\"\"),i=Ro(i),(c=vs.test(r))&&(r=r.slice(1,-1)),a&&(a.prop&&!c&&\"innerHtml\"===(r=x(r))&&(r=\"innerHTML\"),a.camel&&!c&&(r=x(r)),a.sync&&(s=Qo(i,\"$event\"),c?qo(t,'\"update:\"+('.concat(r,\")\"),s,null,!1,0,u[e],!0):(qo(t,\"update:\".concat(x(r)),s,null,!1,0,u[e]),S(r)!==x(r)&&qo(t,\"update:\".concat(S(r)),s,null,!1,0,u[e])))),a&&a.prop||!t.component&&ss(t.tag,t.attrsMap.type,r)?Uo(t,r,i,u[e],c):zo(t,r,i,u[e],c);else if(us.test(r))r=r.replace(us,\"\"),(c=vs.test(r))&&(r=r.slice(1,-1)),qo(t,r,i,a,!1,0,u[e],c);else{var l=(r=r.replace(ls,\"\")).match(hs),f=l&&l[1];c=!1,f&&(r=r.slice(0,-(f.length+1)),vs.test(f)&&(f=f.slice(1,-1),c=!0)),Ko(t,r,o,i,f,c,a,u[e])}else zo(t,r,JSON.stringify(i),u[e]),!t.component&&\"muted\"===r&&ss(t.tag,t.attrsMap.type,r)&&Uo(t,r,\"true\",u[e])}(t),t}function Ss(t){var e;if(e=Zo(t,\"v-for\")){var n=function(t){var e=t.match(fs);if(!e)return;var n={};n.for=e[2].trim();var r=e[1].trim().replace(ps,\"\"),o=r.match(ds);o?(n.alias=r.replace(ds,\"\").trim(),n.iterator1=o[1].trim(),o[2]&&(n.iterator2=o[2].trim())):n.alias=r;return n}(e);n&&A(t,n)}}function Os(t,e){t.ifConditions||(t.ifConditions=[]),t.ifConditions.push(e)}function Ts(t){var e=t.name.replace(ys,\"\");return e||\"#\"!==t.name[0]&&(e=\"default\"),vs.test(e)?{name:e.slice(1,-1),dynamic:!0}:{name:'\"'.concat(e,'\"'),dynamic:!1}}function As(t){var e=t.match(gs);if(e){var n={};return e.forEach((function(t){n[t.slice(1)]=!0})),n}}function js(t){for(var e={},n=0,r=t.length;n<r;n++)e[t[n].name]=t[n].value;return e}var Es=/^xmlns:NS\\d+/,Ns=/^NS\\d+:/;function Ps(t){return xs(t.tag,t.attrsList.slice(),t.parent)}var Ds=[Aa,Ea,{preTransformNode:function(t,e){if(\"input\"===t.tag){var n=t.attrsMap;if(!n[\"v-model\"])return;var r=void 0;if((n[\":type\"]||n[\"v-bind:type\"])&&(r=Wo(t,\"type\")),n.type||r||!n[\"v-bind\"]||(r=\"(\".concat(n[\"v-bind\"],\").type\")),r){var o=Zo(t,\"v-if\",!0),i=o?\"&&(\".concat(o,\")\"):\"\",a=null!=Zo(t,\"v-else\",!0),s=Zo(t,\"v-else-if\",!0),c=Ps(t);Ss(c),Vo(c,\"type\",\"checkbox\"),ks(c,e),c.processed=!0,c.if=\"(\".concat(r,\")==='checkbox'\")+i,Os(c,{exp:c.if,block:c});var u=Ps(t);Zo(u,\"v-for\",!0),Vo(u,\"type\",\"radio\"),ks(u,e),Os(c,{exp:\"(\".concat(r,\")==='radio'\")+i,block:u});var l=Ps(t);return Zo(l,\"v-for\",!0),Vo(l,\":type\",r),ks(l,e),Os(c,{exp:o,block:l}),a?c.else=!0:s&&(c.elseif=s),c}}}}];var Ms,Is,Ls={model:function(t,e,n){var r=e.value,o=e.modifiers,i=t.tag,a=t.attrsMap.type;if(t.component)return Yo(t,r,o),!1;if(\"select\"===i)!function(t,e,n){var r=n&&n.number,o='Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;'+\"return \".concat(r?\"_n(val)\":\"val\",\"})\"),i=\"$event.target.multiple ? $$selectedVal : $$selectedVal[0]\",a=\"var $$selectedVal = \".concat(o,\";\");a=\"\".concat(a,\" \").concat(Qo(e,i)),qo(t,\"change\",a,null,!0)}(t,r,o);else if(\"input\"===i&&\"checkbox\"===a)!function(t,e,n){var r=n&&n.number,o=Wo(t,\"value\")||\"null\",i=Wo(t,\"true-value\")||\"true\",a=Wo(t,\"false-value\")||\"false\";Uo(t,\"checked\",\"Array.isArray(\".concat(e,\")\")+\"?_i(\".concat(e,\",\").concat(o,\")>-1\")+(\"true\"===i?\":(\".concat(e,\")\"):\":_q(\".concat(e,\",\").concat(i,\")\"))),qo(t,\"change\",\"var $$a=\".concat(e,\",\")+\"$$el=$event.target,\"+\"$$c=$$el.checked?(\".concat(i,\"):(\").concat(a,\");\")+\"if(Array.isArray($$a)){\"+\"var $$v=\".concat(r?\"_n(\"+o+\")\":o,\",\")+\"$$i=_i($$a,$$v);\"+\"if($$el.checked){$$i<0&&(\".concat(Qo(e,\"$$a.concat([$$v])\"),\")}\")+\"else{$$i>-1&&(\".concat(Qo(e,\"$$a.slice(0,$$i).concat($$a.slice($$i+1))\"),\")}\")+\"}else{\".concat(Qo(e,\"$$c\"),\"}\"),null,!0)}(t,r,o);else if(\"input\"===i&&\"radio\"===a)!function(t,e,n){var r=n&&n.number,o=Wo(t,\"value\")||\"null\";o=r?\"_n(\".concat(o,\")\"):o,Uo(t,\"checked\",\"_q(\".concat(e,\",\").concat(o,\")\")),qo(t,\"change\",Qo(e,o),null,!0)}(t,r,o);else if(\"input\"===i||\"textarea\"===i)!function(t,e,n){var r=t.attrsMap.type,o=n||{},i=o.lazy,a=o.number,s=o.trim,c=!i&&\"range\"!==r,u=i?\"change\":\"range\"===r?ai:\"input\",l=\"$event.target.value\";s&&(l=\"$event.target.value.trim()\");a&&(l=\"_n(\".concat(l,\")\"));var f=Qo(e,l);c&&(f=\"if($event.target.composing)return;\".concat(f));Uo(t,\"value\",\"(\".concat(e,\")\")),qo(t,u,f,null,!0),(s||a)&&qo(t,\"blur\",\"$forceUpdate()\")}(t,r,o);else if(!B.isReservedTag(i))return Yo(t,r,o),!1;return!0},text:function(t,e){e.value&&Uo(t,\"textContent\",\"_s(\".concat(e.value,\")\"),e)},html:function(t,e){e.value&&Uo(t,\"innerHTML\",\"_s(\".concat(e.value,\")\"),e)}},Rs={expectHTML:!0,modules:Ds,directives:Ls,isPreTag:function(t){return\"pre\"===t},isUnaryTag:Pa,mustUseProp:Ur,canBeLeftOpenTag:Da,isReservedTag:oo,getTagNamespace:io,staticKeys:function(t){return t.reduce((function(t,e){return t.concat(e.staticKeys||[])}),[]).join(\",\")}(Ds)},Fs=$((function(t){return h(\"type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap\"+(t?\",\"+t:\"\"))}));function Hs(t,e){t&&(Ms=Fs(e.staticKeys||\"\"),Is=e.isReservedTag||N,Bs(t),Us(t,!1))}function Bs(t){if(t.static=function(t){if(2===t.type)return!1;if(3===t.type)return!0;return!(!t.pre&&(t.hasBindings||t.if||t.for||m(t.tag)||!Is(t.tag)||function(t){for(;t.parent;){if(\"template\"!==(t=t.parent).tag)return!1;if(t.for)return!0}return!1}(t)||!Object.keys(t).every(Ms)))}(t),1===t.type){if(!Is(t.tag)&&\"slot\"!==t.tag&&null==t.attrsMap[\"inline-template\"])return;for(var e=0,n=t.children.length;e<n;e++){var r=t.children[e];Bs(r),r.static||(t.static=!1)}if(t.ifConditions)for(e=1,n=t.ifConditions.length;e<n;e++){var o=t.ifConditions[e].block;Bs(o),o.static||(t.static=!1)}}}function Us(t,e){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=e),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var n=0,r=t.children.length;n<r;n++)Us(t.children[n],e||!!t.for);if(t.ifConditions)for(n=1,r=t.ifConditions.length;n<r;n++)Us(t.ifConditions[n].block,e)}}var zs=/^([\\w$_]+|\\([^)]*?\\))\\s*=>|^function(?:\\s+[\\w$]+)?\\s*\\(/,Vs=/\\([^)]*?\\);*$/,Ks=/^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['[^']*?']|\\[\"[^\"]*?\"]|\\[\\d+]|\\[[A-Za-z_$][\\w$]*])*$/,Js={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},qs={esc:[\"Esc\",\"Escape\"],tab:\"Tab\",enter:\"Enter\",space:[\" \",\"Spacebar\"],up:[\"Up\",\"ArrowUp\"],left:[\"Left\",\"ArrowLeft\"],right:[\"Right\",\"ArrowRight\"],down:[\"Down\",\"ArrowDown\"],delete:[\"Backspace\",\"Delete\",\"Del\"]},Ws=function(t){return\"if(\".concat(t,\")return null;\")},Zs={stop:\"$event.stopPropagation();\",prevent:\"$event.preventDefault();\",self:Ws(\"$event.target !== $event.currentTarget\"),ctrl:Ws(\"!$event.ctrlKey\"),shift:Ws(\"!$event.shiftKey\"),alt:Ws(\"!$event.altKey\"),meta:Ws(\"!$event.metaKey\"),left:Ws(\"'button' in $event && $event.button !== 0\"),middle:Ws(\"'button' in $event && $event.button !== 1\"),right:Ws(\"'button' in $event && $event.button !== 2\")};function Gs(t,e){var n=e?\"nativeOn:\":\"on:\",r=\"\",o=\"\";for(var i in t){var a=Xs(t[i]);t[i]&&t[i].dynamic?o+=\"\".concat(i,\",\").concat(a,\",\"):r+='\"'.concat(i,'\":').concat(a,\",\")}return r=\"{\".concat(r.slice(0,-1),\"}\"),o?n+\"_d(\".concat(r,\",[\").concat(o.slice(0,-1),\"])\"):n+r}function Xs(t){if(!t)return\"function(){}\";if(Array.isArray(t))return\"[\".concat(t.map((function(t){return Xs(t)})).join(\",\"),\"]\");var e=Ks.test(t.value),n=zs.test(t.value),r=Ks.test(t.value.replace(Vs,\"\"));if(t.modifiers){var o=\"\",i=\"\",a=[],s=function(e){if(Zs[e])i+=Zs[e],Js[e]&&a.push(e);else if(\"exact\"===e){var n=t.modifiers;i+=Ws([\"ctrl\",\"shift\",\"alt\",\"meta\"].filter((function(t){return!n[t]})).map((function(t){return\"$event.\".concat(t,\"Key\")})).join(\"||\"))}else a.push(e)};for(var c in t.modifiers)s(c);a.length&&(o+=function(t){return\"if(!$event.type.indexOf('key')&&\"+\"\".concat(t.map(Ys).join(\"&&\"),\")return null;\")}(a)),i&&(o+=i);var u=e?\"return \".concat(t.value,\".apply(null, arguments)\"):n?\"return (\".concat(t.value,\").apply(null, arguments)\"):r?\"return \".concat(t.value):t.value;return\"function($event){\".concat(o).concat(u,\"}\")}return e||n?t.value:\"function($event){\".concat(r?\"return \".concat(t.value):t.value,\"}\")}function Ys(t){var e=parseInt(t,10);if(e)return\"$event.keyCode!==\".concat(e);var n=Js[t],r=qs[t];return\"_k($event.keyCode,\"+\"\".concat(JSON.stringify(t),\",\")+\"\".concat(JSON.stringify(n),\",\")+\"$event.key,\"+\"\".concat(JSON.stringify(r))+\")\"}var Qs={on:function(t,e){t.wrapListeners=function(t){return\"_g(\".concat(t,\",\").concat(e.value,\")\")}},bind:function(t,e){t.wrapData=function(n){return\"_b(\".concat(n,\",'\").concat(t.tag,\"',\").concat(e.value,\",\").concat(e.modifiers&&e.modifiers.prop?\"true\":\"false\").concat(e.modifiers&&e.modifiers.sync?\",true\":\"\",\")\")}},cloak:E},tc=function(t){this.options=t,this.warn=t.warn||Ho,this.transforms=Bo(t.modules,\"transformCode\"),this.dataGenFns=Bo(t.modules,\"genData\"),this.directives=A(A({},Qs),t.directives);var e=t.isReservedTag||N;this.maybeComponent=function(t){return!!t.component||!e(t.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function ec(t,e){var n=new tc(e),r=t?\"script\"===t.tag?\"null\":nc(t,n):'_c(\"div\")';return{render:\"with(this){return \".concat(r,\"}\"),staticRenderFns:n.staticRenderFns}}function nc(t,e){if(t.parent&&(t.pre=t.pre||t.parent.pre),t.staticRoot&&!t.staticProcessed)return rc(t,e);if(t.once&&!t.onceProcessed)return oc(t,e);if(t.for&&!t.forProcessed)return sc(t,e);if(t.if&&!t.ifProcessed)return ic(t,e);if(\"template\"!==t.tag||t.slotTarget||e.pre){if(\"slot\"===t.tag)return function(t,e){var n=t.slotName||'\"default\"',r=fc(t,e),o=\"_t(\".concat(n).concat(r?\",function(){return \".concat(r,\"}\"):\"\"),i=t.attrs||t.dynamicAttrs?vc((t.attrs||[]).concat(t.dynamicAttrs||[]).map((function(t){return{name:x(t.name),value:t.value,dynamic:t.dynamic}}))):null,a=t.attrsMap[\"v-bind\"];!i&&!a||r||(o+=\",null\");i&&(o+=\",\".concat(i));a&&(o+=\"\".concat(i?\"\":\",null\",\",\").concat(a));return o+\")\"}(t,e);var n=void 0;if(t.component)n=function(t,e,n){var r=e.inlineTemplate?null:fc(e,n,!0);return\"_c(\".concat(t,\",\").concat(cc(e,n)).concat(r?\",\".concat(r):\"\",\")\")}(t.component,t,e);else{var r=void 0,o=e.maybeComponent(t);(!t.plain||t.pre&&o)&&(r=cc(t,e));var i=void 0,a=e.options.bindings;o&&a&&!1!==a.__isScriptSetup&&(i=function(t,e){var n=x(e),r=C(n),o=function(o){return t[e]===o?e:t[n]===o?n:t[r]===o?r:void 0},i=o(\"setup-const\")||o(\"setup-reactive-const\");if(i)return i;var a=o(\"setup-let\")||o(\"setup-ref\")||o(\"setup-maybe-ref\");if(a)return a}(a,t.tag)),i||(i=\"'\".concat(t.tag,\"'\"));var s=t.inlineTemplate?null:fc(t,e,!0);n=\"_c(\".concat(i).concat(r?\",\".concat(r):\"\").concat(s?\",\".concat(s):\"\",\")\")}for(var c=0;c<e.transforms.length;c++)n=e.transforms[c](t,n);return n}return fc(t,e)||\"void 0\"}function rc(t,e){t.staticProcessed=!0;var n=e.pre;return t.pre&&(e.pre=t.pre),e.staticRenderFns.push(\"with(this){return \".concat(nc(t,e),\"}\")),e.pre=n,\"_m(\".concat(e.staticRenderFns.length-1).concat(t.staticInFor?\",true\":\"\",\")\")}function oc(t,e){if(t.onceProcessed=!0,t.if&&!t.ifProcessed)return ic(t,e);if(t.staticInFor){for(var n=\"\",r=t.parent;r;){if(r.for){n=r.key;break}r=r.parent}return n?\"_o(\".concat(nc(t,e),\",\").concat(e.onceId++,\",\").concat(n,\")\"):nc(t,e)}return rc(t,e)}function ic(t,e,n,r){return t.ifProcessed=!0,ac(t.ifConditions.slice(),e,n,r)}function ac(t,e,n,r){if(!t.length)return r||\"_e()\";var o=t.shift();return o.exp?\"(\".concat(o.exp,\")?\").concat(i(o.block),\":\").concat(ac(t,e,n,r)):\"\".concat(i(o.block));function i(t){return n?n(t,e):t.once?oc(t,e):nc(t,e)}}function sc(t,e,n,r){var o=t.for,i=t.alias,a=t.iterator1?\",\".concat(t.iterator1):\"\",s=t.iterator2?\",\".concat(t.iterator2):\"\";return t.forProcessed=!0,\"\".concat(r||\"_l\",\"((\").concat(o,\"),\")+\"function(\".concat(i).concat(a).concat(s,\"){\")+\"return \".concat((n||nc)(t,e))+\"})\"}function cc(t,e){var n=\"{\",r=function(t,e){var n=t.directives;if(!n)return;var r,o,i,a,s=\"directives:[\",c=!1;for(r=0,o=n.length;r<o;r++){i=n[r],a=!0;var u=e.directives[i.name];u&&(a=!!u(t,i,e.warn)),a&&(c=!0,s+='{name:\"'.concat(i.name,'\",rawName:\"').concat(i.rawName,'\"').concat(i.value?\",value:(\".concat(i.value,\"),expression:\").concat(JSON.stringify(i.value)):\"\").concat(i.arg?\",arg:\".concat(i.isDynamicArg?i.arg:'\"'.concat(i.arg,'\"')):\"\").concat(i.modifiers?\",modifiers:\".concat(JSON.stringify(i.modifiers)):\"\",\"},\"))}if(c)return s.slice(0,-1)+\"]\"}(t,e);r&&(n+=r+\",\"),t.key&&(n+=\"key:\".concat(t.key,\",\")),t.ref&&(n+=\"ref:\".concat(t.ref,\",\")),t.refInFor&&(n+=\"refInFor:true,\"),t.pre&&(n+=\"pre:true,\"),t.component&&(n+='tag:\"'.concat(t.tag,'\",'));for(var o=0;o<e.dataGenFns.length;o++)n+=e.dataGenFns[o](t);if(t.attrs&&(n+=\"attrs:\".concat(vc(t.attrs),\",\")),t.props&&(n+=\"domProps:\".concat(vc(t.props),\",\")),t.events&&(n+=\"\".concat(Gs(t.events,!1),\",\")),t.nativeEvents&&(n+=\"\".concat(Gs(t.nativeEvents,!0),\",\")),t.slotTarget&&!t.slotScope&&(n+=\"slot:\".concat(t.slotTarget,\",\")),t.scopedSlots&&(n+=\"\".concat(function(t,e,n){var r=t.for||Object.keys(e).some((function(t){var n=e[t];return n.slotTargetDynamic||n.if||n.for||uc(n)})),o=!!t.if;if(!r)for(var i=t.parent;i;){if(i.slotScope&&i.slotScope!==ws||i.for){r=!0;break}i.if&&(o=!0),i=i.parent}var a=Object.keys(e).map((function(t){return lc(e[t],n)})).join(\",\");return\"scopedSlots:_u([\".concat(a,\"]\").concat(r?\",null,true\":\"\").concat(!r&&o?\",null,false,\".concat(function(t){var e=5381,n=t.length;for(;n;)e=33*e^t.charCodeAt(--n);return e>>>0}(a)):\"\",\")\")}(t,t.scopedSlots,e),\",\")),t.model&&(n+=\"model:{value:\".concat(t.model.value,\",callback:\").concat(t.model.callback,\",expression:\").concat(t.model.expression,\"},\")),t.inlineTemplate){var i=function(t,e){var n=t.children[0];if(n&&1===n.type){var r=ec(n,e.options);return\"inlineTemplate:{render:function(){\".concat(r.render,\"},staticRenderFns:[\").concat(r.staticRenderFns.map((function(t){return\"function(){\".concat(t,\"}\")})).join(\",\"),\"]}\")}}(t,e);i&&(n+=\"\".concat(i,\",\"))}return n=n.replace(/,$/,\"\")+\"}\",t.dynamicAttrs&&(n=\"_b(\".concat(n,',\"').concat(t.tag,'\",').concat(vc(t.dynamicAttrs),\")\")),t.wrapData&&(n=t.wrapData(n)),t.wrapListeners&&(n=t.wrapListeners(n)),n}function uc(t){return 1===t.type&&(\"slot\"===t.tag||t.children.some(uc))}function lc(t,e){var n=t.attrsMap[\"slot-scope\"];if(t.if&&!t.ifProcessed&&!n)return ic(t,e,lc,\"null\");if(t.for&&!t.forProcessed)return sc(t,e,lc);var r=t.slotScope===ws?\"\":String(t.slotScope),o=\"function(\".concat(r,\"){\")+\"return \".concat(\"template\"===t.tag?t.if&&n?\"(\".concat(t.if,\")?\").concat(fc(t,e)||\"undefined\",\":undefined\"):fc(t,e)||\"undefined\":nc(t,e),\"}\"),i=r?\"\":\",proxy:true\";return\"{key:\".concat(t.slotTarget||'\"default\"',\",fn:\").concat(o).concat(i,\"}\")}function fc(t,e,n,r,o){var i=t.children;if(i.length){var a=i[0];if(1===i.length&&a.for&&\"template\"!==a.tag&&\"slot\"!==a.tag){var s=n?e.maybeComponent(a)?\",1\":\",0\":\"\";return\"\".concat((r||nc)(a,e)).concat(s)}var c=n?function(t,e){for(var n=0,r=0;r<t.length;r++){var o=t[r];if(1===o.type){if(dc(o)||o.ifConditions&&o.ifConditions.some((function(t){return dc(t.block)}))){n=2;break}(e(o)||o.ifConditions&&o.ifConditions.some((function(t){return e(t.block)})))&&(n=1)}}return n}(i,e.maybeComponent):0,u=o||pc;return\"[\".concat(i.map((function(t){return u(t,e)})).join(\",\"),\"]\").concat(c?\",\".concat(c):\"\")}}function dc(t){return void 0!==t.for||\"template\"===t.tag||\"slot\"===t.tag}function pc(t,e){return 1===t.type?nc(t,e):3===t.type&&t.isComment?function(t){return\"_e(\".concat(JSON.stringify(t.text),\")\")}(t):function(t){return\"_v(\".concat(2===t.type?t.expression:hc(JSON.stringify(t.text)),\")\")}(t)}function vc(t){for(var e=\"\",n=\"\",r=0;r<t.length;r++){var o=t[r],i=hc(o.value);o.dynamic?n+=\"\".concat(o.name,\",\").concat(i,\",\"):e+='\"'.concat(o.name,'\":').concat(i,\",\")}return e=\"{\".concat(e.slice(0,-1),\"}\"),n?\"_d(\".concat(e,\",[\").concat(n.slice(0,-1),\"])\"):e}function hc(t){return t.replace(/\\u2028/g,\"\\\\u2028\").replace(/\\u2029/g,\"\\\\u2029\")}function mc(t,e){try{return new Function(t)}catch(n){return e.push({err:n,code:t}),E}}function gc(t){var e=Object.create(null);return function(n,r,o){(r=A({},r)).warn,delete r.warn;var i=r.delimiters?String(r.delimiters)+n:n;if(e[i])return e[i];var a=t(n,r),s={},c=[];return s.render=mc(a.render,c),s.staticRenderFns=a.staticRenderFns.map((function(t){return mc(t,c)})),e[i]=s}}new RegExp(\"\\\\b\"+\"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments\".split(\",\").join(\"\\\\b|\\\\b\")+\"\\\\b\"),new RegExp(\"\\\\b\"+\"delete,typeof,void\".split(\",\").join(\"\\\\s*\\\\([^\\\\)]*\\\\)|\\\\b\")+\"\\\\s*\\\\([^\\\\)]*\\\\)\");var yc,_c,bc=(yc=function(t,e){var n=Cs(t.trim(),e);!1!==e.optimize&&Hs(n,e);var r=ec(n,e);return{ast:n,render:r.render,staticRenderFns:r.staticRenderFns}},function(t){function e(e,n){var r=Object.create(t),o=[],i=[];if(n)for(var a in n.modules&&(r.modules=(t.modules||[]).concat(n.modules)),n.directives&&(r.directives=A(Object.create(t.directives||null),n.directives)),n)\"modules\"!==a&&\"directives\"!==a&&(r[a]=n[a]);r.warn=function(t,e,n){(n?i:o).push(t)};var s=yc(e.trim(),r);return s.errors=o,s.tips=i,s}return{compile:e,compileToFunctions:gc(e)}}),$c=bc(Rs).compileToFunctions;function wc(t){return(_c=_c||document.createElement(\"div\")).innerHTML=t?'<a href=\"\\n\"/>':'<div a=\"\\n\"/>',_c.innerHTML.indexOf(\"&#10;\")>0}var xc=!!q&&wc(!1),Cc=!!q&&wc(!0),kc=$((function(t){var e=co(t);return e&&e.innerHTML})),Sc=Er.prototype.$mount;return Er.prototype.$mount=function(t,e){if((t=t&&co(t))===document.body||t===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if(\"string\"==typeof r)\"#\"===r.charAt(0)&&(r=kc(r));else{if(!r.nodeType)return this;r=r.innerHTML}else t&&(r=function(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement(\"div\");return e.appendChild(t.cloneNode(!0)),e.innerHTML}(t));if(r){var o=$c(r,{outputSourceRange:!1,shouldDecodeNewlines:xc,shouldDecodeNewlinesForHref:Cc,delimiters:n.delimiters,comments:n.comments},this),i=o.render,a=o.staticRenderFns;n.render=i,n.staticRenderFns=a}}return Sc.call(this,t,e)},Er.compile=$c,A(Er,Jn),Er.effect=function(t,e){var n=new Xn(ut,t,E,{sync:!0});e&&(n.update=function(){e((function(){return n.run()}))})},Er}));"
  }
]