From 66d77fc91819a126dd0cd158eb8a43a2031279b8 Mon Sep 17 00:00:00 2001 From: "2443029279@qq.com" <2443029279@qq.com> Date: Sun, 5 Oct 2025 03:21:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=90=AD=E5=BB=BA=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=8E=9F=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 65 + DEVELOPMENT_PLAN.md | 651 ++ QUICKSTART.md | 283 + README.md | 334 + api/__init__.py | 7 + api/api.py | 158 + api/config.py | 96 + api/main.py | 38 + api/requirements.txt | 26 + index.html | 14 + package-lock.json | 8366 ++++++++++++++ package.json | 51 + postcss.config.js | 7 + reference-deepwiki/.dockerignore | 60 + .../.github/workflows/docker-build-push.yml | 173 + reference-deepwiki/.gitignore | 69 + reference-deepwiki/.python-version | 1 + reference-deepwiki/Dockerfile | 107 + reference-deepwiki/Dockerfile-ollama-local | 116 + reference-deepwiki/LICENSE | 21 + reference-deepwiki/Ollama-instruction.md | 189 + reference-deepwiki/README.es.md | 334 + reference-deepwiki/README.fr.md | 564 + reference-deepwiki/README.ja.md | 447 + reference-deepwiki/README.kr.md | 430 + reference-deepwiki/README.md | 651 ++ reference-deepwiki/README.pt-br.md | 510 + reference-deepwiki/README.ru.md | 509 + reference-deepwiki/README.vi.md | 423 + reference-deepwiki/README.zh-tw.md | 607 ++ reference-deepwiki/README.zh.md | 385 + reference-deepwiki/api/README.md | 199 + reference-deepwiki/api/__init__.py | 3 + reference-deepwiki/api/api.py | 634 ++ reference-deepwiki/api/azureai_client.py | 488 + reference-deepwiki/api/bedrock_client.py | 317 + reference-deepwiki/api/config.py | 387 + reference-deepwiki/api/config/embedder.json | 33 + .../api/config/embedder.json.bak | 19 + .../api/config/embedder.ollama.json.bak | 16 + .../embedder.openai_compatible.json.bak | 29 + reference-deepwiki/api/config/generator.json | 199 + reference-deepwiki/api/config/lang.json | 15 + reference-deepwiki/api/config/repo.json | 128 + reference-deepwiki/api/dashscope_client.py | 914 ++ reference-deepwiki/api/data_pipeline.py | 881 ++ .../api/google_embedder_client.py | 231 + reference-deepwiki/api/logging_config.py | 85 + reference-deepwiki/api/main.py | 79 + reference-deepwiki/api/ollama_patch.py | 105 + reference-deepwiki/api/openai_client.py | 629 ++ reference-deepwiki/api/openrouter_client.py | 525 + reference-deepwiki/api/prompts.py | 191 + reference-deepwiki/api/rag.py | 445 + reference-deepwiki/api/requirements.txt | 20 + reference-deepwiki/api/simple_chat.py | 689 ++ reference-deepwiki/api/tools/embedder.py | 54 + reference-deepwiki/api/websocket_wiki.py | 769 ++ .../deepwiki-open-main/.dockerignore | 60 + .../.github/workflows/docker-build-push.yml | 173 + .../deepwiki-open-main/.gitignore | 69 + .../deepwiki-open-main/.python-version | 1 + .../deepwiki-open-main/Dockerfile | 107 + .../Dockerfile-ollama-local | 116 + reference-deepwiki/deepwiki-open-main/LICENSE | 21 + .../deepwiki-open-main/Ollama-instruction.md | 189 + .../deepwiki-open-main/README.es.md | 334 + .../deepwiki-open-main/README.fr.md | 564 + .../deepwiki-open-main/README.ja.md | 447 + .../deepwiki-open-main/README.kr.md | 430 + .../deepwiki-open-main/README.md | 651 ++ .../deepwiki-open-main/README.pt-br.md | 510 + .../deepwiki-open-main/README.ru.md | 509 + .../deepwiki-open-main/README.vi.md | 423 + .../deepwiki-open-main/README.zh-tw.md | 607 ++ .../deepwiki-open-main/README.zh.md | 385 + .../deepwiki-open-main/api/README.md | 199 + .../deepwiki-open-main/api/__init__.py | 3 + .../deepwiki-open-main/api/api.py | 634 ++ .../deepwiki-open-main/api/azureai_client.py | 488 + .../deepwiki-open-main/api/bedrock_client.py | 317 + .../deepwiki-open-main/api/config.py | 387 + .../api/config/embedder.json | 33 + .../api/config/embedder.json.bak | 19 + .../api/config/embedder.ollama.json.bak | 16 + .../embedder.openai_compatible.json.bak | 29 + .../api/config/generator.json | 199 + .../deepwiki-open-main/api/config/lang.json | 15 + .../deepwiki-open-main/api/config/repo.json | 128 + .../api/dashscope_client.py | 914 ++ .../deepwiki-open-main/api/data_pipeline.py | 881 ++ .../api/google_embedder_client.py | 231 + .../deepwiki-open-main/api/logging_config.py | 85 + .../deepwiki-open-main/api/main.py | 79 + .../deepwiki-open-main/api/ollama_patch.py | 105 + .../deepwiki-open-main/api/openai_client.py | 629 ++ .../api/openrouter_client.py | 525 + .../deepwiki-open-main/api/prompts.py | 191 + .../deepwiki-open-main/api/rag.py | 445 + .../deepwiki-open-main/api/requirements.txt | 20 + .../deepwiki-open-main/api/simple_chat.py | 689 ++ .../deepwiki-open-main/api/tools/embedder.py | 54 + .../deepwiki-open-main/api/websocket_wiki.py | 769 ++ .../deepwiki-open-main/docker-compose.yml | 31 + .../deepwiki-open-main/eslint.config.mjs | 16 + .../deepwiki-open-main/next.config.ts | 70 + .../deepwiki-open-main/package-lock.json | 9594 +++++++++++++++++ .../deepwiki-open-main/package.json | 38 + .../deepwiki-open-main/postcss.config.mjs | 5 + .../deepwiki-open-main/public/file.svg | 1 + .../deepwiki-open-main/public/globe.svg | 1 + .../deepwiki-open-main/public/next.svg | 1 + .../deepwiki-open-main/public/vercel.svg | 1 + .../deepwiki-open-main/public/window.svg | 1 + .../deepwiki-open-main/pyproject.toml | 27 + .../deepwiki-open-main/pytest.ini | 15 + reference-deepwiki/deepwiki-open-main/run.sh | 1 + .../screenshots/DeepResearch.png | Bin 0 -> 100951 bytes .../screenshots/Deepwiki.png | Bin 0 -> 2133596 bytes .../screenshots/Interface.png | Bin 0 -> 143225 bytes .../deepwiki-open-main/screenshots/Ollama.png | Bin 0 -> 45701 bytes .../screenshots/privaterepo.png | Bin 0 -> 193287 bytes .../src/app/[owner]/[repo]/page.tsx | 2254 ++++ .../src/app/[owner]/[repo]/slides/page.tsx | 1299 +++ .../src/app/[owner]/[repo]/workshop/page.tsx | 633 ++ .../src/app/api/auth/status/route.ts | 31 + .../src/app/api/auth/validate/route.ts | 34 + .../src/app/api/chat/stream/route.ts | 113 + .../src/app/api/models/config/route.ts | 48 + .../src/app/api/wiki/projects/route.ts | 104 + .../deepwiki-open-main/src/app/favicon.ico | Bin 0 -> 25931 bytes .../deepwiki-open-main/src/app/globals.css | 148 + .../deepwiki-open-main/src/app/layout.tsx | 50 + .../deepwiki-open-main/src/app/page.tsx | 625 ++ .../src/app/wiki/projects/page.tsx | 19 + .../deepwiki-open-main/src/components/Ask.tsx | 928 ++ .../src/components/ConfigurationModal.tsx | 298 + .../src/components/Markdown.tsx | 208 + .../src/components/Mermaid.tsx | 491 + .../src/components/ModelSelectionModal.tsx | 259 + .../src/components/ProcessedProjects.tsx | 270 + .../src/components/TokenInput.tsx | 108 + .../src/components/UserSelector.tsx | 522 + .../src/components/WikiTreeView.tsx | 184 + .../src/components/WikiTypeSelector.tsx | 78 + .../src/components/theme-toggle.tsx | 49 + .../src/contexts/LanguageContext.tsx | 202 + .../src/hooks/useProcessedProjects.ts | 46 + .../deepwiki-open-main/src/i18n.ts | 14 + .../deepwiki-open-main/src/messages/en.json | 142 + .../deepwiki-open-main/src/messages/es.json | 133 + .../deepwiki-open-main/src/messages/fr.json | 143 + .../deepwiki-open-main/src/messages/ja.json | 133 + .../deepwiki-open-main/src/messages/kr.json | 133 + .../src/messages/pt-br.json | 142 + .../deepwiki-open-main/src/messages/ru.json | 142 + .../deepwiki-open-main/src/messages/vi.json | 133 + .../src/messages/zh-tw.json | 131 + .../deepwiki-open-main/src/messages/zh.json | 133 + .../deepwiki-open-main/src/types/repoinfo.tsx | 10 + .../src/types/wiki/wikipage.tsx | 13 + .../src/types/wiki/wikistructure.tsx | 11 + .../src/utils/getRepoUrl.tsx | 17 + .../src/utils/urlDecoder.tsx | 19 + .../src/utils/websocketClient.ts | 85 + .../deepwiki-open-main/tailwind.config.js | 8 + .../deepwiki-open-main/test/__init__.py | 1 + .../test/test_extract_repo_name.py | 118 + .../deepwiki-open-main/tests/README.md | 126 + .../deepwiki-open-main/tests/__init__.py | 1 + .../deepwiki-open-main/tests/api/__init__.py | 1 + .../deepwiki-open-main/tests/api/test_api.py | 70 + .../tests/integration/__init__.py | 1 + .../integration/test_full_integration.py | 152 + .../deepwiki-open-main/tests/run_tests.py | 163 + .../deepwiki-open-main/tests/unit/__init__.py | 1 + .../tests/unit/test_all_embedders.py | 464 + .../tests/unit/test_google_embedder.py | 183 + .../deepwiki-open-main/tsconfig.json | 27 + reference-deepwiki/deepwiki-open-main/uv.lock | 1545 +++ .../deepwiki-open-main/yarn.lock | 5172 +++++++++ reference-deepwiki/docker-compose.yml | 31 + reference-deepwiki/eslint.config.mjs | 16 + reference-deepwiki/next.config.ts | 70 + reference-deepwiki/package-lock.json | 9594 +++++++++++++++++ reference-deepwiki/package.json | 38 + reference-deepwiki/postcss.config.mjs | 5 + reference-deepwiki/public/file.svg | 1 + reference-deepwiki/public/globe.svg | 1 + reference-deepwiki/public/next.svg | 1 + reference-deepwiki/public/vercel.svg | 1 + reference-deepwiki/public/window.svg | 1 + reference-deepwiki/pyproject.toml | 27 + reference-deepwiki/pytest.ini | 15 + reference-deepwiki/run.sh | 1 + .../screenshots/DeepResearch.png | Bin 0 -> 100951 bytes reference-deepwiki/screenshots/Deepwiki.png | Bin 0 -> 2133596 bytes reference-deepwiki/screenshots/Interface.png | Bin 0 -> 143225 bytes reference-deepwiki/screenshots/Ollama.png | Bin 0 -> 45701 bytes .../screenshots/privaterepo.png | Bin 0 -> 193287 bytes .../src/app/[owner]/[repo]/page.tsx | 2254 ++++ .../src/app/[owner]/[repo]/slides/page.tsx | 1299 +++ .../src/app/[owner]/[repo]/workshop/page.tsx | 633 ++ .../src/app/api/auth/status/route.ts | 31 + .../src/app/api/auth/validate/route.ts | 34 + .../src/app/api/chat/stream/route.ts | 113 + .../src/app/api/models/config/route.ts | 48 + .../src/app/api/wiki/projects/route.ts | 104 + reference-deepwiki/src/app/favicon.ico | Bin 0 -> 25931 bytes reference-deepwiki/src/app/globals.css | 148 + reference-deepwiki/src/app/layout.tsx | 50 + reference-deepwiki/src/app/page.tsx | 625 ++ .../src/app/wiki/projects/page.tsx | 19 + reference-deepwiki/src/components/Ask.tsx | 928 ++ .../src/components/ConfigurationModal.tsx | 298 + .../src/components/Markdown.tsx | 208 + reference-deepwiki/src/components/Mermaid.tsx | 491 + .../src/components/ModelSelectionModal.tsx | 259 + .../src/components/ProcessedProjects.tsx | 270 + .../src/components/TokenInput.tsx | 108 + .../src/components/UserSelector.tsx | 522 + .../src/components/WikiTreeView.tsx | 184 + .../src/components/WikiTypeSelector.tsx | 78 + .../src/components/theme-toggle.tsx | 49 + .../src/contexts/LanguageContext.tsx | 202 + .../src/hooks/useProcessedProjects.ts | 46 + reference-deepwiki/src/i18n.ts | 14 + reference-deepwiki/src/messages/en.json | 142 + reference-deepwiki/src/messages/es.json | 133 + reference-deepwiki/src/messages/fr.json | 143 + reference-deepwiki/src/messages/ja.json | 133 + reference-deepwiki/src/messages/kr.json | 133 + reference-deepwiki/src/messages/pt-br.json | 142 + reference-deepwiki/src/messages/ru.json | 142 + reference-deepwiki/src/messages/vi.json | 133 + reference-deepwiki/src/messages/zh-tw.json | 131 + reference-deepwiki/src/messages/zh.json | 133 + reference-deepwiki/src/types/repoinfo.tsx | 10 + .../src/types/wiki/wikipage.tsx | 13 + .../src/types/wiki/wikistructure.tsx | 11 + reference-deepwiki/src/utils/getRepoUrl.tsx | 17 + reference-deepwiki/src/utils/urlDecoder.tsx | 19 + .../src/utils/websocketClient.ts | 85 + reference-deepwiki/tailwind.config.js | 8 + reference-deepwiki/test/__init__.py | 1 + .../test/test_extract_repo_name.py | 118 + reference-deepwiki/tests/README.md | 126 + reference-deepwiki/tests/__init__.py | 1 + reference-deepwiki/tests/api/__init__.py | 1 + reference-deepwiki/tests/api/test_api.py | 70 + .../tests/integration/__init__.py | 1 + .../integration/test_full_integration.py | 152 + reference-deepwiki/tests/run_tests.py | 163 + reference-deepwiki/tests/unit/__init__.py | 1 + .../tests/unit/test_all_embedders.py | 464 + .../tests/unit/test_google_embedder.py | 183 + reference-deepwiki/tsconfig.json | 27 + reference-deepwiki/uv.lock | 1545 +++ reference-deepwiki/yarn.lock | 5172 +++++++++ src-tauri/Cargo.toml | 27 + src-tauri/build.rs | 4 + src-tauri/src/lib.rs | 16 + src-tauri/src/main.rs | 10 + src-tauri/tauri.conf.json | 60 + src/App.tsx | 26 + src/components/Layout.tsx | 18 + src/components/Sidebar.tsx | 66 + src/main.tsx | 11 + src/pages/ChatPage.tsx | 156 + src/pages/HomePage.tsx | 104 + src/pages/QualityPage.tsx | 53 + src/pages/SettingsPage.tsx | 113 + src/pages/WikiPage.tsx | 119 + src/styles/index.css | 52 + tailwind.config.js | 28 + tsconfig.json | 32 + tsconfig.node.json | 12 + vite.config.ts | 35 + 278 files changed, 95138 insertions(+) create mode 100644 .gitignore create mode 100644 DEVELOPMENT_PLAN.md create mode 100644 QUICKSTART.md create mode 100644 README.md create mode 100644 api/__init__.py create mode 100644 api/api.py create mode 100644 api/config.py create mode 100644 api/main.py create mode 100644 api/requirements.txt create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 reference-deepwiki/.dockerignore create mode 100644 reference-deepwiki/.github/workflows/docker-build-push.yml create mode 100644 reference-deepwiki/.gitignore create mode 100644 reference-deepwiki/.python-version create mode 100644 reference-deepwiki/Dockerfile create mode 100644 reference-deepwiki/Dockerfile-ollama-local create mode 100644 reference-deepwiki/LICENSE create mode 100644 reference-deepwiki/Ollama-instruction.md create mode 100644 reference-deepwiki/README.es.md create mode 100644 reference-deepwiki/README.fr.md create mode 100644 reference-deepwiki/README.ja.md create mode 100644 reference-deepwiki/README.kr.md create mode 100644 reference-deepwiki/README.md create mode 100644 reference-deepwiki/README.pt-br.md create mode 100644 reference-deepwiki/README.ru.md create mode 100644 reference-deepwiki/README.vi.md create mode 100644 reference-deepwiki/README.zh-tw.md create mode 100644 reference-deepwiki/README.zh.md create mode 100644 reference-deepwiki/api/README.md create mode 100644 reference-deepwiki/api/__init__.py create mode 100644 reference-deepwiki/api/api.py create mode 100644 reference-deepwiki/api/azureai_client.py create mode 100644 reference-deepwiki/api/bedrock_client.py create mode 100644 reference-deepwiki/api/config.py create mode 100644 reference-deepwiki/api/config/embedder.json create mode 100644 reference-deepwiki/api/config/embedder.json.bak create mode 100644 reference-deepwiki/api/config/embedder.ollama.json.bak create mode 100644 reference-deepwiki/api/config/embedder.openai_compatible.json.bak create mode 100644 reference-deepwiki/api/config/generator.json create mode 100644 reference-deepwiki/api/config/lang.json create mode 100644 reference-deepwiki/api/config/repo.json create mode 100644 reference-deepwiki/api/dashscope_client.py create mode 100644 reference-deepwiki/api/data_pipeline.py create mode 100644 reference-deepwiki/api/google_embedder_client.py create mode 100644 reference-deepwiki/api/logging_config.py create mode 100644 reference-deepwiki/api/main.py create mode 100644 reference-deepwiki/api/ollama_patch.py create mode 100644 reference-deepwiki/api/openai_client.py create mode 100644 reference-deepwiki/api/openrouter_client.py create mode 100644 reference-deepwiki/api/prompts.py create mode 100644 reference-deepwiki/api/rag.py create mode 100644 reference-deepwiki/api/requirements.txt create mode 100644 reference-deepwiki/api/simple_chat.py create mode 100644 reference-deepwiki/api/tools/embedder.py create mode 100644 reference-deepwiki/api/websocket_wiki.py create mode 100644 reference-deepwiki/deepwiki-open-main/.dockerignore create mode 100644 reference-deepwiki/deepwiki-open-main/.github/workflows/docker-build-push.yml create mode 100644 reference-deepwiki/deepwiki-open-main/.gitignore create mode 100644 reference-deepwiki/deepwiki-open-main/.python-version create mode 100644 reference-deepwiki/deepwiki-open-main/Dockerfile create mode 100644 reference-deepwiki/deepwiki-open-main/Dockerfile-ollama-local create mode 100644 reference-deepwiki/deepwiki-open-main/LICENSE create mode 100644 reference-deepwiki/deepwiki-open-main/Ollama-instruction.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.es.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.fr.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.ja.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.kr.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.pt-br.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.ru.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.vi.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.zh-tw.md create mode 100644 reference-deepwiki/deepwiki-open-main/README.zh.md create mode 100644 reference-deepwiki/deepwiki-open-main/api/README.md create mode 100644 reference-deepwiki/deepwiki-open-main/api/__init__.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/api.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/azureai_client.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/bedrock_client.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/config.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/config/embedder.json create mode 100644 reference-deepwiki/deepwiki-open-main/api/config/embedder.json.bak create mode 100644 reference-deepwiki/deepwiki-open-main/api/config/embedder.ollama.json.bak create mode 100644 reference-deepwiki/deepwiki-open-main/api/config/embedder.openai_compatible.json.bak create mode 100644 reference-deepwiki/deepwiki-open-main/api/config/generator.json create mode 100644 reference-deepwiki/deepwiki-open-main/api/config/lang.json create mode 100644 reference-deepwiki/deepwiki-open-main/api/config/repo.json create mode 100644 reference-deepwiki/deepwiki-open-main/api/dashscope_client.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/data_pipeline.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/google_embedder_client.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/logging_config.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/main.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/ollama_patch.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/openai_client.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/openrouter_client.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/prompts.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/rag.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/requirements.txt create mode 100644 reference-deepwiki/deepwiki-open-main/api/simple_chat.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/tools/embedder.py create mode 100644 reference-deepwiki/deepwiki-open-main/api/websocket_wiki.py create mode 100644 reference-deepwiki/deepwiki-open-main/docker-compose.yml create mode 100644 reference-deepwiki/deepwiki-open-main/eslint.config.mjs create mode 100644 reference-deepwiki/deepwiki-open-main/next.config.ts create mode 100644 reference-deepwiki/deepwiki-open-main/package-lock.json create mode 100644 reference-deepwiki/deepwiki-open-main/package.json create mode 100644 reference-deepwiki/deepwiki-open-main/postcss.config.mjs create mode 100644 reference-deepwiki/deepwiki-open-main/public/file.svg create mode 100644 reference-deepwiki/deepwiki-open-main/public/globe.svg create mode 100644 reference-deepwiki/deepwiki-open-main/public/next.svg create mode 100644 reference-deepwiki/deepwiki-open-main/public/vercel.svg create mode 100644 reference-deepwiki/deepwiki-open-main/public/window.svg create mode 100644 reference-deepwiki/deepwiki-open-main/pyproject.toml create mode 100644 reference-deepwiki/deepwiki-open-main/pytest.ini create mode 100644 reference-deepwiki/deepwiki-open-main/run.sh create mode 100644 reference-deepwiki/deepwiki-open-main/screenshots/DeepResearch.png create mode 100644 reference-deepwiki/deepwiki-open-main/screenshots/Deepwiki.png create mode 100644 reference-deepwiki/deepwiki-open-main/screenshots/Interface.png create mode 100644 reference-deepwiki/deepwiki-open-main/screenshots/Ollama.png create mode 100644 reference-deepwiki/deepwiki-open-main/screenshots/privaterepo.png create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/page.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/slides/page.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/workshop/page.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/api/auth/status/route.ts create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/api/auth/validate/route.ts create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/api/chat/stream/route.ts create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/api/models/config/route.ts create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/api/wiki/projects/route.ts create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/favicon.ico create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/globals.css create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/layout.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/page.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/app/wiki/projects/page.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/Ask.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/ConfigurationModal.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/Markdown.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/Mermaid.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/ModelSelectionModal.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/ProcessedProjects.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/TokenInput.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/UserSelector.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/WikiTreeView.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/WikiTypeSelector.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/components/theme-toggle.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/contexts/LanguageContext.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/hooks/useProcessedProjects.ts create mode 100644 reference-deepwiki/deepwiki-open-main/src/i18n.ts create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/en.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/es.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/fr.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/ja.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/kr.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/pt-br.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/ru.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/vi.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/zh-tw.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/messages/zh.json create mode 100644 reference-deepwiki/deepwiki-open-main/src/types/repoinfo.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/types/wiki/wikipage.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/types/wiki/wikistructure.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/utils/getRepoUrl.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/utils/urlDecoder.tsx create mode 100644 reference-deepwiki/deepwiki-open-main/src/utils/websocketClient.ts create mode 100644 reference-deepwiki/deepwiki-open-main/tailwind.config.js create mode 100644 reference-deepwiki/deepwiki-open-main/test/__init__.py create mode 100644 reference-deepwiki/deepwiki-open-main/test/test_extract_repo_name.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/README.md create mode 100644 reference-deepwiki/deepwiki-open-main/tests/__init__.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/api/__init__.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/api/test_api.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/integration/__init__.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/integration/test_full_integration.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/run_tests.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/unit/__init__.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/unit/test_all_embedders.py create mode 100644 reference-deepwiki/deepwiki-open-main/tests/unit/test_google_embedder.py create mode 100644 reference-deepwiki/deepwiki-open-main/tsconfig.json create mode 100644 reference-deepwiki/deepwiki-open-main/uv.lock create mode 100644 reference-deepwiki/deepwiki-open-main/yarn.lock create mode 100644 reference-deepwiki/docker-compose.yml create mode 100644 reference-deepwiki/eslint.config.mjs create mode 100644 reference-deepwiki/next.config.ts create mode 100644 reference-deepwiki/package-lock.json create mode 100644 reference-deepwiki/package.json create mode 100644 reference-deepwiki/postcss.config.mjs create mode 100644 reference-deepwiki/public/file.svg create mode 100644 reference-deepwiki/public/globe.svg create mode 100644 reference-deepwiki/public/next.svg create mode 100644 reference-deepwiki/public/vercel.svg create mode 100644 reference-deepwiki/public/window.svg create mode 100644 reference-deepwiki/pyproject.toml create mode 100644 reference-deepwiki/pytest.ini create mode 100644 reference-deepwiki/run.sh create mode 100644 reference-deepwiki/screenshots/DeepResearch.png create mode 100644 reference-deepwiki/screenshots/Deepwiki.png create mode 100644 reference-deepwiki/screenshots/Interface.png create mode 100644 reference-deepwiki/screenshots/Ollama.png create mode 100644 reference-deepwiki/screenshots/privaterepo.png create mode 100644 reference-deepwiki/src/app/[owner]/[repo]/page.tsx create mode 100644 reference-deepwiki/src/app/[owner]/[repo]/slides/page.tsx create mode 100644 reference-deepwiki/src/app/[owner]/[repo]/workshop/page.tsx create mode 100644 reference-deepwiki/src/app/api/auth/status/route.ts create mode 100644 reference-deepwiki/src/app/api/auth/validate/route.ts create mode 100644 reference-deepwiki/src/app/api/chat/stream/route.ts create mode 100644 reference-deepwiki/src/app/api/models/config/route.ts create mode 100644 reference-deepwiki/src/app/api/wiki/projects/route.ts create mode 100644 reference-deepwiki/src/app/favicon.ico create mode 100644 reference-deepwiki/src/app/globals.css create mode 100644 reference-deepwiki/src/app/layout.tsx create mode 100644 reference-deepwiki/src/app/page.tsx create mode 100644 reference-deepwiki/src/app/wiki/projects/page.tsx create mode 100644 reference-deepwiki/src/components/Ask.tsx create mode 100644 reference-deepwiki/src/components/ConfigurationModal.tsx create mode 100644 reference-deepwiki/src/components/Markdown.tsx create mode 100644 reference-deepwiki/src/components/Mermaid.tsx create mode 100644 reference-deepwiki/src/components/ModelSelectionModal.tsx create mode 100644 reference-deepwiki/src/components/ProcessedProjects.tsx create mode 100644 reference-deepwiki/src/components/TokenInput.tsx create mode 100644 reference-deepwiki/src/components/UserSelector.tsx create mode 100644 reference-deepwiki/src/components/WikiTreeView.tsx create mode 100644 reference-deepwiki/src/components/WikiTypeSelector.tsx create mode 100644 reference-deepwiki/src/components/theme-toggle.tsx create mode 100644 reference-deepwiki/src/contexts/LanguageContext.tsx create mode 100644 reference-deepwiki/src/hooks/useProcessedProjects.ts create mode 100644 reference-deepwiki/src/i18n.ts create mode 100644 reference-deepwiki/src/messages/en.json create mode 100644 reference-deepwiki/src/messages/es.json create mode 100644 reference-deepwiki/src/messages/fr.json create mode 100644 reference-deepwiki/src/messages/ja.json create mode 100644 reference-deepwiki/src/messages/kr.json create mode 100644 reference-deepwiki/src/messages/pt-br.json create mode 100644 reference-deepwiki/src/messages/ru.json create mode 100644 reference-deepwiki/src/messages/vi.json create mode 100644 reference-deepwiki/src/messages/zh-tw.json create mode 100644 reference-deepwiki/src/messages/zh.json create mode 100644 reference-deepwiki/src/types/repoinfo.tsx create mode 100644 reference-deepwiki/src/types/wiki/wikipage.tsx create mode 100644 reference-deepwiki/src/types/wiki/wikistructure.tsx create mode 100644 reference-deepwiki/src/utils/getRepoUrl.tsx create mode 100644 reference-deepwiki/src/utils/urlDecoder.tsx create mode 100644 reference-deepwiki/src/utils/websocketClient.ts create mode 100644 reference-deepwiki/tailwind.config.js create mode 100644 reference-deepwiki/test/__init__.py create mode 100644 reference-deepwiki/test/test_extract_repo_name.py create mode 100644 reference-deepwiki/tests/README.md create mode 100644 reference-deepwiki/tests/__init__.py create mode 100644 reference-deepwiki/tests/api/__init__.py create mode 100644 reference-deepwiki/tests/api/test_api.py create mode 100644 reference-deepwiki/tests/integration/__init__.py create mode 100644 reference-deepwiki/tests/integration/test_full_integration.py create mode 100644 reference-deepwiki/tests/run_tests.py create mode 100644 reference-deepwiki/tests/unit/__init__.py create mode 100644 reference-deepwiki/tests/unit/test_all_embedders.py create mode 100644 reference-deepwiki/tests/unit/test_google_embedder.py create mode 100644 reference-deepwiki/tsconfig.json create mode 100644 reference-deepwiki/uv.lock create mode 100644 reference-deepwiki/yarn.lock create mode 100644 src-tauri/Cargo.toml create mode 100644 src-tauri/build.rs create mode 100644 src-tauri/src/lib.rs create mode 100644 src-tauri/src/main.rs create mode 100644 src-tauri/tauri.conf.json create mode 100644 src/App.tsx create mode 100644 src/components/Layout.tsx create mode 100644 src/components/Sidebar.tsx create mode 100644 src/main.tsx create mode 100644 src/pages/ChatPage.tsx create mode 100644 src/pages/HomePage.tsx create mode 100644 src/pages/QualityPage.tsx create mode 100644 src/pages/SettingsPage.tsx create mode 100644 src/pages/WikiPage.tsx create mode 100644 src/styles/index.css create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..038c486 --- /dev/null +++ b/.gitignore @@ -0,0 +1,65 @@ +# Dependencies +node_modules/ +/target + +# Build outputs +dist/ +dist-ssr/ +build/ +*.local + +# Environment variables +.env +.env.local +.env.*.local + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +.venv/ +venv/ +ENV/ +env/ +*.egg-info/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Tauri +src-tauri/target/ +src-tauri/Cargo.lock + +# Database and cache +*.pkl +*.db +*.sqlite +.adalflow/ + +# Testing +coverage/ +.coverage +*.cover +.pytest_cache/ + +# Temporary files +*.tmp +*.temp + diff --git a/DEVELOPMENT_PLAN.md b/DEVELOPMENT_PLAN.md new file mode 100644 index 0000000..fb13245 --- /dev/null +++ b/DEVELOPMENT_PLAN.md @@ -0,0 +1,651 @@ +# 红山智能开发助手 - 详细开发计划 + +## 📋 项目概览 + +**项目名称**: 红山智能开发助手 (Red Mountain Intelligent Development Assistant) +**项目周期**: 约 12-16 周 +**技术栈**: Tauri + React + TypeScript + Python FastAPI +**目标**: 构建一款专为红山开源平台打造的智能开发辅助工具 + +## 🎯 核心目标 + +1. **智能问答助手** - 提供红山平台相关的智能问答支持 +2. **代码仓库分析** - 类似 DeepWiki,自动生成文档和可视化 +3. **质量分析** - 基于大模型的代码质量和缺陷检测 +4. **平台集成** - 深度集成红山开源平台 API + +## 📅 详细开发计划 + +### 第一阶段:基础框架搭建 ✅ (1-2 周) + +**状态**: 已完成 + +#### 任务清单 + +- [x] **前端框架搭建** + - [x] 初始化 Vite + React + TypeScript 项目 + - [x] 配置 Tauri 桌面应用框架 + - [x] 集成 Tailwind CSS + - [x] 配置 React Router 路由系统 + - [x] 设置 TypeScript 严格模式 + +- [x] **UI 界面设计** + - [x] 设计侧边栏导航组件 + - [x] 创建主要页面布局(首页、问答、分析、质量、设置) + - [x] 实现响应式设计 + - [x] 添加暗色主题支持 + +- [x] **后端 API 框架** + - [x] 初始化 FastAPI 项目结构 + - [x] 配置 CORS 跨域支持 + - [x] 设计 API 端点结构 + - [x] 实现健康检查接口 + +- [x] **配置管理系统** + - [x] 环境变量配置 + - [x] API 密钥管理 + - [x] 多模型提供商支持配置 + +#### 交付物 +- ✅ 可运行的前端界面 Demo +- ✅ 基础后端 API 框架 +- ✅ 项目文档和 README + +--- + +### 第二阶段:核心功能实现 (2-4 周) + +**状态**: 开发中 + +#### 2.1 RAG 智能问答系统 (1.5 周) + +**目标**: 实现基于 RAG 的智能问答功能 + +##### 任务清单 + +- [ ] **RAG 核心模块** + - [ ] 参考 DeepWiki 的 `rag.py` 实现 + - [ ] 集成 adalflow 框架 + - [ ] 实现向量嵌入生成 + - [ ] 配置 FAISS 向量数据库 + - [ ] 实现文档检索功能 + +- [ ] **对话管理** + - [ ] 实现对话历史管理 + - [ ] 支持上下文记忆 + - [ ] 实现多轮对话 + - [ ] 添加对话导出功能 + +- [ ] **LLM 集成** + - [ ] 集成 OpenAI GPT 模型 + - [ ] 集成 Google Gemini 模型 + - [ ] 支持 Azure OpenAI + - [ ] 支持 Ollama 本地模型 + - [ ] 实现模型切换功能 + +- [ ] **前后端联调** + - [ ] 实现 WebSocket 流式输出 + - [ ] 优化响应速度 + - [ ] 添加错误处理 + - [ ] 实现加载状态显示 + +##### 技术要点 + +```python +# 参考 DeepWiki 的 RAG 实现 +class RAG: + def __init__(self, provider, model): + self.embedder = get_embedder() + self.retriever = FAISSRetriever() + self.generator = Generator() + + def call(self, query: str): + # 1. 检索相关文档 + docs = self.retriever(query) + # 2. 生成回答 + answer = self.generator(query, docs) + return answer +``` + +##### 验收标准 +- 能够正常进行多轮对话 +- 支持至少 2 种 LLM 提供商 +- 流式输出延迟 < 2 秒 +- 回答质量符合预期 + +--- + +#### 2.2 代码仓库分析功能 (1.5 周) + +**目标**: 实现类似 DeepWiki 的代码仓库分析 + +##### 任务清单 + +- [ ] **仓库处理模块** + - [ ] 参考 DeepWiki 的 `data_pipeline.py` + - [ ] 实现 Git 仓库克隆 + - [ ] 支持 GitHub/GitLab/Bitbucket + - [ ] 支持私有仓库(Token 认证) + - [ ] 实现文件过滤和排除 + +- [ ] **代码解析** + - [ ] 实现代码文件读取 + - [ ] Token 计数和限制 + - [ ] 代码分块处理 + - [ ] 生成代码嵌入向量 + +- [ ] **文档生成** + - [ ] 分析代码结构 + - [ ] 生成项目概述 + - [ ] 生成 API 文档 + - [ ] 生成架构说明 + +- [ ] **可视化** + - [ ] 集成 Mermaid 图表 + - [ ] 生成架构图 + - [ ] 生成数据流图 + - [ ] 生成依赖关系图 + +- [ ] **前端展示** + - [ ] 仓库信息展示 + - [ ] 文档树形导航 + - [ ] Markdown 渲染 + - [ ] 图表交互 + +##### 技术架构 + +``` +Repository Input + ↓ +Clone Repository (Git) + ↓ +Read & Filter Files + ↓ +Text Splitting + ↓ +Generate Embeddings + ↓ +Store in Vector DB + ↓ +AI Analysis & Doc Generation + ↓ +Render in UI +``` + +##### 验收标准 +- 能够分析公开和私有仓库 +- 支持 3 种代码托管平台 +- 生成的文档结构清晰 +- 图表渲染正确 + +--- + +#### 2.3 数据持久化 (0.5 周) + +**目标**: 实现数据的本地存储 + +##### 任务清单 + +- [ ] **本地数据库** + - [ ] 实现 LocalDB 封装 + - [ ] 向量数据持久化 + - [ ] 对话历史存储 + - [ ] 分析结果缓存 + +- [ ] **数据管理** + - [ ] 实现数据清理 + - [ ] 实现数据导出 + - [ ] 实现数据迁移 + +##### 验收标准 +- 数据能够正确持久化 +- 重启后数据不丢失 +- 支持数据清理和导出 + +--- + +### 第三阶段:红山平台集成 (2-3 周) + +**状态**: 规划中 + +#### 3.1 平台 API 集成 (1 周) + +**目标**: 与红山开源平台 API 深度集成 + +##### 任务清单 + +- [ ] **API 客户端开发** + - [ ] 实现红山平台 API 客户端 + - [ ] 支持用户认证 + - [ ] 实现项目信息获取 + - [ ] 实现代码仓库访问 + +- [ ] **权限管理** + - [ ] 实现 OAuth2 认证 + - [ ] Token 管理 + - [ ] 权限验证 + +##### 技术要点 + +```python +class RedMountainClient: + def __init__(self, api_key): + self.base_url = "https://api.redmountain.com" + self.api_key = api_key + + def get_projects(self, user_id): + # 获取用户项目列表 + pass + + def get_repository(self, repo_id): + # 获取仓库信息 + pass +``` + +##### 验收标准 +- 能够正常访问平台 API +- 认证流程完整 +- 错误处理完善 + +--- + +#### 3.2 项目管理功能 (1-2 周) + +**目标**: 提供红山平台项目的管理功能 + +##### 任务清单 + +- [ ] **项目列表** + - [ ] 显示用户项目列表 + - [ ] 支持项目搜索 + - [ ] 支持项目筛选 + - [ ] 项目详情查看 + +- [ ] **快速操作** + - [ ] 一键分析项目代码 + - [ ] 快速生成项目文档 + - [ ] 项目质量报告 + - [ ] 问题追踪集成 + +- [ ] **UI 设计** + - [ ] 设计项目管理页面 + - [ ] 实现项目卡片组件 + - [ ] 添加操作按钮 + - [ ] 状态指示器 + +##### 验收标准 +- 项目列表正确显示 +- 操作响应及时 +- UI 友好易用 + +--- + +### 第四阶段:质量检测系统 (3-4 周) + +**状态**: 规划中 + +#### 4.1 代码质量分析 (1.5 周) + +**目标**: 基于 AI 的代码质量评估 + +##### 任务清单 + +- [ ] **静态分析** + - [ ] 集成 Pylint/ESLint + - [ ] 代码复杂度分析 + - [ ] 代码风格检查 + - [ ] 重复代码检测 + +- [ ] **AI 质量评估** + - [ ] 使用 LLM 分析代码 + - [ ] 评估代码可读性 + - [ ] 评估代码可维护性 + - [ ] 生成改进建议 + +- [ ] **质量指标** + - [ ] 定义质量评分标准 + - [ ] 计算综合质量分 + - [ ] 生成质量报告 + +##### Prompt 设计 + +```python +quality_analysis_prompt = """ +分析以下代码的质量,从以下维度评估: +1. 代码可读性(1-10分) +2. 代码复杂度(1-10分) +3. 最佳实践遵循度(1-10分) +4. 潜在问题 +5. 改进建议 + +代码: +{code} +""" +``` + +##### 验收标准 +- 能够分析多种编程语言 +- 评估结果准确合理 +- 建议具有实用性 + +--- + +#### 4.2 缺陷检测 (1 周) + +**目标**: 智能识别代码中的潜在缺陷 + +##### 任务清单 + +- [ ] **缺陷检测引擎** + - [ ] 空指针检测 + - [ ] 资源泄漏检测 + - [ ] 并发问题检测 + - [ ] 逻辑错误检测 + +- [ ] **AI 辅助检测** + - [ ] 使用 LLM 发现隐藏缺陷 + - [ ] 分析异常处理 + - [ ] 检测边界条件问题 + +##### 验收标准 +- 能够检测常见缺陷类型 +- 误报率 < 20% +- 提供修复建议 + +--- + +#### 4.3 安全漏洞扫描 (1 周) + +**目标**: 检测常见的安全漏洞 + +##### 任务清单 + +- [ ] **安全扫描** + - [ ] SQL 注入检测 + - [ ] XSS 漏洞检测 + - [ ] CSRF 漏洞检测 + - [ ] 敏感信息泄露检测 + +- [ ] **依赖安全** + - [ ] 检查依赖版本 + - [ ] 识别已知漏洞 + - [ ] 建议安全版本 + +##### 验收标准 +- 能够检测主要安全漏洞 +- 提供安全等级评估 +- 给出修复方案 + +--- + +#### 4.4 报告生成 (0.5 周) + +**目标**: 生成详细的质量分析报告 + +##### 任务清单 + +- [ ] **报告模板** + - [ ] 设计报告结构 + - [ ] 实现 PDF 导出 + - [ ] 实现 Markdown 导出 + - [ ] 实现 HTML 导出 + +- [ ] **数据可视化** + - [ ] 质量趋势图 + - [ ] 问题分布图 + - [ ] 对比分析图 + +##### 验收标准 +- 报告内容完整 +- 格式美观专业 +- 支持多种导出格式 + +--- + +### 第五阶段:优化和发布 (1-2 周) + +**状态**: 规划中 + +#### 5.1 性能优化 (0.5 周) + +##### 任务清单 + +- [ ] **前端优化** + - [ ] 代码分割 + - [ ] 懒加载 + - [ ] 缓存优化 + - [ ] 打包优化 + +- [ ] **后端优化** + - [ ] API 响应优化 + - [ ] 数据库查询优化 + - [ ] 并发处理 + - [ ] 缓存策略 + +##### 性能目标 +- 首屏加载 < 2 秒 +- API 响应 < 1 秒 +- 内存占用 < 500MB + +--- + +#### 5.2 用户体验改进 (0.5 周) + +##### 任务清单 + +- [ ] **交互优化** + - [ ] 添加加载动画 + - [ ] 优化错误提示 + - [ ] 添加操作引导 + - [ ] 快捷键支持 + +- [ ] **界面美化** + - [ ] 统一视觉风格 + - [ ] 优化配色方案 + - [ ] 添加图标和插画 + +##### 验收标准 +- 用户操作流畅 +- 反馈及时明确 +- 界面美观统一 + +--- + +#### 5.3 测试和质量保证 (0.5 周) + +##### 任务清单 + +- [ ] **单元测试** + - [ ] 前端组件测试 + - [ ] 后端 API 测试 + - [ ] 核心功能测试 + +- [ ] **集成测试** + - [ ] 端到端测试 + - [ ] 用户场景测试 + +- [ ] **性能测试** + - [ ] 压力测试 + - [ ] 负载测试 + +##### 测试目标 +- 代码覆盖率 > 70% +- 核心功能无严重 Bug +- 性能指标达标 + +--- + +#### 5.4 文档和发布 (0.5 周) + +##### 任务清单 + +- [ ] **文档编写** + - [ ] 用户手册 + - [ ] 开发文档 + - [ ] API 文档 + - [ ] 部署文档 + +- [ ] **发布准备** + - [ ] 打包桌面应用 + - [ ] 准备安装包 + - [ ] 编写更新日志 + - [ ] 准备宣传材料 + +##### 交付物 +- 正式版本 v1.0.0 +- 完整文档 +- 安装包(Windows/macOS/Linux) + +--- + +## 🛠️ 技术实现细节 + +### 前端架构设计 + +```typescript +// 状态管理 (Zustand) +interface AppState { + settings: Settings; + conversations: Conversation[]; + repositories: Repository[]; + updateSettings: (settings: Settings) => void; + addConversation: (conv: Conversation) => void; +} + +// API 客户端 +class ApiClient { + async chat(message: string): Promise {} + async analyzeRepo(repo: RepoRequest): Promise {} + async checkQuality(repo: string): Promise {} +} +``` + +### 后端架构设计 + +```python +# FastAPI 路由结构 +/api/ + /chat/ + POST / # 发送消息 + GET /history # 获取历史 + /repo/ + POST /analyze # 分析仓库 + GET /status # 获取状态 + /quality/ + POST /analyze # 质量分析 + POST /detect # 缺陷检测 + POST /security # 安全扫描 +``` + +--- + +## 📊 项目里程碑 + +| 阶段 | 目标 | 完成时间 | 状态 | +|------|------|----------|------| +| 第一阶段 | 基础框架搭建 | 第 2 周 | ✅ 已完成 | +| 第二阶段 | 核心功能实现 | 第 6 周 | 🔄 进行中 | +| 第三阶段 | 平台集成 | 第 9 周 | 📅 计划中 | +| 第四阶段 | 质量检测 | 第 13 周 | 📅 计划中 | +| 第五阶段 | 优化发布 | 第 15 周 | 📅 计划中 | + +--- + +## 🎓 技术学习资源 + +### DeepWiki 参考 + +- 重点学习文件: + - `api/rag.py` - RAG 实现 + - `api/data_pipeline.py` - 数据处理 + - `api/config.py` - 配置管理 + - `src/components/WikiTreeView.tsx` - 文档展示 + +### 推荐阅读 + +- [adalflow 文档](https://github.com/SylphAI-Inc/AdalFlow) +- [FAISS 向量检索](https://github.com/facebookresearch/faiss) +- [Tauri 文档](https://tauri.app/) +- [FastAPI 文档](https://fastapi.tiangolo.com/) + +--- + +## 🤝 团队协作 + +### 角色分工 + +- **前端开发**: React/TypeScript 界面实现 +- **后端开发**: Python API 和 AI 集成 +- **Rust 开发**: Tauri 桌面应用功能 +- **AI 工程师**: RAG 和模型调优 +- **测试工程师**: 质量保证和测试 + +### 开发流程 + +1. **Sprint 规划** - 每两周一个迭代 +2. **每日站会** - 同步进度和问题 +3. **代码审查** - PR 合并前必须审查 +4. **持续集成** - 自动化测试和构建 + +--- + +## 📈 成功指标 + +### 功能指标 +- ✅ 支持 3+ 种 LLM 提供商 +- ✅ 支持 3 种代码托管平台 +- 🎯 问答准确率 > 85% +- 🎯 代码分析覆盖率 > 90% +- 🎯 质量检测准确率 > 80% + +### 性能指标 +- 🎯 首屏加载 < 2s +- 🎯 API 响应 < 1s +- 🎯 内存占用 < 500MB +- 🎯 应用启动 < 3s + +### 用户体验指标 +- 🎯 界面美观度 > 8/10 +- 🎯 易用性评分 > 8/10 +- 🎯 功能完整度 > 90% + +--- + +## 🐛 已知问题和风险 + +### 技术风险 + +1. **LLM API 限制** + - 风险:API 调用限制和成本 + - 缓解:实现本地模型支持(Ollama) + +2. **大仓库处理** + - 风险:超大仓库分析超时 + - 缓解:实现增量分析和缓存 + +3. **跨平台兼容性** + - 风险:不同系统表现不一致 + - 缓解:充分测试各平台 + +### 项目风险 + +1. **时间压力** + - 缓解:合理排期,预留缓冲 + +2. **需求变更** + - 缓解:敏捷开发,快速响应 + +--- + +## 📞 联系和支持 + +- **项目管理**: [项目管理工具链接] +- **技术讨论**: [讨论区链接] +- **问题反馈**: [Issues 链接] + +--- + +
+

让我们一起打造优秀的智能开发助手!🚀

+
+ diff --git a/QUICKSTART.md b/QUICKSTART.md new file mode 100644 index 0000000..f801793 --- /dev/null +++ b/QUICKSTART.md @@ -0,0 +1,283 @@ +# 🚀 快速开始指南 + +本指南帮助你在 5 分钟内运行红山智能开发助手 Demo。 + +## 📋 前置要求 + +确保你已安装以下工具: + +- **Node.js** >= 18.0.0 ([下载](https://nodejs.org/)) +- **Python** >= 3.10 ([下载](https://www.python.org/)) +- **Rust** >= 1.70 ([安装 Tauri](https://tauri.app/v1/guides/getting-started/prerequisites)) + +## ⚡ 快速启动(5 分钟) + +### 步骤 1: 克隆项目 + +```bash +cd Red +``` + +### 步骤 2: 安装前端依赖 + +```bash +npm install +# 或 +yarn install +``` + +### 步骤 3: 安装后端依赖 + +```bash +# 创建虚拟环境(推荐) +python -m venv venv + +# 激活虚拟环境 +# Windows: +venv\Scripts\activate +# Mac/Linux: +source venv/bin/activate + +# 安装依赖 +cd api +pip install -r requirements.txt +``` + +### 步骤 4: 配置环境变量 + +```bash +# 复制环境变量模板 +copy .env.example .env # Windows +cp .env.example .env # Mac/Linux +``` + +编辑 `.env` 文件,至少配置一个 AI 提供商的 API 密钥: + +```env +# 使用 OpenAI +OPENAI_API_KEY=sk-your-key-here + +# 或使用 Google Gemini +GOOGLE_API_KEY=your-google-key-here + +# 或使用本地 Ollama(无需 API 密钥) +MODEL_PROVIDER=ollama +OLLAMA_HOST=http://localhost:11434 +``` + +### 步骤 5: 启动应用 + +**打开第一个终端 - 启动后端:** + +```bash +cd api +python main.py +``` + +你应该看到: +``` +INFO: Starting Red Mountain Dev Assistant API on port 8001 +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8001 +``` + +**打开第二个终端 - 启动前端:** + +```bash +npm run dev +# 或 +yarn dev +``` + +你应该看到: +``` +VITE v6.0.7 ready in XXX ms + +➜ Local: http://localhost:1420/ +``` + +**🎉 完成!** 在浏览器打开 http://localhost:1420/ + +### 步骤 6: 启动桌面应用(可选) + +如果你想使用桌面应用而非浏览器: + +```bash +# 在新终端中运行 +npm run tauri:dev +# 或 +yarn tauri:dev +``` + +Tauri 会自动打开桌面窗口。 + +--- + +## 🧪 测试功能 + +### 1. 测试智能问答 + +1. 点击侧边栏的 **"智能问答"** +2. 在输入框输入问题,例如:`什么是红山开源平台?` +3. 点击发送按钮 + +**注意**: 当前是 Demo 阶段,会返回模拟响应。真实 AI 功能需要完成后端 RAG 实现。 + +### 2. 测试代码分析 + +1. 点击侧边栏的 **"代码分析"** +2. 选择仓库类型(GitHub/GitLab/Bitbucket) +3. 输入仓库地址,例如:`https://github.com/facebook/react` +4. 点击 **"开始分析"** + +**注意**: 当前是 Demo 阶段,会显示"功能开发中"提示。 + +### 3. 配置设置 + +1. 点击侧边栏的 **"设置"** +2. 选择 API 提供商 +3. 输入 API 密钥 +4. 配置后端服务地址 +5. 点击 **"保存设置"** + +--- + +## 🔧 故障排除 + +### 问题 1: 端口已被占用 + +**错误**: `Address already in use` + +**解决方案**: +```bash +# 修改端口 +# 后端: 编辑 .env 文件 +API_PORT=8002 + +# 前端: 编辑 vite.config.ts +server: { + port: 1421, # 修改这里 +} +``` + +### 问题 2: Python 包安装失败 + +**错误**: `ERROR: Could not find a version that satisfies the requirement...` + +**解决方案**: +```bash +# 升级 pip +pip install --upgrade pip + +# 使用国内镜像(中国用户) +pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple +``` + +### 问题 3: Tauri 构建失败 + +**错误**: `Rust compiler not found` + +**解决方案**: +```bash +# 安装 Rust +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh + +# 重启终端后验证 +rustc --version +``` + +### 问题 4: Node.js 版本过低 + +**错误**: `error:0308010C:digital envelope routines::unsupported` + +**解决方案**: +```bash +# 安装 Node.js 18+ +# 使用 nvm(推荐) +nvm install 18 +nvm use 18 + +# 或从官网下载: https://nodejs.org/ +``` + +--- + +## 📚 下一步 + +### 学习资源 + +- **完整文档**: 查看 [README.md](./README.md) +- **开发计划**: 查看 [DEVELOPMENT_PLAN.md](./DEVELOPMENT_PLAN.md) +- **参考实现**: 查看 `reference-deepwiki/` 目录 + +### 开发建议 + +1. **先运行 Demo** - 熟悉项目结构和界面 +2. **阅读 DeepWiki 源码** - 理解 RAG 实现 +3. **实现核心功能** - 按照开发计划逐步实现 +4. **测试和优化** - 确保功能稳定可靠 + +### 参与开发 + +1. 创建功能分支 +2. 实现功能并测试 +3. 提交 Pull Request +4. 代码审查和合并 + +--- + +## 🎯 常用命令 + +```bash +# 前端开发 +npm run dev # 启动开发服务器 +npm run build # 构建生产版本 +npm run preview # 预览生产版本 + +# Tauri 桌面应用 +npm run tauri:dev # 开发模式 +npm run tauri:build # 构建应用 + +# 后端开发 +python api/main.py # 启动 API 服务 +pytest # 运行测试 + +# 代码质量 +npm run lint # 前端代码检查 +pylint api/ # 后端代码检查 +``` + +--- + +## 💡 获取帮助 + +- **查看文档**: [README.md](./README.md) +- **查看示例**: 参考 DeepWiki 实现 +- **报告问题**: 在 Issues 中提问 +- **技术讨论**: 参与社区讨论 + +--- + +## ✅ 检查清单 + +确保完成以下步骤: + +- [ ] 安装了 Node.js 18+ +- [ ] 安装了 Python 3.10+ +- [ ] 安装了 Rust(如果要用 Tauri) +- [ ] 克隆了项目代码 +- [ ] 安装了前端依赖 (`npm install`) +- [ ] 安装了后端依赖 (`pip install -r api/requirements.txt`) +- [ ] 配置了 `.env` 文件 +- [ ] 后端服务正常启动 (http://localhost:8001) +- [ ] 前端应用正常访问 (http://localhost:1420) +- [ ] 能够看到应用界面 +- [ ] 测试了基本功能 + +--- + +
+

🎉 恭喜!你已经成功运行了红山智能开发助手!

+

现在可以开始探索和开发了 🚀

+
+ diff --git a/README.md b/README.md new file mode 100644 index 0000000..d7a5486 --- /dev/null +++ b/README.md @@ -0,0 +1,334 @@ +# 红山智能开发助手 (Red Mountain Intelligent Development Assistant) + +
+ +![Red Mountain](https://img.shields.io/badge/Red_Mountain-智能助手-red) +![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white) +![React](https://img.shields.io/badge/React-61DAFB?logo=react&logoColor=black) +![Tauri](https://img.shields.io/badge/Tauri-FFC131?logo=tauri&logoColor=black) +![Python](https://img.shields.io/badge/Python-3776AB?logo=python&logoColor=white) +![FastAPI](https://img.shields.io/badge/FastAPI-009688?logo=fastapi&logoColor=white) + +
+ +## 📖 项目概述 + +红山智能开发助手是一款基于大模型的智能开发辅助工具,专为红山开源平台生态打造。项目采用**双核驱动架构**,集成了智能问答助手和类似 DeepWiki 式代码仓库智能分析两大核心功能,并预留基于大模型的开源项目质量分析和缺陷检测等接口,旨在提升开发者在红山平台上的开发效率和质量。 + +## ✨ 核心功能 + +### 🎯 已实现(Demo 阶段) + +- ✅ **现代化桌面应用界面** - 基于 Tauri + React + TypeScript +- ✅ **智能问答助手界面** - 支持与 AI 对话的聊天界面 +- ✅ **代码仓库分析界面** - 支持 GitHub/GitLab/Bitbucket 仓库输入 +- ✅ **后端 API 框架** - FastAPI 基础架构 +- ✅ **配置管理** - 支持多种 AI 模型提供商 + +### 🚧 开发中 + +- 🔄 **RAG 智能问答** - 基于检索增强生成的智能问答 +- 🔄 **代码仓库分析** - 自动生成代码文档和可视化图表 +- 🔄 **红山平台集成** - 与红山开源平台 API 集成 + +### 📋 规划中 + +- 📅 **质量分析系统** - AI 驱动的代码质量评估 +- 📅 **缺陷检测** - 智能识别潜在代码缺陷 +- 📅 **安全漏洞扫描** - 自动检测安全问题 +- 📅 **最佳实践建议** - 提供改进建议 + +## 🏗️ 技术架构 + +### 前端技术栈 +- **核心框架**: Vite + React 18 + TypeScript +- **桌面应用**: Tauri 2.0 (Rust) +- **UI 框架**: Tailwind CSS +- **路由**: React Router v7 +- **状态管理**: Zustand +- **Markdown 渲染**: react-markdown +- **图表可视化**: Mermaid +- **HTTP 客户端**: Axios + +### 后端技术栈 +- **Web 框架**: FastAPI +- **AI 框架**: adalflow +- **向量数据库**: FAISS +- **嵌入模型**: OpenAI / Google / Ollama +- **大语言模型**: OpenAI GPT / Google Gemini / Azure OpenAI +- **数据处理**: tiktoken, numpy + +### 架构设计 + +``` +┌─────────────────────────────────────────────────────────┐ +│ Tauri Desktop App │ +│ ┌─────────────────────────────────────────────────┐ │ +│ │ React + TypeScript Frontend │ │ +│ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ +│ │ │ 智能 │ 代码 │ 质量 │ 设置 │ │ │ +│ │ │ 问答 │ 分析 │ 检测 │ 管理 │ │ │ +│ │ └──────────┴──────────┴──────────┴──────────┘ │ │ +│ └─────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────┘ + │ HTTP/WebSocket + ▼ +┌─────────────────────────────────────────────────────────┐ +│ Python FastAPI Backend │ +│ ┌─────────────┬─────────────┬──────────────────────┐ │ +│ │ Chat API │ RAG Core │ Repo Analysis │ │ +│ │ │ │ │ │ +│ │ • 对话管理 │ • 向量检索 │ • Git Clone │ │ +│ │ • 上下文 │ • 文档分割 │ • 代码解析 │ │ +│ │ • 流式输出 │ • 嵌入生成 │ • 文档生成 │ │ +│ └─────────────┴─────────────┴──────────────────────┘ │ +│ │ +│ ┌────────────────────────────────────────────────┐ │ +│ │ LLM Integration Layer │ │ +│ │ OpenAI • Google Gemini • Azure • Ollama │ │ +│ └────────────────────────────────────────────────┘ │ +└─────────────────────────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────┐ +│ 红山开源平台 API (Future) │ +│ • 项目管理 • 代码托管 • CI/CD • 问题跟踪 │ +└─────────────────────────────────────────────────────────┘ +``` + +## 🚀 快速开始 + +### 环境要求 + +- **Node.js**: >= 18.0.0 +- **Python**: >= 3.10 +- **Rust**: >= 1.70 (Tauri 需要) +- **操作系统**: Windows 10+, macOS 10.15+, Linux + +### 安装步骤 + +#### 1. 克隆项目 + +```bash +git clone +cd Red +``` + +#### 2. 安装前端依赖 + +```bash +npm install +# 或 +yarn install +``` + +#### 3. 安装后端依赖 + +```bash +cd api +pip install -r requirements.txt +# 推荐使用虚拟环境 +python -m venv venv +source venv/bin/activate # Linux/Mac +# 或 +venv\Scripts\activate # Windows +pip install -r requirements.txt +``` + +#### 4. 配置环境变量 + +复制 `.env.example` 为 `.env` 并填入你的 API 密钥: + +```bash +cp .env.example .env +``` + +编辑 `.env` 文件: + +```env +# 至少配置一个 AI 提供商 +OPENAI_API_KEY=sk-... +# 或 +GOOGLE_API_KEY=... + +# 模型配置 +MODEL_PROVIDER=openai +MODEL_NAME=gpt-4 + +# 嵌入模型 +EMBEDDER_TYPE=openai +``` + +#### 5. 启动开发服务器 + +**终端 1 - 启动后端 API:** + +```bash +cd api +python -m main +``` + +**终端 2 - 启动前端开发服务器:** + +```bash +npm run dev +# 或 +yarn dev +``` + +**终端 3 - 启动 Tauri 桌面应用(可选):** + +```bash +npm run tauri:dev +# 或 +yarn tauri:dev +``` + +### 访问应用 + +- **Web 开发模式**: http://localhost:1420 +- **桌面应用**: Tauri 会自动打开桌面窗口 +- **API 文档**: http://localhost:8001/docs + +## 📂 项目结构 + +``` +Red/ +├── src/ # 前端源代码 +│ ├── components/ # React 组件 +│ │ ├── Layout.tsx # 布局组件 +│ │ └── Sidebar.tsx # 侧边栏导航 +│ ├── pages/ # 页面组件 +│ │ ├── HomePage.tsx # 首页 +│ │ ├── ChatPage.tsx # 智能问答页面 +│ │ ├── WikiPage.tsx # 代码分析页面 +│ │ ├── QualityPage.tsx # 质量检测页面 +│ │ └── SettingsPage.tsx # 设置页面 +│ ├── styles/ # 样式文件 +│ ├── App.tsx # 应用入口 +│ └── main.tsx # React 入口 +│ +├── src-tauri/ # Tauri Rust 后端 +│ ├── src/ +│ │ ├── main.rs # Rust 主文件 +│ │ └── lib.rs # Rust 库文件 +│ ├── Cargo.toml # Rust 依赖配置 +│ └── tauri.conf.json # Tauri 配置 +│ +├── api/ # Python 后端 API +│ ├── __init__.py +│ ├── main.py # API 入口 +│ ├── api.py # FastAPI 应用 +│ ├── config.py # 配置管理 +│ └── requirements.txt # Python 依赖 +│ +├── reference-deepwiki/ # DeepWiki 参考实现 +│ +├── package.json # Node.js 依赖 +├── tsconfig.json # TypeScript 配置 +├── vite.config.ts # Vite 配置 +├── tailwind.config.js # Tailwind CSS 配置 +└── README.md # 项目文档 +``` + +## 🔧 配置说明 + +### 支持的 AI 模型提供商 + +#### OpenAI +```env +OPENAI_API_KEY=sk-... +MODEL_PROVIDER=openai +MODEL_NAME=gpt-4 +EMBEDDER_TYPE=openai +``` + +#### Google Gemini +```env +GOOGLE_API_KEY=... +MODEL_PROVIDER=google +MODEL_NAME=gemini-pro +EMBEDDER_TYPE=google +``` + +#### Azure OpenAI +```env +AZURE_OPENAI_API_KEY=... +AZURE_OPENAI_ENDPOINT=https://... +AZURE_OPENAI_VERSION=2024-02-15-preview +MODEL_PROVIDER=azure +``` + +#### Ollama (本地模型) +```env +OLLAMA_HOST=http://localhost:11434 +MODEL_PROVIDER=ollama +MODEL_NAME=llama3 +EMBEDDER_TYPE=ollama +``` + +## 📝 开发计划 + +详细的开发计划请参见 [DEVELOPMENT_PLAN.md](./DEVELOPMENT_PLAN.md) + +### 阶段规划 + +#### 第一阶段:基础框架搭建 ✅ (当前) +- ✅ 项目结构设计 +- ✅ 前端界面开发 +- ✅ 后端 API 框架 +- ✅ 配置管理系统 + +#### 第二阶段:核心功能实现 (2-4 周) +- 🔄 RAG 智能问答实现 +- 🔄 代码仓库分析功能 +- 🔄 向量数据库集成 +- 🔄 WebSocket 实时通信 + +#### 第三阶段:平台集成 (2-3 周) +- 📅 红山平台 API 集成 +- 📅 用户认证和授权 +- 📅 项目管理功能 + +#### 第四阶段:质量检测 (3-4 周) +- 📅 代码质量分析 +- 📅 缺陷检测 +- 📅 安全漏洞扫描 +- 📅 报告生成 + +#### 第五阶段:优化和发布 (1-2 周) +- 📅 性能优化 +- 📅 用户体验改进 +- 📅 文档完善 +- 📅 正式发布 + +## 🤝 参考项目 + +本项目参考了以下优秀开源项目: + +- [DeepWiki](https://github.com/AsyncFuncAI/deepwiki-open) - 代码仓库智能分析的实现参考 +- 关键技术借鉴: + - RAG (检索增强生成) 架构 + - 向量嵌入和文档检索 + - 多种 LLM 模型集成 + - WebSocket 流式输出 + +## 📄 许可证 + +MIT License + +## 👥 贡献 + +欢迎贡献代码、提出问题和建议! + +## 📧 联系方式 + +- 项目地址: [GitHub Repository URL] +- 问题反馈: [Issues URL] + +--- + +
+ Built with ❤️ for Red Mountain Open Source Platform +
+ diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..b27c497 --- /dev/null +++ b/api/__init__.py @@ -0,0 +1,7 @@ +""" +Red Mountain Intelligent Development Assistant API +红山智能开发助手 API 模块 +""" + +__version__ = "0.1.0" + diff --git a/api/api.py b/api/api.py new file mode 100644 index 0000000..6c2b24e --- /dev/null +++ b/api/api.py @@ -0,0 +1,158 @@ +""" +FastAPI application for Red Mountain Intelligent Development Assistant +""" +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel +from typing import Optional, List +import logging + +logger = logging.getLogger(__name__) + +# Create FastAPI app +app = FastAPI( + title="Red Mountain Dev Assistant API", + description="智能开发助手 API - 提供智能问答、代码分析等功能", + version="0.1.0" +) + +# Configure CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # In production, replace with specific origins + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + +# ==================== Data Models ==================== + +class ChatRequest(BaseModel): + """Chat request model""" + message: str + conversation_id: Optional[str] = None + + +class ChatResponse(BaseModel): + """Chat response model""" + response: str + conversation_id: str + + +class RepoAnalysisRequest(BaseModel): + """Repository analysis request model""" + repo_url: str + repo_type: str = "github" # github, gitlab, bitbucket + access_token: Optional[str] = None + included_dirs: Optional[List[str]] = None + excluded_dirs: Optional[List[str]] = None + + +class RepoAnalysisResponse(BaseModel): + """Repository analysis response model""" + status: str + message: str + analysis_id: Optional[str] = None + + +# ==================== API Endpoints ==================== + +@app.get("/") +async def root(): + """Root endpoint""" + return { + "name": "Red Mountain Dev Assistant API", + "version": "0.1.0", + "status": "running" + } + + +@app.get("/health") +async def health_check(): + """Health check endpoint""" + return {"status": "healthy"} + + +@app.post("/api/chat", response_model=ChatResponse) +async def chat(request: ChatRequest): + """ + Chat endpoint for intelligent Q&A + 智能问答接口 + """ + try: + # TODO: Implement actual chat logic with LLM + # This is a placeholder response + logger.info(f"Received chat message: {request.message}") + + response_text = ( + f"你好!我收到了你的消息:\"{request.message}\"\n\n" + "这是一个占位响应。要启用真实的 AI 对话功能,请:\n" + "1. 配置 .env 文件中的 API 密钥\n" + "2. 实现 RAG 和 LLM 集成逻辑\n" + "3. 参考 DeepWiki 的 rag.py 实现" + ) + + return ChatResponse( + response=response_text, + conversation_id=request.conversation_id or "demo-conversation-id" + ) + except Exception as e: + logger.error(f"Error in chat endpoint: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@app.post("/api/repo/analyze", response_model=RepoAnalysisResponse) +async def analyze_repository(request: RepoAnalysisRequest): + """ + Repository analysis endpoint + 代码仓库分析接口 + """ + try: + logger.info(f"Analyzing repository: {request.repo_url}") + + # TODO: Implement actual repository analysis logic + # Reference DeepWiki's data_pipeline.py for implementation + + return RepoAnalysisResponse( + status="pending", + message="Repository analysis started. This feature is under development.", + analysis_id="demo-analysis-id" + ) + except Exception as e: + logger.error(f"Error in repository analysis: {str(e)}") + raise HTTPException(status_code=500, detail=str(e)) + + +@app.get("/api/repo/status/{analysis_id}") +async def get_analysis_status(analysis_id: str): + """ + Get repository analysis status + 获取分析状态 + """ + # TODO: Implement status tracking + return { + "analysis_id": analysis_id, + "status": "processing", + "progress": 0 + } + + +# ==================== Quality Analysis Endpoints (Placeholder) ==================== + +@app.post("/api/quality/analyze") +async def analyze_quality(request: RepoAnalysisRequest): + """ + Code quality analysis endpoint (to be implemented) + 代码质量分析接口(待实现) + """ + return { + "status": "not_implemented", + "message": "Quality analysis feature is planned for future development" + } + + +if __name__ == "__main__": + import uvicorn + uvicorn.run(app, host="0.0.0.0", port=8001) + diff --git a/api/config.py b/api/config.py new file mode 100644 index 0000000..daf1391 --- /dev/null +++ b/api/config.py @@ -0,0 +1,96 @@ +""" +Configuration module for Red Mountain Dev Assistant API +""" +import os +from typing import Dict, Any + +# API Keys from environment variables +OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") +GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY", "") +AZURE_OPENAI_API_KEY = os.getenv("AZURE_OPENAI_API_KEY", "") +AZURE_OPENAI_ENDPOINT = os.getenv("AZURE_OPENAI_ENDPOINT", "") + +# Default model configuration +DEFAULT_MODEL_PROVIDER = os.getenv("MODEL_PROVIDER", "openai") +DEFAULT_MODEL_NAME = os.getenv("MODEL_NAME", "gpt-4") + +# Embedder configuration +DEFAULT_EMBEDDER_TYPE = os.getenv("EMBEDDER_TYPE", "openai") + +# RAG configuration +RAG_CONFIG: Dict[str, Any] = { + "retriever": { + "top_k": 5, + "similarity_threshold": 0.7 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 500, + "chunk_overlap": 100 + } +} + +# Repository filters (similar to DeepWiki) +DEFAULT_EXCLUDED_DIRS = [ + "node_modules", + ".git", + "__pycache__", + ".venv", + "venv", + "dist", + "build", + ".next", + "target" +] + +DEFAULT_EXCLUDED_FILES = [ + ".pyc", + ".pyo", + ".pyd", + ".so", + ".dll", + ".dylib", + ".exe", + "package-lock.json", + "yarn.lock" +] + +# Server configuration +API_HOST = os.getenv("API_HOST", "0.0.0.0") +API_PORT = int(os.getenv("API_PORT", "8001")) + +# Red Mountain platform specific configuration +REDMOUNTAIN_API_BASE = os.getenv("REDMOUNTAIN_API_BASE", "") +REDMOUNTAIN_API_KEY = os.getenv("REDMOUNTAIN_API_KEY", "") + + +def get_config() -> Dict[str, Any]: + """Get complete configuration""" + return { + "api_keys": { + "openai": OPENAI_API_KEY, + "google": GOOGLE_API_KEY, + "azure": AZURE_OPENAI_API_KEY, + }, + "models": { + "provider": DEFAULT_MODEL_PROVIDER, + "name": DEFAULT_MODEL_NAME, + }, + "embedder": { + "type": DEFAULT_EMBEDDER_TYPE, + }, + "rag": RAG_CONFIG, + "filters": { + "excluded_dirs": DEFAULT_EXCLUDED_DIRS, + "excluded_files": DEFAULT_EXCLUDED_FILES, + }, + "server": { + "host": API_HOST, + "port": API_PORT, + }, + "redmountain": { + "api_base": REDMOUNTAIN_API_BASE, + "api_key": REDMOUNTAIN_API_KEY, + } + } + diff --git a/api/main.py b/api/main.py new file mode 100644 index 0000000..b20f29c --- /dev/null +++ b/api/main.py @@ -0,0 +1,38 @@ +import os +import sys +import logging +from dotenv import load_dotenv + +# Load environment variables from .env file +load_dotenv() + +# Add the parent directory to the path +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Configure logging +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger(__name__) + +import uvicorn + +if __name__ == "__main__": + # Get port from environment variable or use default + port = int(os.environ.get("PORT", 8001)) + + # Import the app here to ensure environment variables are set first + from api.api import app + + logger.info(f"Starting Red Mountain Dev Assistant API on port {port}") + logger.info("Make sure you have configured your API keys in .env file") + + # Run the FastAPI app with uvicorn + uvicorn.run( + "api.api:app", + host="0.0.0.0", + port=port, + reload=True, + ) + diff --git a/api/requirements.txt b/api/requirements.txt new file mode 100644 index 0000000..f02be90 --- /dev/null +++ b/api/requirements.txt @@ -0,0 +1,26 @@ +# Core dependencies +fastapi==0.115.6 +uvicorn[standard]==0.34.0 +python-dotenv==1.0.1 +pydantic==2.10.5 + +# AI and ML dependencies (based on DeepWiki) +adalflow==0.2.9 +openai==1.59.7 +google-generativeai==0.8.3 + +# Vector database and embeddings +faiss-cpu==1.9.0.post1 +tiktoken==0.8.0 + +# Data processing +numpy==1.26.4 +requests==2.32.3 + +# Optional: For local model support +# ollama==0.1.6 + +# Development dependencies +pytest==8.3.4 +pytest-asyncio==0.24.0 + diff --git a/index.html b/index.html new file mode 100644 index 0000000..bcec3b9 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + 红山智能开发助手 + + +
+ + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c1081de --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8366 @@ +{ + "name": "redmountain-dev-assistant", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "redmountain-dev-assistant", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@tauri-apps/api": "^2.2.0", + "@tauri-apps/plugin-shell": "^2.0.0", + "axios": "^1.7.9", + "mermaid": "^11.4.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-icons": "^5.5.0", + "react-markdown": "^10.1.0", + "react-router-dom": "^7.1.3", + "react-syntax-highlighter": "^15.6.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "zustand": "^5.0.2" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.2.0", + "@types/node": "^22.10.5", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@types/react-syntax-highlighter": "^15.5.13", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "eslint": "^9.18.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.18", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.2", + "vite": "^6.0.7" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "9.2.1", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-TMilPqXyii1AsiEii6l6ubRzbo76p6oshUSYPaKsmXDavyMLqjzVDkcp3pHp5ELMUNJHATcEOGxKTTsX9yYhGg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@iconify/utils/-/utils-3.0.2.tgz", + "integrity": "sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@antfu/utils": "^9.2.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.1", + "globals": "^15.15.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.1.1", + "mlly": "^1.7.4" + } + }, + "node_modules/@iconify/utils/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/@mermaid-js/parser/-/parser-0.6.2.tgz", + "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", + "license": "MIT", + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tauri-apps/api": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/@tauri-apps/api/-/api-2.8.0.tgz", + "integrity": "sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli/-/cli-2.8.4.tgz", + "integrity": "sha512-ejUZBzuQRcjFV+v/gdj/DcbyX/6T4unZQjMSBZwLzP/CymEjKcc2+Fc8xTORThebHDUvqoXMdsCZt8r+hyN15g==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.8.4", + "@tauri-apps/cli-darwin-x64": "2.8.4", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.8.4", + "@tauri-apps/cli-linux-arm64-gnu": "2.8.4", + "@tauri-apps/cli-linux-arm64-musl": "2.8.4", + "@tauri-apps/cli-linux-riscv64-gnu": "2.8.4", + "@tauri-apps/cli-linux-x64-gnu": "2.8.4", + "@tauri-apps/cli-linux-x64-musl": "2.8.4", + "@tauri-apps/cli-win32-arm64-msvc": "2.8.4", + "@tauri-apps/cli-win32-ia32-msvc": "2.8.4", + "@tauri-apps/cli-win32-x64-msvc": "2.8.4" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.8.4.tgz", + "integrity": "sha512-BKu8HRkYV01SMTa7r4fLx+wjgtRK8Vep7lmBdHDioP6b8XH3q2KgsAyPWfEZaZIkZ2LY4SqqGARaE9oilNe0oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.8.4.tgz", + "integrity": "sha512-imb9PfSd/7G6VAO7v1bQ2A3ZH4NOCbhGJFLchxzepGcXf9NKkfun157JH9mko29K6sqAwuJ88qtzbKCbWJTH9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.8.4.tgz", + "integrity": "sha512-Ml215UnDdl7/fpOrF1CNovym/KjtUbCuPgrcZ4IhqUCnhZdXuphud/JT3E8X97Y03TZ40Sjz8raXYI2ET0exzw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.8.4.tgz", + "integrity": "sha512-pbcgBpMyI90C83CxE5REZ9ODyIlmmAPkkJXtV398X3SgZEIYy5TACYqlyyv2z5yKgD8F8WH4/2fek7+jH+ZXAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.8.4.tgz", + "integrity": "sha512-zumFeaU1Ws5Ay872FTyIm7z8kfzEHu8NcIn8M6TxbJs0a7GRV21KBdpW1zNj2qy7HynnpQCqjAYXTUUmm9JAOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.8.4.tgz", + "integrity": "sha512-qiqbB3Zz6IyO201f+1ojxLj65WYj8mixL5cOMo63nlg8CIzsP23cPYUrx1YaDPsCLszKZo7tVs14pc7BWf+/aQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.8.4.tgz", + "integrity": "sha512-TaqaDd9Oy6k45Hotx3pOf+pkbsxLaApv4rGd9mLuRM1k6YS/aw81YrsMryYPThrxrScEIUcmNIHaHsLiU4GMkw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.8.4.tgz", + "integrity": "sha512-ot9STAwyezN8w+bBHZ+bqSQIJ0qPZFlz/AyscpGqB/JnJQVDFQcRDmUPFEaAtt2UUHSWzN3GoTJ5ypqLBp2WQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.8.4.tgz", + "integrity": "sha512-+2aJ/g90dhLiOLFSD1PbElXX3SoMdpO7HFPAZB+xot3CWlAZD1tReUFy7xe0L5GAR16ZmrxpIDM9v9gn5xRy/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.8.4.tgz", + "integrity": "sha512-yj7WDxkL1t9Uzr2gufQ1Hl7hrHuFKTNEOyascbc109EoiAqCp0tgZ2IykQqOZmZOHU884UAWI1pVMqBhS/BfhA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.8.4", + "resolved": "https://registry.npmmirror.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.8.4.tgz", + "integrity": "sha512-XuvGB4ehBdd7QhMZ9qbj/8icGEatDuBNxyYHbLKsTYh90ggUlPa/AtaqcC1Fo69lGkTmq9BOKrs1aWSi7xDonA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/plugin-shell": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@tauri-apps/plugin-shell/-/plugin-shell-2.3.1.tgz", + "integrity": "sha512-jjs2WGDO/9z2pjNlydY/F5yYhNsscv99K5lCmU5uKjsVvQ3dRlDhhtVYoa4OLDmktLtQvgvbQjCFibMl6tgGfw==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmmirror.com/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmmirror.com/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmmirror.com/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.18.8", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.18.8.tgz", + "integrity": "sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.25", + "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.25.tgz", + "integrity": "sha512-oSVZmGtDPmRZtVDqvdKUi/qgCsWp5IDY29wp8na8Bj4B3cc99hfNzvNhlMkVVxctkAOGUA3Km7MMpBHAnWfcIA==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.13", + "resolved": "https://registry.npmmirror.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", + "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.45.0.tgz", + "integrity": "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/type-utils": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.45.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.45.0.tgz", + "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", + "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.45.0", + "@typescript-eslint/types": "^8.45.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", + "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", + "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.45.0.tgz", + "integrity": "sha512-bpjepLlHceKgyMEPglAeULX1vixJDgaKocp0RVJ5u4wLJIMNuKtUXIczpJCPcn2waII0yuvks/5m5/h3ZQKs0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/utils": "8.45.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", + "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.45.0", + "@typescript-eslint/tsconfig-utils": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.45.0.tgz", + "integrity": "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", + "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.45.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.12", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.12.tgz", + "integrity": "sha512-vAPMQdnyKCBtkmQA6FMCBvU9qFIppS3nzyXnEM+Lo2IAhG4Mpjv9cCxMudhgV3YdNNJv6TNqXy97dfRVL2LmaQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001747", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001747.tgz", + "integrity": "sha512-mzFa2DGIhuc5490Nd/G31xN1pnBnYMadtkyTjefPI7wzypqgCEpeWu9bJr0OnDsyKrW75zA9ZAt7pbQFmwLsQg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmmirror.com/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.11", + "resolved": "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.18", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.230", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.230.tgz", + "integrity": "sha512-A6A6Fd3+gMdaed9wX83CvHYJb4UuapPD5X5SLq72VZJzxHSY0/LUweGXRWmQlh2ln7KV7iw7jnwXK7dlPoOnHQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.23", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.23.tgz", + "integrity": "sha512-G4j+rv0NmbIR45kni5xJOrYvCtyD3/7LjpVH8MPPcudXDcNu8gv+4ATTDXTtbRR8rTCM5HxECvCSsRmxKnWDsA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmmirror.com/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmmirror.com/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmmirror.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/hastscript/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/hastscript/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hastscript/node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hastscript/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/katex": { + "version": "0.16.23", + "resolved": "https://registry.npmmirror.com/katex/-/katex-0.16.23.tgz", + "integrity": "sha512-7VlC1hsEEolL9xNO05v9VjrvWZePkCVBJqj8ruICxYjZfHaHbaU53AlP+PODyFIXEnaEIEWi3wJy7FPZ95JAVg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmmirror.com/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.3.0", + "resolved": "https://registry.npmmirror.com/marked/-/marked-16.3.0.tgz", + "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmmirror.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/mermaid/-/mermaid-11.12.0.tgz", + "integrity": "sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^0.6.2", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.18", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^16.2.1", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.23", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.9.3", + "resolved": "https://registry.npmmirror.com/react-router/-/react-router-7.9.3.tgz", + "integrity": "sha512-4o2iWCFIwhI/eYAIL43+cjORXYn/aRQPgtFRRZb3VzoyQ5Uej0Bmqj7437L97N9NJW4wnicSwLOLS+yCXfAPgg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.9.3", + "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.9.3.tgz", + "integrity": "sha512-1QSbA0TGGFKTAc/aWjpfW/zoEukYfU4dc1dLkT/vvf54JoGMkW+fNA+3oyo2gWVW1GM7BxjJVHz5GnPJv40rvg==", + "license": "MIT", + "dependencies": { + "react-router": "7.9.3" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "15.6.6", + "resolved": "https://registry.npmmirror.com/react-syntax-highlighter/-/react-syntax-highlighter-15.6.6.tgz", + "integrity": "sha512-DgXrc+AZF47+HvAPEmn7Ua/1p10jNoVZVI/LoPiYdtY+OM+/nG5yefLHKJwdKqY1adMuHFbeyBaG9j64ML7vTw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmmirror.com/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmmirror.com/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmmirror.com/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.18", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmmirror.com/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.3.6", + "resolved": "https://registry.npmmirror.com/vite/-/vite-6.3.6.tgz", + "integrity": "sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.8.tgz", + "integrity": "sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..77044f2 --- /dev/null +++ b/package.json @@ -0,0 +1,51 @@ +{ + "name": "redmountain-dev-assistant", + "version": "0.1.0", + "private": true, + "description": "红山智能开发助手 - AI-powered development assistant for RedMountain Open Source Platform", + "author": "RedMountain Team", + "license": "MIT", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "tauri": "tauri", + "tauri:dev": "tauri dev", + "tauri:build": "tauri build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0" + }, + "dependencies": { + "@tauri-apps/api": "^2.2.0", + "@tauri-apps/plugin-shell": "^2.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^7.1.3", + "react-icons": "^5.5.0", + "react-markdown": "^10.1.0", + "react-syntax-highlighter": "^15.6.1", + "axios": "^1.7.9", + "zustand": "^5.0.2", + "mermaid": "^11.4.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.2.0", + "@types/node": "^22.10.5", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@types/react-syntax-highlighter": "^15.5.13", + "@typescript-eslint/eslint-plugin": "^8.20.0", + "@typescript-eslint/parser": "^8.20.0", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "eslint": "^9.18.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.18", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.2", + "vite": "^6.0.7" + } +} + diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..b4a6220 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,7 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} + diff --git a/reference-deepwiki/.dockerignore b/reference-deepwiki/.dockerignore new file mode 100644 index 0000000..a7787e7 --- /dev/null +++ b/reference-deepwiki/.dockerignore @@ -0,0 +1,60 @@ +# Git +.git +.gitignore +.github + +# Node.js +node_modules +npm-debug.log +yarn-debug.log +yarn-error.log + +# Next.js +.next +out + +# Python cache files (but keep api/ directory) +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg +# Keep api/ directory but exclude cache +api/__pycache__/ +api/*.pyc + +# Environment variables +# .env is now allowed to be included in the build +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Docker +Dockerfile +docker-compose.yml +.dockerignore + +# Misc +.DS_Store +*.pem +README.md +LICENSE +screenshots/ +*.md +!api/README.md diff --git a/reference-deepwiki/.github/workflows/docker-build-push.yml b/reference-deepwiki/.github/workflows/docker-build-push.yml new file mode 100644 index 0000000..50b8ef2 --- /dev/null +++ b/reference-deepwiki/.github/workflows/docker-build-push.yml @@ -0,0 +1,173 @@ +name: Build and Push Docker Image + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + # Allow manual trigger + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +concurrency: + # This concurrency group ensures that only one job in the group runs at a time. + # If a new job is triggered, the previous one will be canceled. + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-and-push: + strategy: + matrix: + include: + - os: ubuntu-latest + platform: linux/amd64 + - os: ubuntu-24.04-arm + platform: linux/arm64 + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + + steps: + - name: Prepare environment for current platform + id: prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + echo "GHCR_IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.GHCR_IMAGE }} + + - name: Create empty .env file for build + run: touch .env + + - name: Build and push Docker image + uses: docker/build-push-action@v6 + id: build + with: + context: . + platforms: ${{ matrix.platform }} + push: ${{ github.event_name != 'pull_request' }} + annotations: ${{ steps.meta.outputs.annotations }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.GHCR_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }},oci-mediatypes=true + cache-from: type=gha,scope=${{ github.repository }}-${{ github.ref_name }}-${{ matrix.platform }} + cache-to: type=gha,mode=max,scope=${{ github.repository }}-${{ github.ref_name }}-${{ matrix.platform }} + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + name: merge Docker manifests + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + permissions: + contents: read + packages: write + + needs: + - build-and-push + steps: + - name: Prepare environment + id: prepare + run: | + echo "GHCR_IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV + + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.GHCR_IMAGE }} + annotations: | + type=org.opencontainers.image.description,value=${{ github.event.repository.description || 'No description provided' }} + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha,format=short + type=ref,event=branch + type=ref,event=pr + latest + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver-opts: | + network=host + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get execution timestamp with RFC3339 format + id: timestamp + run: | + echo "timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_OUTPUT + + - name: Create manifest list and pushs + working-directory: /tmp/digests + id: manifest-annotate + continue-on-error: true + run: | + docker buildx imagetools create \ + $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + --annotation='index:org.opencontainers.image.description=${{ github.event.repository.description }}' \ + --annotation='index:org.opencontainers.image.created=${{ steps.timestamp.outputs.timestamp }}' \ + --annotation='index:org.opencontainers.image.url=${{ github.event.repository.url }}' \ + --annotation='index:org.opencontainers.image.source=${{ github.event.repository.url }}' \ + $(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *) + + - name: Create manifest list and push without annotations + if: steps.manifest-annotate.outcome == 'failure' + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + id: inspect + run: | + docker buildx imagetools inspect '${{ env.GHCR_IMAGE }}:${{ steps.meta.outputs.version }}' diff --git a/reference-deepwiki/.gitignore b/reference-deepwiki/.gitignore new file mode 100644 index 0000000..4570efd --- /dev/null +++ b/reference-deepwiki/.gitignore @@ -0,0 +1,69 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +api/logs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +*.venv +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +.idea/ + +# ignore adding self-signed certs +certs/ diff --git a/reference-deepwiki/.python-version b/reference-deepwiki/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/reference-deepwiki/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/reference-deepwiki/Dockerfile b/reference-deepwiki/Dockerfile new file mode 100644 index 0000000..ab818ef --- /dev/null +++ b/reference-deepwiki/Dockerfile @@ -0,0 +1,107 @@ +# syntax=docker/dockerfile:1-labs + +# Build argument for custom certificates directory +ARG CUSTOM_CERT_DIR="certs" + +FROM node:20-alpine3.22 AS node_base + +FROM node_base AS node_deps +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci --legacy-peer-deps + +FROM node_base AS node_builder +WORKDIR /app +COPY --from=node_deps /app/node_modules ./node_modules +# Copy only necessary files for Next.js build +COPY package.json package-lock.json next.config.ts tsconfig.json tailwind.config.js postcss.config.mjs ./ +COPY src/ ./src/ +COPY public/ ./public/ +# Increase Node.js memory limit for build and disable telemetry +ENV NODE_OPTIONS="--max-old-space-size=4096" +ENV NEXT_TELEMETRY_DISABLED=1 +RUN NODE_ENV=production npm run build + +FROM python:3.11-slim AS py_deps +WORKDIR /app +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" +COPY api/requirements.txt ./api/ +RUN pip install --no-cache -r api/requirements.txt + +# Use Python 3.11 as final image +FROM python:3.11-slim + +# Set working directory +WORKDIR /app + +# Install Node.js and npm +RUN apt-get update && apt-get install -y \ + curl \ + gnupg \ + git \ + ca-certificates \ + && mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Update certificates if custom ones were provided and copied successfully +RUN if [ -n "${CUSTOM_CERT_DIR}" ]; then \ + mkdir -p /usr/local/share/ca-certificates && \ + if [ -d "${CUSTOM_CERT_DIR}" ]; then \ + cp -r ${CUSTOM_CERT_DIR}/* /usr/local/share/ca-certificates/ 2>/dev/null || true; \ + update-ca-certificates; \ + echo "Custom certificates installed successfully."; \ + else \ + echo "Warning: ${CUSTOM_CERT_DIR} not found. Skipping certificate installation."; \ + fi \ + fi + +ENV PATH="/opt/venv/bin:$PATH" + +# Copy Python dependencies +COPY --from=py_deps /opt/venv /opt/venv +COPY api/ ./api/ + +# Copy Node app +COPY --from=node_builder /app/public ./public +COPY --from=node_builder /app/.next/standalone ./ +COPY --from=node_builder /app/.next/static ./.next/static + +# Expose the port the app runs on +EXPOSE ${PORT:-8001} 3000 + +# Create a script to run both backend and frontend +RUN echo '#!/bin/bash\n\ +# Load environment variables from .env file if it exists\n\ +if [ -f .env ]; then\n\ + export $(grep -v "^#" .env | xargs -r)\n\ +fi\n\ +\n\ +# Check for required environment variables\n\ +if [ -z "$OPENAI_API_KEY" ] || [ -z "$GOOGLE_API_KEY" ]; then\n\ + echo "Warning: OPENAI_API_KEY and/or GOOGLE_API_KEY environment variables are not set."\n\ + echo "These are required for DeepWiki to function properly."\n\ + echo "You can provide them via a mounted .env file or as environment variables when running the container."\n\ +fi\n\ +\n\ +# Start the API server in the background with the configured port\n\ +python -m api.main --port ${PORT:-8001} &\n\ +PORT=3000 HOSTNAME=0.0.0.0 node server.js &\n\ +wait -n\n\ +exit $?' > /app/start.sh && chmod +x /app/start.sh + +# Set environment variables +ENV PORT=8001 +ENV NODE_ENV=production +ENV SERVER_BASE_URL=http://localhost:${PORT:-8001} + +# Create empty .env file (will be overridden if one exists at runtime) +RUN touch .env + +# Command to run the application +CMD ["/app/start.sh"] diff --git a/reference-deepwiki/Dockerfile-ollama-local b/reference-deepwiki/Dockerfile-ollama-local new file mode 100644 index 0000000..92a254f --- /dev/null +++ b/reference-deepwiki/Dockerfile-ollama-local @@ -0,0 +1,116 @@ +# syntax=docker/dockerfile:1-labs + +FROM node:20-alpine AS node_base + +FROM node_base AS node_deps +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci --legacy-peer-deps + +FROM node_base AS node_builder +WORKDIR /app +COPY --from=node_deps /app/node_modules ./node_modules +COPY --exclude=./api . . +RUN NODE_ENV=production npm run build + +FROM python:3.11-slim AS py_deps +WORKDIR /app +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" +COPY api/requirements.txt ./api/ +RUN pip install --no-cache -r api/requirements.txt + +FROM python:3.11-slim AS ollama_base +RUN apt-get update && apt-get install -y \ + curl +# Detect architecture and download appropriate Ollama version +# ARG TARGETARCH can be set at build time with --build-arg TARGETARCH=arm64 or TARGETARCH=amd64 +ARG TARGETARCH=arm64 +RUN OLLAMA_ARCH="" && \ + if [ "$TARGETARCH" = "arm64" ]; then \ + echo "Building for ARM64 architecture." && \ + OLLAMA_ARCH="arm64"; \ + elif [ "$TARGETARCH" = "amd64" ]; then \ + echo "Building for AMD64 architecture." && \ + OLLAMA_ARCH="amd64"; \ + else \ + echo "Error: Unsupported architecture '$TARGETARCH'. Supported architectures are 'arm64' and 'amd64'." >&2 && \ + exit 1; \ + fi && \ + curl -L "https://ollama.com/download/ollama-linux-${OLLAMA_ARCH}.tgz" -o ollama.tgz && \ + tar -C /usr -xzf ollama.tgz && \ + rm ollama.tgz + +RUN ollama serve > /dev/null 2>&1 & \ + sleep 20 && \ + ollama pull nomic-embed-text && \ + ollama pull qwen3:1.7b + +# Use Python 3.11 as final image +FROM python:3.11-slim + +# Set working directory +WORKDIR /app + +# Install Node.js and npm +RUN apt-get update && apt-get install -y \ + curl \ + gnupg \ + git \ + && mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ENV PATH="/opt/venv/bin:$PATH" + +# Copy Python dependencies +COPY --from=py_deps /opt/venv /opt/venv +COPY api/ ./api/ + +# Copy Node app +COPY --from=node_builder /app/public ./public +COPY --from=node_builder /app/.next/standalone ./ +COPY --from=node_builder /app/.next/static ./.next/static +COPY --from=ollama_base /usr/bin/ollama /usr/local/bin/ +COPY --from=ollama_base /root/.ollama /root/.ollama + +# Expose the port the app runs on +EXPOSE ${PORT:-8001} 3000 + +# Create a script to run both backend and frontend +RUN echo '#!/bin/bash\n\ +# Start ollama serve in background\n\ +ollama serve > /dev/null 2>&1 &\n\ +\n\ +# Load environment variables from .env file if it exists\n\ +if [ -f .env ]; then\n\ + export $(grep -v "^#" .env | xargs -r)\n\ +fi\n\ +\n\ +# Check for required environment variables\n\ +if [ -z "$OPENAI_API_KEY" ] || [ -z "$GOOGLE_API_KEY" ]; then\n\ + echo "Warning: OPENAI_API_KEY and/or GOOGLE_API_KEY environment variables are not set."\n\ + echo "These are required for DeepWiki to function properly."\n\ + echo "You can provide them via a mounted .env file or as environment variables when running the container."\n\ +fi\n\ +\n\ +# Start the API server in the background with the configured port\n\ +python -m api.main --port ${PORT:-8001} &\n\ +PORT=3000 HOSTNAME=0.0.0.0 node server.js &\n\ +wait -n\n\ +exit $?' > /app/start.sh && chmod +x /app/start.sh + +# Set environment variables +ENV PORT=8001 +ENV NODE_ENV=production +ENV SERVER_BASE_URL=http://localhost:${PORT:-8001} + +# Create empty .env file (will be overridden if one exists at runtime) +RUN touch .env + +# Command to run the application +CMD ["/app/start.sh"] diff --git a/reference-deepwiki/LICENSE b/reference-deepwiki/LICENSE new file mode 100644 index 0000000..623b619 --- /dev/null +++ b/reference-deepwiki/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Sheing Ng + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/reference-deepwiki/Ollama-instruction.md b/reference-deepwiki/Ollama-instruction.md new file mode 100644 index 0000000..f6e47e3 --- /dev/null +++ b/reference-deepwiki/Ollama-instruction.md @@ -0,0 +1,189 @@ +# Using DeepWiki with Ollama: Beginner's Guide + +DeepWiki supports local AI models through Ollama, which is perfect if you want to: + +- Run everything locally without relying on cloud APIs +- Avoid API costs from OpenAI or Google +- Have more privacy with your code analysis + +## Step 1: Install Ollama + +### For Windows +- Download Ollama from the [official website](https://ollama.com/download) +- Run the installer and follow the on-screen instructions +- After installation, Ollama will run in the background (check your system tray) + +### For macOS +- Download Ollama from the [official website](https://ollama.com/download) +- Open the downloaded file and drag Ollama to your Applications folder +- Launch Ollama from your Applications folder + +### For Linux +- Run the following command: + ```bash + curl -fsSL https://ollama.com/install.sh | sh + ``` + +## Step 2: Download Required Models + +Open a terminal (Command Prompt or PowerShell on Windows) and run: + +```bash +ollama pull nomic-embed-text +ollama pull qwen3:1.7b +``` + +The first command downloads the embedding model that DeepWiki uses to understand your code. The second downloads a small but capable language model for generating documentation. + +## Step 3: Set Up DeepWiki + +Clone the DeepWiki repository: +```bash +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open +``` + +Create a `.env` file in the project root: +``` +# No need for API keys when using Ollama locally +PORT=8001 +# Optionally, provide OLLAMA_HOST if Ollama is not local +OLLAMA_HOST=your_ollama_host # (default: http://localhost:11434) +``` + +Configure the Local Embedder for Ollama: +``` +cp api/config/embedder.ollama.json.bak api/config/embedder.json +# overwrite api/config/embedder.json? (y/n [n]) y +``` + +Start the backend: +```bash +pip install -r api/requirements.txt +python -m api.main +``` + +Start the frontend: +```bash +npm install +npm run dev +``` + +## Step 4: Use DeepWiki with Ollama + +1. Open http://localhost:3000 in your browser +2. Enter a GitHub, GitLab, or Bitbucket repository URL +3. Check the use "Local Ollama Model" option +4. Click "Generate Wiki" + +![Ollama Option](screenshots/Ollama.png) + +## Alternative using Dockerfile + +1. Build the docker image `docker build -f Dockerfile-ollama-local -t deepwiki:ollama-local .` +2. Run the container: + ```bash + # For regular use + docker run -p 3000:3000 -p 8001:8001 --name deepwiki \ + -v ~/.adalflow:/root/.adalflow \ + -e OLLAMA_HOST=your_ollama_host \ + deepwiki:ollama-local + + # For local repository analysis + docker run -p 3000:3000 -p 8001:8001 --name deepwiki \ + -v ~/.adalflow:/root/.adalflow \ + -e OLLAMA_HOST=your_ollama_host \ + -v /path/to/your/repo:/app/local-repos/repo-name \ + deepwiki:ollama-local + ``` + +3. When using local repositories in the interface: use `/app/local-repos/repo-name` as the local repository path. + +4. Open http://localhost:3000 in your browser + +Note: For Apple Silicon Macs, the Dockerfile automatically uses ARM64 binaries for better performance. + +## How It Works + +When you select "Use Local Ollama", DeepWiki will: + +1. Use the `nomic-embed-text` model for creating embeddings of your code +2. Use the `qwen3:1.7b` model for generating documentation +3. Process everything locally on your machine + +## Troubleshooting + +### "Cannot connect to Ollama server" +- Make sure Ollama is running in the background. You can check by running `ollama list` in your terminal. +- Verify that Ollama is running on the default port (11434) +- Try restarting Ollama + +### Slow generation +- Local models are typically slower than cloud APIs. Consider using a smaller repository or a more powerful computer. +- The `qwen3:1.7b` model is optimized for speed and quality balance. Larger models will be slower but may produce better results. + +### Out of memory errors +- If you encounter memory issues, try using a smaller model like `phi3:mini` instead of larger models. +- Close other memory-intensive applications while running Ollama + +## Advanced: Using Different Models + +If you want to try different models, you can modify the `api/config/generator.json` file: + +```python +"generator_ollama": { + "model_client": OllamaClient, + "model_kwargs": { + "model": "qwen3:1.7b", # Change this to another model + "options": { + "temperature": 0.7, + "top_p": 0.8, + } + }, +}, +``` + +You can replace `"model": "qwen3:1.7b"` with any model you've pulled with Ollama. For a list of available models, visit [Ollama's model library](https://ollama.com/library) or run `ollama list` in your terminal. + +Similarly, you can change the embedding model: + +```python +"embedder_ollama": { + "model_client": OllamaClient, + "model_kwargs": { + "model": "nomic-embed-text" # Change this to another embedding model + }, +}, +``` + +## Performance Considerations + +### Hardware Requirements + +For optimal performance with Ollama: +- **CPU**: 4+ cores recommended +- **RAM**: 8GB minimum, 16GB+ recommended +- **Storage**: 10GB+ free space for models +- **GPU**: Optional but highly recommended for faster processing + +### Model Selection Guide + +| Model | Size | Speed | Quality | Use Case | +|-------|------|-------|---------|----------| +| phi3:mini | 1.3GB | Fast | Good | Small projects, quick testing | +| qwen3:1.7b | 3.8GB | Medium | Better | Default, good balance | +| llama3:8b | 8GB | Slow | Best | Complex projects, detailed analysis | + +## Limitations + +When using Ollama with DeepWiki: + +1. **No Internet Access**: The models run completely offline and cannot access external information +2. **Limited Context Window**: Local models typically have smaller context windows than cloud APIs +3. **Less Powerful**: Local models may not match the quality of the latest cloud models + +## Conclusion + +Using DeepWiki with Ollama gives you a completely local, private solution for code documentation. While it may not match the speed or quality of cloud-based solutions, it provides a free and privacy-focused alternative that works well for most projects. + +Enjoy using DeepWiki with your local Ollama models! diff --git a/reference-deepwiki/README.es.md b/reference-deepwiki/README.es.md new file mode 100644 index 0000000..8dde374 --- /dev/null +++ b/reference-deepwiki/README.es.md @@ -0,0 +1,334 @@ +# DeepWiki-Open + +![Banner de DeepWiki](screenshots/Deepwiki.png) + +**DeepWiki** crea automáticamente wikis hermosas e interactivas para cualquier repositorio de GitHub, GitLab o BitBucket. ¡Solo ingresa el nombre de un repositorio y DeepWiki: + +1. Analizará la estructura del código +2. Generará documentación completa +3. Creará diagramas visuales para explicar cómo funciona todo +4. Organizará todo en una wiki fácil de navegar + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Características + +- **Documentación Instantánea**: Convierte cualquier repositorio de GitHub, GitLab o BitBucket en una wiki en segundos +- **Soporte para Repositorios Privados**: Accede de forma segura a repositorios privados con tokens de acceso personal +- **Análisis Inteligente**: Comprensión de la estructura y relaciones del código impulsada por IA +- **Diagramas Hermosos**: Diagramas Mermaid automáticos para visualizar la arquitectura y el flujo de datos +- **Navegación Sencilla**: Interfaz simple e intuitiva para explorar la wiki +- **Función de Preguntas**: Chatea con tu repositorio usando IA potenciada por RAG para obtener respuestas precisas +- **Investigación Profunda**: Proceso de investigación de múltiples turnos que examina a fondo temas complejos +- **Múltiples Proveedores de Modelos**: Soporte para Google Gemini, OpenAI, OpenRouter y modelos locales de Ollama + +## 🚀 Inicio Rápido (¡Súper Fácil!) + +### Opción 1: Usando Docker + +```bash +# Clonar el repositorio +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Crear un archivo .env con tus claves API +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# Opcional: Añadir clave API de OpenRouter si quieres usar modelos de OpenRouter +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Ejecutar con Docker Compose +docker-compose up +``` + +(Los comandos de Docker anteriores, así como la configuración de `docker-compose.yml`, montan el directorio `~/.adalflow` de tu host en `/root/.adalflow` dentro del contenedor. Esta ruta se utiliza para almacenar: +- Repositorios clonados (`~/.adalflow/repos/`) +- Sus embeddings e índices (`~/.adalflow/databases/`) +- Contenido de wiki generado y cacheado (`~/.adalflow/wikicache/`) + +Esto asegura que tus datos persistan incluso si el contenedor se detiene o se elimina.) + +> 💡 **Dónde obtener estas claves:** +> - Obtén una clave API de Google en [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Obtén una clave API de OpenAI en [OpenAI Platform](https://platform.openai.com/api-keys) + +### Opción 2: Configuración Manual (Recomendada) + +#### Paso 1: Configurar tus Claves API + +Crea un archivo `.env` en la raíz del proyecto con estas claves: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# Opcional: Añade esto si quieres usar modelos de OpenRouter +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### Paso 2: Iniciar el Backend + +```bash +# Instalar dependencias de Python +pip install -r api/requirements.txt + +# Iniciar el servidor API +python -m api.main +``` + +#### Paso 3: Iniciar el Frontend + +```bash +# Instalar dependencias de JavaScript +npm install +# o +yarn install + +# Iniciar la aplicación web +npm run dev +# o +yarn dev +``` + +#### Paso 4: ¡Usar DeepWiki! + +1. Abre [http://localhost:3000](http://localhost:3000) en tu navegador +2. Ingresa un repositorio de GitHub, GitLab o Bitbucket (como `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, o `https://bitbucket.org/redradish/atlassian_app_versions`) +3. Para repositorios privados, haz clic en "+ Agregar tokens de acceso" e ingresa tu token de acceso personal de GitHub o GitLab +4. ¡Haz clic en "Generar Wiki" y observa la magia suceder! + +## 🔍 Cómo Funciona + +DeepWiki usa IA para: + +1. Clonar y analizar el repositorio de GitHub, GitLab o Bitbucket (incluyendo repos privados con autenticación por token) +2. Crear embeddings del código para recuperación inteligente +3. Generar documentación con IA consciente del contexto (usando modelos de Google Gemini, OpenAI, OpenRouter o Ollama local) +4. Crear diagramas visuales para explicar las relaciones del código +5. Organizar todo en una wiki estructurada +6. Habilitar preguntas y respuestas inteligentes con el repositorio a través de la función de Preguntas +7. Proporcionar capacidades de investigación en profundidad con Investigación Profunda + +```mermaid +graph TD + A[Usuario ingresa repo GitHub/GitLab/Bitbucket] --> AA{¿Repo privado?} + AA -->|Sí| AB[Agregar token de acceso] + AA -->|No| B[Clonar Repositorio] + AB --> B + B --> C[Analizar Estructura del Código] + C --> D[Crear Embeddings del Código] + + D --> M{Seleccionar Proveedor de Modelo} + M -->|Google Gemini| E1[Generar con Gemini] + M -->|OpenAI| E2[Generar con OpenAI] + M -->|OpenRouter| E3[Generar con OpenRouter] + M -->|Ollama Local| E4[Generar con Ollama] + + E1 --> E[Generar Documentación] + E2 --> E + E3 --> E + E4 --> E + + D --> F[Crear Diagramas Visuales] + E --> G[Organizar como Wiki] + F --> G + G --> H[DeepWiki Interactiva] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ Estructura del Proyecto + +``` +deepwiki/ +├── api/ # Servidor API backend +│ ├── main.py # Punto de entrada de la API +│ ├── api.py # Implementación FastAPI +│ ├── rag.py # Generación Aumentada por Recuperación +│ ├── data_pipeline.py # Utilidades de procesamiento de datos +│ └── requirements.txt # Dependencias Python +│ +├── src/ # App frontend Next.js +│ ├── app/ # Directorio app de Next.js +│ │ └── page.tsx # Página principal de la aplicación +│ └── components/ # Componentes React +│ └── Mermaid.tsx # Renderizador de diagramas Mermaid +│ +├── public/ # Activos estáticos +├── package.json # Dependencias JavaScript +└── .env # Variables de entorno (crear este archivo) +``` + +## 🤖 Sistema de Selección de Modelos Basado en Proveedores + +DeepWiki ahora implementa un sistema flexible de selección de modelos basado en proveedores que soporta múltiples proveedores de LLM: + +### Proveedores y Modelos Soportados + +- **Google**: Predeterminado `gemini-2.5-flash`, también soporta `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc. +- **OpenAI**: Predeterminado `gpt-5-nano`, también soporta `gpt-5`, `4o`, etc. +- **OpenRouter**: Acceso a múltiples modelos a través de una API unificada, incluyendo Claude, Llama, Mistral, etc. +- **Ollama**: Soporte para modelos de código abierto ejecutados localmente como `llama3` + +### Variables de Entorno + +Cada proveedor requiere sus correspondientes variables de entorno para las claves API: + +``` +# Claves API +GOOGLE_API_KEY=tu_clave_api_google # Requerida para modelos Google Gemini +OPENAI_API_KEY=tu_clave_api_openai # Requerida para modelos OpenAI +OPENROUTER_API_KEY=tu_clave_api_openrouter # Requerida para modelos OpenRouter + +# Configuración de URL Base de OpenAI API +OPENAI_BASE_URL=https://punto-final-personalizado.com/v1 # Opcional, para endpoints personalizados de OpenAI API + +# Directorio de Configuración +DEEPWIKI_CONFIG_DIR=/ruta/a/directorio/config/personalizado # Opcional, para ubicación personalizada de archivos de configuración +``` + +### Archivos de Configuración + +DeepWiki utiliza archivos de configuración JSON para gestionar varios aspectos del sistema: + +1. **`generator.json`**: Configuración para modelos de generación de texto + - Define los proveedores de modelos disponibles (Google, OpenAI, OpenRouter, Ollama) + - Especifica los modelos predeterminados y disponibles para cada proveedor + - Contiene parámetros específicos de los modelos como temperatura y top_p + +2. **`embedder.json`**: Configuración para modelos de embeddings y procesamiento de texto + - Define modelos de embeddings para almacenamiento vectorial + - Contiene configuración del recuperador para RAG + - Especifica ajustes del divisor de texto para fragmentación de documentos + +3. **`repo.json`**: Configuración para manejo de repositorios + - Contiene filtros de archivos para excluir ciertos archivos y directorios + - Define límites de tamaño de repositorio y reglas de procesamiento + +Por defecto, estos archivos se encuentran en el directorio `api/config/`. Puedes personalizar su ubicación usando la variable de entorno `DEEPWIKI_CONFIG_DIR`. + +### Selección de Modelos Personalizados para Proveedores de Servicios + +La función de selección de modelos personalizados está diseñada específicamente para proveedores de servicios que necesitan: + +- Puede ofrecer a los usuarios dentro de su organización una selección de diferentes modelos de IA +- Puede adaptarse rápidamente al panorama de LLM en rápida evolución sin cambios de código +- Puede soportar modelos especializados o ajustados que no están en la lista predefinida + +Usted puede implementar sus ofertas de modelos seleccionando entre las opciones predefinidas o ingresando identificadores de modelos personalizados en la interfaz frontend. + +### Configuración de URL Base para Canales Privados Empresariales + +La configuración de base_url del Cliente OpenAI está diseñada principalmente para usuarios empresariales con canales API privados. Esta función: + +- Permite la conexión a endpoints API privados o específicos de la empresa +- Permite a las organizaciones usar sus propios servicios LLM auto-alojados o desplegados a medida +- Soporta integración con servicios de terceros compatibles con la API de OpenAI + +**Próximamente**: En futuras actualizaciones, DeepWiki soportará un modo donde los usuarios deberán proporcionar sus propias claves API en las solicitudes. Esto permitirá a los clientes empresariales con canales privados utilizar sus disposiciones API existentes sin compartir credenciales con el despliegue de DeepWiki. + +## 🧩 Uso de modelos de embedding compatibles con OpenAI (por ejemplo, Alibaba Qwen) + +Si deseas usar modelos de embedding compatibles con la API de OpenAI (como Alibaba Qwen), sigue estos pasos: + +1. Sustituye el contenido de `api/config/embedder.json` por el de `api/config/embedder_openai_compatible.json`. +2. En el archivo `.env` de la raíz del proyecto, configura las variables de entorno necesarias, por ejemplo: + ``` + OPENAI_API_KEY=tu_api_key + OPENAI_BASE_URL=tu_endpoint_compatible_openai + ``` +3. El programa sustituirá automáticamente los placeholders de embedder.json por los valores de tus variables de entorno. + +Así puedes cambiar fácilmente a cualquier servicio de embedding compatible con OpenAI sin modificar el código. + +## 🤖 Funciones de Preguntas e Investigación Profunda + +### Función de Preguntas + +La función de Preguntas te permite chatear con tu repositorio usando Generación Aumentada por Recuperación (RAG): + +- **Respuestas Conscientes del Contexto**: Obtén respuestas precisas basadas en el código real de tu repositorio +- **Potenciada por RAG**: El sistema recupera fragmentos de código relevantes para proporcionar respuestas fundamentadas +- **Transmisión en Tiempo Real**: Ve las respuestas mientras se generan para una experiencia más interactiva +- **Historial de Conversación**: El sistema mantiene el contexto entre preguntas para interacciones más coherentes + +### Función de Investigación Profunda + +Investigación Profunda lleva el análisis de repositorios al siguiente nivel con un proceso de investigación de múltiples turnos: + +- **Investigación en Profundidad**: Explora a fondo temas complejos a través de múltiples iteraciones de investigación +- **Proceso Estructurado**: Sigue un plan de investigación claro con actualizaciones y una conclusión completa +- **Continuación Automática**: La IA continúa automáticamente la investigación hasta llegar a una conclusión (hasta 5 iteraciones) +- **Etapas de Investigación**: + 1. **Plan de Investigación**: Describe el enfoque y los hallazgos iniciales + 2. **Actualizaciones de Investigación**: Desarrolla las iteraciones anteriores con nuevas perspectivas + 3. **Conclusión Final**: Proporciona una respuesta completa basada en todas las iteraciones + +Para usar Investigación Profunda, simplemente activa el interruptor "Investigación Profunda" en la interfaz de Preguntas antes de enviar tu pregunta. + +## 📱 Capturas de Pantalla + +![Interfaz Principal de DeepWiki](screenshots/Interface.png) +*La interfaz principal de DeepWiki* + +![Soporte para Repositorios Privados](screenshots/privaterepo.png) +*Acceso a repositorios privados con tokens de acceso personal* + +![Función de Investigación Profunda](screenshots/DeepResearch.png) +*Investigación Profunda realiza investigaciones de múltiples turnos para temas complejos* + +### Video de Demostración + +[![Video de Demostración de DeepWiki](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*¡Mira DeepWiki en acción!* + +## ❓ Solución de Problemas + +### Problemas con Claves API +- **"Faltan variables de entorno"**: Asegúrate de que tu archivo `.env` esté en la raíz del proyecto y contenga las claves API requeridas +- **"Clave API no válida"**: Verifica que hayas copiado la clave completa correctamente sin espacios adicionales +- **"Error de API OpenRouter"**: Verifica que tu clave API de OpenRouter sea válida y tenga créditos suficientes + +### Problemas de Conexión +- **"No se puede conectar al servidor API"**: Asegúrate de que el servidor API esté ejecutándose en el puerto 8001 +- **"Error CORS"**: La API está configurada para permitir todos los orígenes, pero si tienes problemas, intenta ejecutar tanto el frontend como el backend en la misma máquina + +### Problemas de Generación +- **"Error al generar wiki"**: Para repositorios muy grandes, prueba primero con uno más pequeño +- **"Formato de repositorio no válido"**: Asegúrate de usar un formato de URL válido para GitHub, GitLab o Bitbucket +- **"No se pudo obtener la estructura del repositorio"**: Para repositorios privados, asegúrate de haber ingresado un token de acceso personal válido con los permisos apropiados +- **"Error de renderizado de diagrama"**: La aplicación intentará automáticamente arreglar los diagramas rotos + +### Soluciones Comunes +1. **Reiniciar ambos servidores**: A veces un simple reinicio soluciona la mayoría de los problemas +2. **Revisar los registros de la consola**: Abre las herramientas de desarrollo del navegador para ver cualquier error de JavaScript +3. **Revisar los registros de la API**: Mira la terminal donde se ejecuta la API para ver errores de Python + +## 🤝 Contribuir + +¡Las contribuciones son bienvenidas! Siéntete libre de: +- Abrir issues para bugs o solicitudes de funciones +- Enviar pull requests para mejorar el código +- Compartir tus comentarios e ideas + +## 📄 Licencia + +Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo [LICENSE](LICENSE) para más detalles. + +## ⭐ Historial de Estrellas + +[![Gráfico de Historial de Estrellas](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + diff --git a/reference-deepwiki/README.fr.md b/reference-deepwiki/README.fr.md new file mode 100644 index 0000000..f75bd86 --- /dev/null +++ b/reference-deepwiki/README.fr.md @@ -0,0 +1,564 @@ + +# DeepWiki-Open + +![Bannière DeepWiki](screenshots/Deepwiki.png) + +**DeepWiki** est ma propre tentative d’implémentation de DeepWiki, un outil qui crée automatiquement des wikis magnifiques et interactifs pour n’importe quel dépôt GitHub, GitLab ou Bitbucket ! Il suffit d’entrer un nom de dépôt, et DeepWiki : + +1. Analyse la structure du code +2. Génère une documentation complète +3. Crée des diagrammes visuels pour expliquer le fonctionnement +4. Organise le tout dans un wiki facile à naviguer + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Tip in Crypto](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Fonctionnalités + +- **Documentation instantanée** : Transforme un dépôt GitHub, GitLab ou Bitbucket en wiki en quelques secondes +- **Support des dépôts privés** : Accès sécurisé avec jetons d’accès personnels +- **Analyse intelligente** : Compréhension de la structure et des relations du code via l’IA +- **Diagrammes élégants** : Diagrammes Mermaid automatiques pour visualiser l’architecture et les flux de données +- **Navigation facile** : Interface simple et intuitive +- **Fonction “Ask”** : Posez des questions à votre dépôt avec une IA alimentée par RAG +- **DeepResearch** : Processus de recherche multi-étapes pour explorer des sujets complexes +- **Multiples fournisseurs de modèles IA** : Prise en charge de Google Gemini, OpenAI, OpenRouter, et Ollama local + +## 🚀 Démarrage rapide (super facile !) + +### Option 1 : Avec Docker + +```bash +# Cloner le dépôt +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Créer un fichier .env avec vos clés API +echo "GOOGLE_API_KEY=votre_clé_google" > .env +echo "OPENAI_API_KEY=votre_clé_openai" >> .env +# Facultatif : clé OpenRouter +echo "OPENROUTER_API_KEY=votre_clé_openrouter" >> .env +# Facultatif : hôte personnalisé Ollama +echo "OLLAMA_HOST=votre_hote_ollama" >> .env +# Facultatif : Azure OpenAI +echo "AZURE_OPENAI_API_KEY=votre_clé_azure" >> .env +echo "AZURE_OPENAI_ENDPOINT=votre_endpoint" >> .env +echo "AZURE_OPENAI_VERSION=version_api" >> .env + +# Lancer avec Docker Compose +docker-compose up +``` + +Pour des instructions détaillées sur l’utilisation de DeepWiki avec Ollama et Docker, consultez [Ollama Instructions](Ollama-instruction.md). + +> 💡 **Où obtenir ces clés :** +> - Obtenez une clé API Google depuis [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Obtenez une clé API OpenAI depuis [OpenAI Platform](https://platform.openai.com/api-keys) +> - Obtenez les identifiants Azure OpenAI depuis [Azure Portal](https://portal.azure.com/) – créez une ressource Azure OpenAI et récupérez la clé API, l’endpoint et la version de l’API + +### Option 2 : Installation manuelle (Recommandée) + +#### Étape 1 : Configurez vos clés API + +Créez un fichier `.env` à la racine du projet avec ces clés : +``` +GOOGLE_API_KEY=votre_clé_google +OPENAI_API_KEY=votre_clé_openai +# Optionnel : Ajoutez ceci pour utiliser des modèles OpenRouter +OPENROUTER_API_KEY=votre_clé_openrouter +# Optionnel : Ajoutez ceci pour utiliser des modèles Azure OpenAI +AZURE_OPENAI_API_KEY=votre_clé_azure_openai +AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai +AZURE_OPENAI_VERSION=votre_version_azure_openai +# Optionnel :Ajouter un hôte distant Ollama si il n'est pas local. défaut : http://localhost:11434 +OLLAMA_HOST=votre_hote_ollama +``` + +#### Étape 2 : Démarrer le Backend + +```bash +# Installer dépendances Python +pip install -r api/requirements.txt + +# Démarrer le serveur API +python -m api.main +``` + +#### Étape 3 : Démarrer le Frontend + +```bash +# Installer les dépendances JavaScript +npm install +# ou +yarn install + +# Démarrer le serveur web +npm run dev +# ou +yarn dev +``` + +#### Étape 4 : Utiliser DeepWiki! + +1. Ouvrir [http://localhost:3000](http://localhost:3000) dans votre navigateur +2. Entrer l'adresse d'un dépôt GitHub, GitLab ou Bitbucket (comme `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, or `https://bitbucket.org/redradish/atlassian_app_versions`) +3. Pour les dépôts privés, cliquez sur "+ Ajouter un jeton d'accès" et entrez votre jeton d’accès personnel GitHub ou GitLab. +4. Cliquez sur "Générer le Wiki" et regardez la magie opérer ! + +## 🔍 Comment ça marche + +DeepWiki utilise l'IA pour : + +1. Cloner et analyser le dépôt GitHub, GitLab ou Bitbucket (y compris les dépôts privés avec authentification par jeton d'accès) +2. Créer des embeddings du code pour une récupération intelligente +3. Générer de la documentation avec une IA sensible au contexte (en utilisant les modèles Google Gemini, OpenAI, OpenRouter, Azure OpenAI ou Ollama local) +4. Créer des diagrammes visuels pour expliquer les relations du code +5. Organiser le tout dans un wiki structuré +6. Permettre des questions-réponses intelligentes avec le dépôt grâce à la fonctionnalité Ask +7. Fournir des capacités de recherche approfondie avec DeepResearch + +```mermaid +graph TD + A[Utilisateur entre un dépôt GitHub/GitLab/Bitbucket] --> AA{Dépôt privé?} + AA -->|Oui| AB[Ajouter un jeton d'accès] + AA -->|Non| B[Cloner le dépôt] + AB --> B + B --> C[Analyser la structure du code] + C --> D[Créer des Embeddings] + + D --> M{Sélectionner le modèle} + M -->|Google Gemini| E1[Générer avec Gemini] + M -->|OpenAI| E2[Générer avec OpenAI] + M -->|OpenRouter| E3[Générer avec OpenRouter] + M -->|Local Ollama| E4[Générer avec Ollama] + M -->|Azure| E5[Générer avec Azure] + + E1 --> E[Générer la documentation] + E2 --> E + E3 --> E + E4 --> E + E5 --> E + + D --> F[Créer des diagrammes] + E --> G[Organiser en Wiki] + F --> G + G --> H[DeepWiki interactif] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process; + class H result; +``` + +## 🛠️ Structure du Projet + +``` +deepwiki/ +├── api/ # Serveur API Backend +│ ├── main.py # Point d'entrée de l'API +│ ├── api.py # Implémentation FastAPI +│ ├── rag.py # Génération Augmentée par Récupération (RAG) +│ ├── data_pipeline.py # Utilitaires de traitement des données +│ └── requirements.txt # Dépendances Python +│ +├── src/ # Application Frontend Next.js +│ ├── app/ # Répertoire de l'application Next.js +│ │ └── page.tsx # Page principale de l'application +│ └── components/ # Composants React +│ └── Mermaid.tsx # Rendu des diagrammes Mermaid +│ +├── public/ # Ressources statiques +├── package.json # Dépendances JavaScript +└── .env # Variables d'environnement (à créer) +``` + +## 🤖 Système de sélection de modèles + +DeepWiki implémente désormais un système de sélection de modèles flexible, qui prend en charge plusieurs fournisseurs de LLM : + +### Fournisseurs et modèles pris en charge + +- **Google** : Par défaut `gemini-2.5-flash`, prend également en charge `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc. +- **OpenAI** : Par défaut `gpt-5-nano`, prend également en charge `gpt-5`, `4o`, etc. +- **OpenRouter** : Accès à plusieurs modèles via une API unifiée, notamment Claude, Llama, Mistral, etc. +- **Azure OpenAI** : Par défaut `gpt-4o`, prend également en charge `o4-mini`, etc. +- **Ollama** : Prise en charge des modèles open source exécutés localement, tels que `llama3`. + +### Variables d'environnement + +Chaque fournisseur requiert les variables d'environnement de clé API correspondantes : + +``` +# API Keys +GOOGLE_API_KEY=votre_clé_google # Requis pour les modèles Google Gemini +OPENAI_API_KEY=votre_clé_openai # Requis pour les modèles OpenAI +OPENROUTER_API_KEY=votre_clé_openrouter # Requis pour les modèles OpenRouter +AZURE_OPENAI_API_KEY=votre_clé_azure_openai #Requis pour les modèles Azure OpenAI +AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai #Requis pour les modèles Azure OpenAI +AZURE_OPENAI_VERSION=votre_version_azure_openai #Requis pour les modèles Azure OpenAI + +# Configuration d'un endpoint OpenAI API personnalisé +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # Optionnel, pour les endpoints API OpenAI personnalisés + +# Hôte Ollama personnalisé +OLLAMA_HOST=votre_hôte_ollama # Optionnel, si Ollama n'est pas local. défaut: http://localhost:11434 + +# Répertoire de configuration +DEEPWIKI_CONFIG_DIR=/chemin/vers/dossier/de/configuration # Optionnel, pour personaliser le répertoire de stockage de la configuration +``` + +### Fichiers de Configuration + +DeepWiki utilise des fichiers de configuration JSON pour gérer différents aspects du système : + +1. **`generator.json`** : Configuration des modèles de génération de texte + - Définit les fournisseurs de modèles disponibles (Google, OpenAI, OpenRouter, Azure, Ollama) + - Spécifie les modèles par défaut et disponibles pour chaque fournisseur + - Contient des paramètres spécifiques aux modèles tels que la température et top_p + +2. **`embedder.json`** : Configuration des modèles d'embedding et du traitement de texte + - Définit les modèles d'embedding pour le stockage vectoriel + - Contient la configuration du retriever pour RAG + - Spécifie les paramètres du séparateur de texte pour le chunking de documents + +3. **`repo.json`** : Configuration de la gestion des dépôts + - Contient des filtres de fichiers pour exclure certains fichiers et répertoires + - Définit les limites de taille des dépôts et les règles de traitement + +Par défaut, ces fichiers sont situés dans le répertoire `api/config/`. Vous pouvez personnaliser leur emplacement à l'aide de la variable d'environnement `DEEPWIKI_CONFIG_DIR`. + +### Sélection de Modèles Personnalisés pour les Fournisseurs de Services + +La fonctionnalité de sélection de modèles personnalisés est spécialement conçue pour les fournisseurs de services qui ont besoin de : + +- Offrir plusieurs choix de modèles d'IA aux utilisateurs au sein de leur organisation +- S'adapter rapidement à l'évolution rapide du paysage des LLM sans modifications de code +- Prendre en charge des modèles spécialisés ou affinés qui ne figurent pas dans la liste prédéfinie + +Les fournisseurs de services peuvent implémenter leurs offres de modèles en sélectionnant parmi les options prédéfinies ou en entrant des identifiants de modèles personnalisés dans l'interface utilisateur. + +### Configuration de l'URL de base pour les canaux privés d'entreprise + +La configuration `base_url` du client OpenAI est principalement conçue pour les utilisateurs d'entreprise disposant de canaux API privés. Cette fonctionnalité : + +- Permet la connexion à des points de terminaison API privés ou spécifiques à l'entreprise. +- Permet aux organisations d'utiliser leurs propres services LLM auto-hébergés ou déployés sur mesure. +- Prend en charge l'intégration avec des services tiers compatibles avec l'API OpenAI. + +**Bientôt disponible** : Dans les prochaines mises à jour, DeepWiki prendra en charge un mode où les utilisateurs devront fournir leurs propres clés API dans les requêtes. Cela permettra aux entreprises clientes disposant de canaux privés d'utiliser leurs accords API existants sans partager leurs informations d'identification avec le déploiement DeepWiki. + +## 🧩 Utilisation de modèles d'embedding compatibles avec OpenAI (par exemple, Alibaba Qwen) + +Si vous souhaitez utiliser des modèles d'embedding compatibles avec l'API OpenAI (comme Alibaba Qwen), suivez ces étapes : + +1. Remplacez le contenu de `api/config/embedder.json` par celui de `api/config/embedder_openai_compatible.json`. +2. Dans votre fichier `.env` à la racine du projet, définissez les variables d'environnement appropriées, par exemple : + ``` + OPENAI_API_KEY=votre_clé_api + OPENAI_BASE_URL=votre_endpoint_compatible_openai + ``` +3. Le programme substituera automatiquement les espaces réservés dans `embedder.json` avec les valeurs de vos variables d'environnement. + +Cela vous permet de passer facilement à n'importe quel service d'embedding compatible avec OpenAI sans modifications de code. + +### Journalisation (Logging) + +DeepWiki utilise le module `logging` intégré de Python pour la sortie de diagnostics. Vous pouvez configurer la verbosité et la destination du fichier journal via des variables d'environnement : + +| Variable | Description | Valeur par défaut | +|-----------------|---------------------------------------------------------------------------|------------------------------| +| `LOG_LEVEL` | Niveau de journalisation (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO | +| `LOG_FILE_PATH` | Chemin vers le fichier journal. Si défini, les journaux y seront écrits. | `api/logs/application.log` | + +Pour activer la journalisation de débogage et diriger les journaux vers un fichier personnalisé : +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` +Ou avec Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +Lors de l'exécution avec Docker Compose, le répertoire `api/logs` du conteneur est lié à `./api/logs` sur votre hôte (voir la section `volumes` dans `docker-compose.yml`), ce qui garantit que les fichiers journaux persistent lors des redémarrages. + +Vous pouvez également stocker ces paramètres dans votre fichier `.env` : + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` +Puis exécutez simplement : + +```bash +docker-compose up +``` + +**Considérations de sécurité concernant le chemin des journaux :** Dans les environnements de production, assurez-vous que le répertoire `api/logs` et tout chemin de fichier journal personnalisé sont sécurisés avec des permissions de système de fichiers et des contrôles d'accès appropriés. L'application s'assure que `LOG_FILE_PATH` se trouve dans le répertoire `api/logs` du projet afin d'empêcher le parcours de chemin ou les écritures non autorisées. + +## 🛠️ Configuration Avancée + +### Variables d'environnement + +| Variable | Description | Requis | Note | +|-------------------------|-----------------------------------------------------------------|------------|----------------------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Clé API Google Gemini pour la génération | Non | Requis uniquement si vous souhaitez utiliser les modèles Google Gemini | +| `OPENAI_API_KEY` | Clé API OpenAI pour les embeddings et la génération | Oui | Remarque : Ceci est requis même si vous n'utilisez pas les modèles OpenAI, car elle est utilisée pour les embeddings. | +| `OPENROUTER_API_KEY` | Clé API OpenRouter pour les modèles alternatifs | Non | Requis uniquement si vous souhaitez utiliser les modèles OpenRouter | +| `AZURE_OPENAI_API_KEY` | Clé API Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI | +| `AZURE_OPENAI_ENDPOINT` | Point de terminaison Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI | +| `AZURE_OPENAI_VERSION` | Version Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI | +| `OLLAMA_HOST` | Hôte Ollama (par défaut : http://localhost:11434) | Non | Requis uniquement si vous souhaitez utiliser un serveur Ollama externe | +| `PORT` | Port du serveur API (par défaut : 8001) | Non | Si vous hébergez l'API et le frontend sur la même machine, assurez-vous de modifier le port de `SERVER_BASE_URL` en conséquence | +| `SERVER_BASE_URL` | URL de base du serveur API (par défaut : http://localhost:8001) | Non | | +| `DEEPWIKI_AUTH_MODE` | Définir sur `true` ou `1` pour activer le mode verrouillé | Non | La valeur par défaut est `false`. Si activé, `DEEPWIKI_AUTH_CODE` est requis. | +| `DEEPWIKI_AUTH_CODE` | Le code requis pour la génération de wiki lorsque `DEEPWIKI_AUTH_MODE` est activé. | Non | Utilisé uniquement si `DEEPWIKI_AUTH_MODE` est `true` ou `1`. | + +Si vous n'utilisez pas le mode Ollama, vous devez configurer une clé API OpenAI pour les embeddings. Les autres clés API ne sont requises que si vous configurez et utilisez des modèles des fournisseurs correspondants. + +## Mode vérouillé + +DeepWiki peut être configuré pour fonctionner en mode vérouillé, où la génération de wiki nécessite un code d'autorisation valide. Ceci est utile si vous souhaitez contrôler qui peut utiliser la fonctionnalité de génération. +Restreint l'initialisation du frontend et protège la suppression du cache, mais n'empêche pas complètement la génération backend si les points de terminaison de l'API sont atteints directement. + +Pour activer le mode vérouillé, définissez les variables d'environnement suivantes : + +- `DEEPWIKI_AUTH_MODE` : définissez cette variable sur `true` ou `1`. Une fois activée, l'interface affichera un champ de saisie pour le code d'autorisation. +- `DEEPWIKI_AUTH_CODE` : définissez cette variable sur le code secret souhaité. Restreint l'initialisation du frontend et protège la suppression du cache, mais n'empêche pas complètement la génération backend si les points de terminaison de l'API sont atteints directement. + +Si `DEEPWIKI_AUTH_MODE` n'est pas défini ou est défini sur `false` (ou toute autre valeur que `true`/`1`), la fonctionnalité d'autorisation sera désactivée et aucun code ne sera requis. + +### Configuration Docker + +Vous pouvez utiliser Docker pour exécuter DeepWiki : + +#### Exécution du conteneur + +```bash +# Récupérer l'image depuis GitHub Container Registry +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# Exécuter le conteneur avec les variables d'environnement +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=votre_clé_google \ + -e OPENAI_API_KEY=votre_clé_openai \ + -e OPENROUTER_API_KEY=votre_clé_openrouter \ + -e OLLAMA_HOST=votre_hôte_ollama \ + -e AZURE_OPENAI_API_KEY=votre_clé_azure_openai \ + -e AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai \ + -e AZURE_OPENAI_VERSION=votre_version_azure_openai \ + + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Cette commande monte également `~/.adalflow` de votre hôte vers `/root/.adalflow` dans le conteneur. Ce chemin est utilisé pour stocker : +- Les dépôts clonés (`~/.adalflow/repos/`) +- Leurs embeddings et index (`~/.adalflow/databases/`) +- Le contenu wiki généré mis en cache (`~/.adalflow/wikicache/`) + +Cela garantit que vos données persistent même si le conteneur est arrêté ou supprimé. + +Vous pouvez également utiliser le fichier `docker-compose.yml` fourni : + +```bash +# Modifiez d'abord le fichier .env avec vos clés API +docker-compose up +``` + +(Le fichier `docker-compose.yml` est préconfiguré pour monter `~/.adalflow` pour la persistance des données, de manière similaire à la commande `docker run` ci-dessus.) + +#### Utilisation d'un fichier .env avec Docker + +Vous pouvez également monter un fichier `.env` dans le conteneur : + +```bash +# Créer un fichier .env avec vos clés API +echo "GOOGLE_API_KEY=votre_clé_google" > .env +echo "OPENAI_API_KEY=votre_clé_openai" >> .env +echo "OPENROUTER_API_KEY=votre_clé_openrouter" >> .env +echo "AZURE_OPENAI_API_KEY=votre_clé_azure_openai" >> .env +echo "AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai" >> .env +echo "AZURE_OPENAI_VERSION=votre_version_azure_openai" >> .env +echo "OLLAMA_HOST=votre_hôte_ollama" >> .env + +# Run the container with the .env file mounted +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Cette commande monte également `~/.adalflow` de votre hôte vers `/root/.adalflow` dans le conteneur. Ce chemin est utilisé pour stocker : +- Les dépôts clonés (`~/.adalflow/repos/`) +- Leurs embeddings et index (`~/.adalflow/databases/`) +- Le contenu wiki généré mis en cache (`~/.adalflow/wikicache/`) + +Cela garantit que vos données persistent même si le conteneur est arrêté ou supprimé. + +#### Construction de l'image Docker localement + +If you want to build the Docker image locally: + +```bash +# Clone the repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Build the Docker image +docker build -t deepwiki-open . + +# Run the container +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=votre_clé_google \ + -e OPENAI_API_KEY=votre_clé_openai \ + -e OPENROUTER_API_KEY=votre_clé_openrouter \ + -e AZURE_OPENAI_API_KEY=votre_clé_azure_openai \ + -e AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai \ + -e AZURE_OPENAI_VERSION=votre_version_azure_openai \ + -e OLLAMA_HOST=votre_hôte_ollama \ + deepwiki-open +``` + +#### Utilisation de certificats auto-signés dans Docker + +Si vous êtes dans un environnement qui utilise des certificats auto-signés, vous pouvez les inclure dans la construction de l'image Docker : + +1. Créez un répertoire pour vos certificats (le répertoire par défaut est `certs` à la racine de votre projet) +2. Copiez vos fichiers de certificats `.crt` ou `.pem` dans ce répertoire +3. Construisez l'image Docker : + +```bash +# Construire avec le répertoire de certificats par défaut (certs) +docker build . + +# Ou construire avec un répertoire de certificats personnalisé +docker build --build-arg CUSTOM_CERT_DIR=my-custom-certs . +``` + +### Détails du serveur API + +Le serveur API fournit : +- Clonage et indexation des dépôts +- RAG (Retrieval Augmented Generation - Génération augmentée par récupération) +- Complétion de chat en streaming + +Pour plus de détails, consultez le [README de l’API](./api/README.md). + +## 🔌 Intégration OpenRouter + +DeepWiki prend désormais en charge [OpenRouter](https://openrouter.ai/) en tant que fournisseur de modèles, vous donnant accès à des centaines de modèles d'IA via une seule API : + +- **Options de modèles multiples** : accédez aux modèles d'OpenAI, Anthropic, Google, Meta, Mistral, et plus encore +- **Configuration simple** : ajoutez simplement votre clé API OpenRouter et sélectionnez le modèle que vous souhaitez utiliser +- **Rentabilité** : choisissez des modèles qui correspondent à votre budget et à vos besoins en termes de performances +- **Commutation facile** : basculez entre différents modèles sans modifier votre code + +### Comment utiliser OpenRouter avec DeepWiki + +1. **Obtenez une clé API** : inscrivez-vous sur [OpenRouter](https://openrouter.ai/) et obtenez votre clé API +2. **Ajouter à l'environnement** : ajoutez `OPENROUTER_API_KEY=votre_clé` à votre fichier `.env` +3. **Activer dans l'interface utilisateur** : cochez l'option "Utiliser l'API OpenRouter" sur la page d'accueil +4. **Sélectionnez le modèle** : choisissez parmi les modèles populaires tels que GPT-4o, Claude 3.5 Sonnet, Gemini 2.0, et plus encore + +OpenRouter est particulièrement utile si vous souhaitez : + +- Essayer différents modèles sans vous inscrire à plusieurs services +- Accéder à des modèles qui pourraient être restreints dans votre région +- Comparer les performances entre différents fournisseurs de modèles +- Optimiser le rapport coût/performance en fonction de vos besoins + +## 🤖 Fonctionnalités Ask & DeepResearch + +### Fonctionnalité Ask + +La fonctionnalité Ask vous permet de discuter avec votre dépôt en utilisant la génération augmentée par récupération (RAG) : + +- **Réponses sensibles au contexte** : obtenez des réponses précises basées sur le code réel de votre dépôt +- **Alimenté par RAG** : le système récupère des extraits de code pertinents pour fournir des réponses fondées +- **Streaming en temps réel** : visualisez les réponses au fur et à mesure de leur génération pour une expérience plus interactive +- **Historique des conversations** : le système conserve le contexte entre les questions pour des interactions plus cohérentes + +### Fonctionnalité DeepResearch + +DeepResearch fait passer l'analyse de référentiel au niveau supérieur avec un processus de recherche en plusieurs étapes : + +- **Enquête approfondie** : explore en profondeur des sujets complexes grâce à de multiples itérations de recherche +- **Processus structuré** : suit un plan de recherche clair avec des mises à jour et une conclusion complète +- **Continuation automatique** : l'IA poursuit automatiquement la recherche jusqu'à ce qu'elle atteigne une conclusion (jusqu'à 5 itérations) +- **Étapes de la recherche** : + 1. **Plan de recherche** : décrit l'approche et les premières conclusions + 2. **Mises à jour de la recherche** : s'appuie sur les itérations précédentes avec de nouvelles informations + 3. **Conclusion finale** : fournit une réponse complète basée sur toutes les itérations + +Pour utiliser DeepResearch, activez simplement le commutateur "Deep Research" dans l'interface Ask avant de soumettre votre question. + +## 📱 Captures d'écran + +![Interface principale de DeepWiki](screenshots/Interface.png) +*L'interface principale de DeepWiki* + +![Prise en charge des dépôts privés](screenshots/privaterepo.png) +*Accédez aux dépôts privés avec des jetons d'accès personnels* + +![Fonctionnalité DeepResearch](screenshots/DeepResearch.png) +*DeepResearch effectue des recherches en plusieurs étapes pour des sujets complexes* + +### Vidéo de démonstration + +[![Vidéo de démo DeepWiki](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*Regardez DeepWiki en action !* +## ❓ Dépannage + +### Problèmes de clé API + +- **"Variables d'environnement manquantes"** : assurez-vous que votre fichier `.env` se trouve à la racine du projet et qu'il contient les clés API requises. +- **"Clé API non valide"** : vérifiez que vous avez correctement copié la clé complète, sans espaces supplémentaires. +- **"Erreur d'API OpenRouter"** : vérifiez que votre clé API OpenRouter est valide et qu'elle dispose de crédits suffisants. +- **"Erreur d'API Azure OpenAI"** : vérifiez que vos informations d'identification Azure OpenAI (clé API, point de terminaison et version) sont correctes et que le service est correctement déployé. + +### Problèmes de connexion + +- **"Impossible de se connecter au serveur API"** : assurez-vous que le serveur API est en cours d'exécution sur le port 8001. +- **"Erreur CORS"** : l'API est configurée pour autoriser toutes les origines, mais si vous rencontrez des problèmes, essayez d'exécuter le frontend et le backend sur la même machine. + +### Problèmes de génération + +- **"Erreur lors de la génération du wiki"** : pour les très grands référentiels, essayez d'abord un référentiel plus petit. +- **"Format de référentiel non valide"** : assurez-vous que vous utilisez un format d'URL GitHub, GitLab ou Bitbucket valide. +- **"Impossible de récupérer la structure du référentiel"** : pour les référentiels privés, assurez-vous d'avoir saisi un jeton d'accès personnel valide avec les autorisations appropriées. +- **"Erreur de rendu du diagramme"** : l'application essaiera automatiquement de corriger les diagrammes cassés. + +### Solutions courantes + +1. **Redémarrez les deux serveurs** : parfois, un simple redémarrage résout la plupart des problèmes. +2. **Vérifiez les journaux de la console** : ouvrez les outils de développement du navigateur pour voir les erreurs JavaScript. +3. **Vérifiez les journaux de l'API** : consultez le terminal où l'API est en cours d'exécution pour les erreurs Python. + +## 🤝 Contribution + +Les contributions sont les bienvenues ! N'hésitez pas à : +- Ouvrir des issues pour les bugs ou les demandes de fonctionnalités +- Soumettre des pull requests pour améliorer le code +- Partager vos commentaires et vos idées + +## 📄 Licence + +Projet sous licence MIT – Voir le fichier [LICENSE](LICENSE). + +## ⭐ Historique des stars + +[![Historique des stars](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + + diff --git a/reference-deepwiki/README.ja.md b/reference-deepwiki/README.ja.md new file mode 100644 index 0000000..1819c0f --- /dev/null +++ b/reference-deepwiki/README.ja.md @@ -0,0 +1,447 @@ +# DeepWiki-Open + +![DeepWiki バナー](screenshots/Deepwiki.png) + +**DeepWiki**は、GitHub、GitLab、または Bitbucket リポジトリのための美しくインタラクティブな Wiki を自動的に作成します!リポジトリ名を入力するだけで、DeepWiki は以下を行います: + +1. コード構造を分析 +2. 包括的なドキュメントを生成 +3. すべての仕組みを説明する視覚的な図を作成 +4. すべてを簡単に閲覧できる Wiki に整理 + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ 特徴 + +- **即時ドキュメント生成**: あらゆる GitHub、GitLab、または Bitbucket リポジトリを数秒で Wiki に変換 +- **プライベートリポジトリ対応**: 個人アクセストークンを使用してプライベートリポジトリに安全にアクセス +- **スマート分析**: AI を活用したコード構造と関係の理解 +- **美しい図表**: アーキテクチャとデータフローを視覚化する自動 Mermaid 図 +- **簡単なナビゲーション**: Wiki を探索するためのシンプルで直感的なインターフェース +- **質問機能**: RAG 搭載 AI を使用してリポジトリとチャットし、正確な回答を得る +- **詳細調査**: 複雑なトピックを徹底的に調査する多段階研究プロセス +- **複数のモデルプロバイダー**: Google Gemini、OpenAI、OpenRouter、およびローカル Ollama モデルのサポート + +## 🚀 クイックスタート(超簡単!) + +### オプション 1: Docker を使用 + +```bash +# リポジトリをクローン +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# APIキーを含む.envファイルを作成 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# オプション: OpenRouterモデルを使用する場合はOpenRouter APIキーを追加 +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Docker Composeで実行 +docker-compose up +``` + +(上記の Docker コマンドおよび`docker-compose.yml`の設定では、ホスト上の`~/.adalflow`ディレクトリをコンテナ内の`/root/.adalflow`にマウントします。このパスは以下のものを保存するために使用されます: + +- クローンされたリポジトリ (`~/.adalflow/repos/`) +- それらのエンベディングとインデックス (`~/.adalflow/databases/`) +- 生成された Wiki のキャッシュ (`~/.adalflow/wikicache/`) + +これにより、コンテナが停止または削除されてもデータが永続化されます。) + +> 💡 **これらのキーの入手先:** +> +> - Google API キーは[Google AI Studio](https://makersuite.google.com/app/apikey)から取得 +> - OpenAI API キーは[OpenAI Platform](https://platform.openai.com/api-keys)から取得 + +### オプション 2: 手動セットアップ(推奨) + +#### ステップ 1: API キーの設定 + +プロジェクトのルートに`.env`ファイルを作成し、以下のキーを追加します: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# オプション: OpenRouterモデルを使用する場合は追加 +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### ステップ 2: バックエンドの起動 + +```bash +# Pythonの依存関係をインストール +pip install -r api/requirements.txt + +# APIサーバーを起動 +python -m api.main +``` + +#### ステップ 3: フロントエンドの起動 + +```bash +# JavaScript依存関係をインストール +npm install +# または +yarn install + +# Webアプリを起動 +npm run dev +# または +yarn dev +``` + +#### ステップ 4: DeepWiki を使用! + +1. ブラウザで[http://localhost:3000](http://localhost:3000)を開く +2. GitHub、GitLab、または Bitbucket リポジトリを入力(例:`https://github.com/openai/codex`、`https://github.com/microsoft/autogen`、`https://gitlab.com/gitlab-org/gitlab`、または`https://bitbucket.org/redradish/atlassian_app_versions`) +3. プライベートリポジトリの場合は、「+ アクセストークンを追加」をクリックして GitHub または GitLab の個人アクセストークンを入力 +4. 「Wiki を生成」をクリックして、魔法が起こるのを見守りましょう! + +## 🔍 仕組み + +DeepWiki は AI を使用して: + +1. GitHub、GitLab、または Bitbucket リポジトリをクローンして分析(トークン認証によるプライベートリポジトリを含む) +2. スマート検索のためのコードの埋め込みを作成 +3. コンテキスト対応 AI でドキュメントを生成(Google Gemini、OpenAI、OpenRouter、またはローカル Ollama モデルを使用) +4. コードの関係を説明する視覚的な図を作成 +5. すべてを構造化された Wiki に整理 +6. 質問機能を通じてリポジトリとのインテリジェントな Q&A を可能に +7. 詳細調査機能で深い研究能力を提供 + +```mermaid +graph TD + A[ユーザーがGitHub/GitLab/Bitbucketリポジトリを入力] --> AA{プライベートリポジトリ?} + AA -->|はい| AB[アクセストークンを追加] + AA -->|いいえ| B[リポジトリをクローン] + AB --> B + B --> C[コード構造を分析] + C --> D[コード埋め込みを作成] + + D --> M{モデルプロバイダーを選択} + M -->|Google Gemini| E1[Geminiで生成] + M -->|OpenAI| E2[OpenAIで生成] + M -->|OpenRouter| E3[OpenRouterで生成] + M -->|ローカルOllama| E4[Ollamaで生成] + + E1 --> E[ドキュメントを生成] + E2 --> E + E3 --> E + E4 --> E + + D --> F[視覚的な図を作成] + E --> G[Wikiとして整理] + F --> G + G --> H[インタラクティブなDeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ プロジェクト構造 + +``` +deepwiki/ +├── api/ # バックエンドAPIサーバー +│ ├── main.py # APIエントリーポイント +│ ├── api.py # FastAPI実装 +│ ├── rag.py # 検索拡張生成 +│ ├── data_pipeline.py # データ処理ユーティリティ +│ └── requirements.txt # Python依存関係 +│ +├── src/ # フロントエンドNext.jsアプリ +│ ├── app/ # Next.jsアプリディレクトリ +│ │ └── page.tsx # メインアプリケーションページ +│ └── components/ # Reactコンポーネント +│ └── Mermaid.tsx # Mermaid図レンダラー +│ +├── public/ # 静的アセット +├── package.json # JavaScript依存関係 +└── .env # 環境変数(作成する必要あり) +``` + +## 🛠️ 高度な設定 + +### 環境変数 + +| 変数 | 説明 | 必須 | 注意 | +| ----------------------------- | --------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------- | +| `GOOGLE_API_KEY` | AI 生成のための Google Gemini API キー | ◯ | | +| `OPENAI_API_KEY` | 埋め込みのための OpenAI API キー | ◯ | | +| `OPENROUTER_API_KEY` | 代替モデルのための OpenRouter API キー | ✗ | OpenRouter モデルを使用する場合にのみ必須です | +| `PORT` | API サーバーのポート(デフォルト:8001) | ✗ | API とフロントエンドを同じマシンでホストする場合、`NEXT_PUBLIC_SERVER_BASE_URL`のポートを適宜変更してください | +| `SERVER_BASE_URL` | API サーバーのベース URL(デフォルト:`http://localhost:8001`) | ✗ | | + +### 設定ファイル + +DeepWikiはシステムの様々な側面を管理するためにJSON設定ファイルを使用しています: + +1. **`generator.json`**: テキスト生成モデルの設定 + - 利用可能なモデルプロバイダー(Google、OpenAI、OpenRouter、Ollama)を定義 + - 各プロバイダーのデフォルトおよび利用可能なモデルを指定 + - temperatureやtop_pなどのモデル固有のパラメータを含む + +2. **`embedder.json`**: 埋め込みモデルとテキスト処理の設定 + - ベクトルストレージ用の埋め込みモデルを定義 + - RAG用の検索設定を含む + - ドキュメントチャンク分割のためのテキスト分割設定を指定 + +3. **`repo.json`**: リポジトリ処理の設定 + - 特定のファイルやディレクトリを除外するファイルフィルターを含む + - リポジトリサイズ制限と処理ルールを定義 + +デフォルトでは、これらのファイルは`api/config/`ディレクトリにあります。`DEEPWIKI_CONFIG_DIR`環境変数を使用して、その場所をカスタマイズできます。 + +### Docker セットアップ + +Docker を使用して DeepWiki を実行できます: + +```bash +# GitHub Container Registryからイメージをプル +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# 環境変数を設定してコンテナを実行 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +このコマンドは、ホスト上の ⁠~/.adalflow をコンテナ内の ⁠/root/.adalflow にマウントします。このパスは以下のものを保存するために使用されます: + +- クローンされたリポジトリ (⁠~/.adalflow/repos/) +- それらのエンベディングとインデックス (⁠~/.adalflow/databases/) +- 生成された Wiki のキャッシュ (⁠~/.adalflow/wikicache/) + +これにより、コンテナが停止または削除されてもデータが永続化されます。 +または、提供されている ⁠docker-compose.yml ファイルを使用します。 + +```bash +# まず.envファイルをAPIキーで編集 +docker-compose up +``` + +(⁠docker-compose.yml ファイルは、上記の ⁠docker run コマンドと同様に、データ永続化のために ⁠~/.adalflow をマウントするように事前設定されています。) + +#### Docker で.env ファイルを使用する + +.env ファイルをコンテナにマウントすることもできます: + +```bash +# APIキーを含む.envファイルを作成 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# .envファイルをマウントしてコンテナを実行 +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +このコマンドは、ホスト上の ⁠~/.adalflow をコンテナ内の ⁠/root/.adalflow にマウントします。このパスは以下のものを保存するために使用されます: + +- クローンされたリポジトリ (⁠~/.adalflow/repos/) +- それらのエンベディングとインデックス (⁠~/.adalflow/databases/) +- 生成された Wiki のキャッシュ (⁠~/.adalflow/wikicache/) + +これにより、コンテナが停止または削除されてもデータが永続化されます。 + +#### Docker イメージをローカルでビルドする + +Docker イメージをローカルでビルドしたい場合: + +```bash +# リポジトリをクローン +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Dockerイメージをビルド +docker build -t deepwiki-open . + +# コンテナを実行 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + deepwiki-open +``` + +# API サーバー詳細 + +API サーバーは以下を提供します: + +- リポジトリのクローンとインデックス作成 +- RAG(Retrieval Augmented Generation:検索拡張生成) +- ストリーミングチャット補完 + +詳細については、API README を参照してください。 + +## 🤖 プロバイダーベースのモデル選択システム + +DeepWikiでは、複数のLLMプロバイダーをサポートする柔軟なプロバイダーベースのモデル選択システムを実装しています: + +### サポートされているプロバイダーとモデル + +- **Google**: デフォルトは `gemini-2.5-flash`、また `gemini-2.5-flash-lite`、`gemini-2.5-pro` などもサポート +- **OpenAI**: デフォルトは `gpt-5-nano`、また `gpt-5`、 `4o` などもサポート +- **OpenRouter**: Claude、Llama、Mistralなど、統一APIを通じて複数のモデルにアクセス +- **Ollama**: `llama3` などのローカルで実行するオープンソースモデルをサポート + +### 環境変数 + +各プロバイダーには、対応するAPI鍵の環境変数が必要です: + +``` +# API鍵 +GOOGLE_API_KEY=あなたのGoogle API鍵 # Google Geminiモデルに必要 +OPENAI_API_KEY=あなたのOpenAI鍵 # OpenAIモデルに必要 +OPENROUTER_API_KEY=あなたのOpenRouter鍵 # OpenRouterモデルに必要 + +# OpenAI APIベースURL設定 +OPENAI_BASE_URL=https://カスタムAPIエンドポイント.com/v1 # オプション、カスタムOpenAI APIエンドポイント用 +``` + +### サービスプロバイダー向けのカスタムモデル選択 + +カスタムモデル選択機能は、あなたの組織のユーザーに様々なAIモデルの選択肢を提供するために特別に設計されています: + +- あなたは組織内のユーザーに様々なAIモデルの選択肢を提供できます +- あなたはコード変更なしで急速に進化するLLM環境に迅速に適応できます +- あなたは事前定義リストにない専門的またはファインチューニングされたモデルをサポートできます + +サービスプロバイダーは、事前定義されたオプションから選択するか、フロントエンドインターフェースでカスタムモデル識別子を入力することで、モデル提供を実装できます。 + +### エンタープライズプライベートチャネル向けのベースURL設定 + +OpenAIクライアントのbase_url設定は、主にプライベートAPIチャネルを持つエンタープライズユーザー向けに設計されています。この機能は: + +- プライベートまたは企業固有のAPIエンドポイントへの接続を可能に +- 組織が自己ホスト型または独自にデプロイされたLLMサービスを使用可能に +- サードパーティのOpenAI API互換サービスとの統合をサポート + +**近日公開**: 将来のアップデートでは、ユーザーがリクエストで自分のAPI鍵を提供する必要があるモードをDeepWikiがサポートする予定です。これにより、プライベートチャネルを持つエンタープライズ顧客は、DeepWikiデプロイメントと認証情報を共有することなく、既存のAPI設定を使用できるようになります。 + +## 🔌 OpenRouter 連携 + +DeepWiki は、モデルプロバイダーとして OpenRouter をサポートするようになり、単一の API を通じて数百の AI モデルにアクセスできるようになりました。 + +- 複数のモデルオプション: OpenAI、Anthropic、Google、Meta、Mistralなど、統一APIを通じて複数のモデルにアクセス +- 簡単な設定: OpenRouter API キーを追加し、使用したいモデルを選択するだけ +- コスト効率: 予算とパフォーマンスのニーズに合ったモデルを選択 +- 簡単な切り替え: コードを変更することなく、異なるモデル間を切り替え可能 + +### DeepWiki で OpenRouter を使用する方法 + +1. API キーを取得: OpenRouter でサインアップし、API キーを取得します +2. 環境に追加: ⁠.env ファイルに ⁠OPENROUTER_API_KEY=your_key を追加します +3. UI で有効化: ホームページの「OpenRouter API を使用」オプションをチェックします +4. モデルを選択: GPT-4o、Claude 3.5 Sonnet、Gemini 2.0 などの人気モデルから選択します + +OpenRouter は特に以下のような場合に便利です: + +- 複数のサービスにサインアップせずに異なるモデルを試したい +- お住まいの地域で制限されている可能性のあるモデルにアクセスしたい +- 異なるモデルプロバイダー間でパフォーマンスを比較したい +- ニーズに基づいてコストとパフォーマンスを最適化したい + +## 🤖 質問と詳細調査機能 + +### 質問機能 + +質問機能を使用すると、検索拡張生成(RAG)を使用してリポジトリとチャットできます: + +- **コンテキスト対応の回答**: リポジトリの実際のコードに基づいた正確な回答を取得 +- **RAG 搭載**: システムは関連するコードスニペットを取得して根拠のある回答を提供 +- **リアルタイムストリーミング**: よりインタラクティブな体験のために、生成されるレスポンスをリアルタイムで確認 +- **会話履歴**: システムは質問間のコンテキストを維持し、より一貫性のあるインタラクションを実現 + +### 詳細調査機能 + +詳細調査は、複数ターンの研究プロセスでリポジトリ分析を次のレベルに引き上げます: + +- **詳細な調査**: 複数の研究反復を通じて複雑なトピックを徹底的に探索 +- **構造化されたプロセス**: 明確な研究計画、更新、包括的な結論を含む +- **自動継続**: AI は結論に達するまで自動的に研究を継続(最大 5 回の反復) +- **研究段階**: + 1. **研究計画**: アプローチと初期調査結果の概要 + 2. **研究更新**: 新しい洞察を加えて前の反復を発展 + 3. **最終結論**: すべての反復に基づく包括的な回答を提供 + +詳細調査を使用するには、質問を送信する前に質問インターフェースの「詳細調査」スイッチをオンにするだけです。 + +## 📱 スクリーンショット + +![DeepWikiメインインターフェース](screenshots/Interface.png) +_DeepWiki のメインインターフェース_ + +![プライベートリポジトリサポート](screenshots/privaterepo.png) +_個人アクセストークンを使用したプライベートリポジトリへのアクセス_ + +![詳細調査機能](screenshots/DeepResearch.png) +_詳細調査は複雑なトピックに対して多段階の調査を実施_ + +### デモビデオ + +[![DeepWikiデモビデオ](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +_DeepWiki の動作を見る!_ + +## ❓ トラブルシューティング + +### API キーの問題 + +- **「環境変数が見つかりません」**: `.env`ファイルがプロジェクトのルートにあり、必要な API キーが含まれていることを確認 +- **「API キーが無効です」**: キー全体が余分なスペースなしで正しくコピーされていることを確認 +- **「OpenRouter API エラー」**: OpenRouter API キーが有効で、十分なクレジットがあることを確認 + +### 接続の問題 + +- **「API サーバーに接続できません」**: API サーバーがポート 8001 で実行されていることを確認 +- **「CORS エラー」**: API はすべてのオリジンを許可するように設定されていますが、問題がある場合は、フロントエンドとバックエンドを同じマシンで実行してみてください + +### 生成の問題 + +- **「Wiki の生成中にエラーが発生しました」**: 非常に大きなリポジトリの場合は、まず小さいものから試してみてください +- **「無効なリポジトリ形式」**: 有効な GitHub、GitLab、または Bitbucket URL の形式を使用していることを確認 +- **「リポジトリ構造を取得できませんでした」**: プライベートリポジトリの場合、適切な権限を持つ有効な個人アクセストークンを入力したことを確認 +- **「図のレンダリングエラー」**: アプリは自動的に壊れた図を修正しようとします + +### 一般的な解決策 + +1. **両方のサーバーを再起動**: 単純な再起動でほとんどの問題が解決することがあります +2. **コンソールログを確認**: ブラウザの開発者ツールを開いて JavaScript エラーを確認 +3. **API ログを確認**: API が実行されているターミナルで Python エラーを確認 + +## 🤝 貢献 + +貢献は歓迎します!以下のことを自由に行ってください: + +- バグや機能リクエストの問題を開く +- コードを改善するためのプルリクエストを提出 +- フィードバックやアイデアを共有 + +## 📄 ライセンス + +このプロジェクトは MIT ライセンスの下でライセンスされています - 詳細は[LICENSE](LICENSE)ファイルを参照してください。 + +## ⭐ スター履歴 + +[![スター履歴チャート](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + diff --git a/reference-deepwiki/README.kr.md b/reference-deepwiki/README.kr.md new file mode 100644 index 0000000..d22edef --- /dev/null +++ b/reference-deepwiki/README.kr.md @@ -0,0 +1,430 @@ +# DeepWiki-Open + +![DeepWiki Banner](screenshots/Deepwiki.png) + +**DeepWiki**는 제가 직접 구현한 프로젝트로, GitHub, GitLab 또는 BitBucket 저장소에 대해 아름답고 대화형 위키를 자동 생성합니다! 저장소 이름만 입력하면 DeepWiki가 다음을 수행합니다: + +1. 코드 구조 분석 +2. 포괄적인 문서 생성 +3. 모든 작동 방식을 설명하는 시각적 다이어그램 생성 +4. 이를 쉽게 탐색할 수 있는 위키로 정리 + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ 주요 기능 + +- **즉시 문서화**: 어떤 GitHub, GitLab 또는 BitBucket 저장소든 몇 초 만에 위키로 변환 +- **비공개 저장소 지원**: 개인 액세스 토큰으로 비공개 저장소 안전하게 접근 +- **스마트 분석**: AI 기반 코드 구조 및 관계 이해 +- **아름다운 다이어그램**: 아키텍처와 데이터 흐름을 시각화하는 자동 Mermaid 다이어그램 +- **쉬운 탐색**: 간단하고 직관적인 인터페이스로 위키 탐색 가능 +- **Ask 기능**: RAG 기반 AI와 저장소에 대해 대화하며 정확한 답변 얻기 +- **DeepResearch**: 복잡한 주제를 철저히 조사하는 다중 턴 연구 프로세스 +- **다양한 모델 제공자 지원**: Google Gemini, OpenAI, OpenRouter, 로컬 Ollama 모델 지원 + +## 🚀 빠른 시작 (초간단!) + +### 옵션 1: Docker 사용 + +```bash +# 저장소 클론 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# API 키를 포함한 .env 파일 생성 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# 선택 사항: OpenRouter 모델 사용 시 API 키 추가 +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Docker Compose로 실행 +docker-compose up +``` + +> 💡 **API 키는 어디서 얻나요:** +> - [Google AI Studio](https://makersuite.google.com/app/apikey)에서 Google API 키 받기 +> - [OpenAI 플랫폼](https://platform.openai.com/api-keys)에서 OpenAI API 키 받기 + +### 옵션 2: 수동 설정 (권장) + +#### 1단계: API 키 설정 + +프로젝트 루트에 `.env` 파일을 만들고 다음 키들을 추가하세요: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# 선택 사항: OpenRouter 모델 사용 시 추가 +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### 2단계: 백엔드 시작 + +```bash +# Python 의존성 설치 +pip install -r api/requirements.txt + +# API 서버 실행 +python -m api.main +``` + +#### 3단계: 프론트엔드 시작 + +```bash +# JavaScript 의존성 설치 +npm install +# 또는 +yarn install + +# 웹 앱 실행 +npm run dev +# 또는 +yarn dev +``` + +#### 4단계: DeepWiki 사용하기! + +1. 브라우저에서 [http://localhost:3000](http://localhost:3000) 열기 +2. GitHub, GitLab 또는 Bitbucket 저장소 입력 (예: `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, `https://bitbucket.org/redradish/atlassian_app_versions`) +3. 비공개 저장소인 경우 "+ 액세스 토큰 추가" 클릭 후 GitHub 또는 GitLab 개인 액세스 토큰 입력 +4. "Generate Wiki" 클릭 후 마법을 지켜보기! + +## 🔍 작동 방식 + +DeepWiki는 AI를 사용하여 다음을 수행합니다: + +1. GitHub, GitLab 또는 Bitbucket 저장소 복제 및 분석 (토큰 인증이 필요한 비공개 저장소 포함) +2. 스마트 검색을 위한 코드 임베딩 생성 +3. 문맥 인지 AI로 문서 생성 (Google Gemini, OpenAI, OpenRouter 또는 로컬 Ollama 모델 사용) +4. 코드 관계를 설명하는 시각적 다이어그램 생성 +5. 모든 것을 구조화된 위키로 정리 +6. Ask 기능을 통한 저장소와의 지능형 Q&A 지원 +7. DeepResearch로 심층 연구 기능 제공 + +```mermaid +graph TD + A[사용자가 GitHub/GitLab/Bitbucket 저장소 입력] --> AA{비공개 저장소인가?} + AA -->|예| AB[액세스 토큰 추가] + AA -->|아니오| B[저장소 복제] + AB --> B + B --> C[코드 구조 분석] + C --> D[코드 임베딩 생성] + + D --> M{모델 제공자 선택} + M -->|Google Gemini| E1[Gemini로 생성] + M -->|OpenAI| E2[OpenAI로 생성] + M -->|OpenRouter| E3[OpenRouter로 생성] + M -->|로컬 Ollama| E4[Ollama로 생성] + + E1 --> E[문서 생성] + E2 --> E + E3 --> E + E4 --> E + + D --> F[시각적 다이어그램 생성] + E --> G[위키로 정리] + F --> G + G --> H[대화형 DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ 프로젝트 구조 + +``` +deepwiki/ +├── api/ # 백엔드 API 서버 +│ ├── main.py # API 진입점 +│ ├── api.py # FastAPI 구현 +│ ├── rag.py # Retrieval Augmented Generation +│ ├── data_pipeline.py # 데이터 처리 유틸리티 +│ └── requirements.txt # Python 의존성 +│ +├── src/ # 프론트엔드 Next.js 앱 +│ ├── app/ # Next.js 앱 디렉토리 +│ │ └── page.tsx # 메인 애플리케이션 페이지 +│ └── components/ # React 컴포넌트 +│ └── Mermaid.tsx # Mermaid 다이어그램 렌더러 +│ +├── public/ # 정적 자산 +├── package.json # JavaScript 의존성 +└── .env # 환경 변수 (직접 생성) +``` + +## 🛠️ 고급 설정 + +### 환경 변수 + +| 변수명 | 설명 | 필수 | 비고 | +|----------|-------------|----------|------| +| `GOOGLE_API_KEY` | AI 생성용 Google Gemini API 키 | 예 | +| `OPENAI_API_KEY` | 임베딩용 OpenAI API 키 | 예 | +| `OPENROUTER_API_KEY` | 대체 모델용 OpenRouter API 키 | 아니오 | OpenRouter 모델 사용 시 필요 | +| `PORT` | API 서버 포트 (기본값: 8001) | 아니오 | API와 프론트엔드를 같은 머신에서 호스팅 시 `SERVER_BASE_URL`의 포트도 변경 필요 | +| `SERVER_BASE_URL` | API 서버 기본 URL (기본값: http://localhost:8001) | 아니오 | + +### 설정 파일 + +DeepWiki는 시스템의 다양한 측면을 관리하기 위해 JSON 설정 파일을 사용합니다: + +1. **`generator.json`**: 텍스트 생성 모델 설정 + - 사용 가능한 모델 제공자(Google, OpenAI, OpenRouter, Ollama) 정의 + - 각 제공자의 기본 및 사용 가능한 모델 지정 + - temperature와 top_p 같은 모델별 매개변수 포함 + +2. **`embedder.json`**: 임베딩 모델 및 텍스트 처리 설정 + - 벡터 저장소용 임베딩 모델 정의 + - RAG를 위한 검색기 설정 포함 + - 문서 청킹을 위한 텍스트 분할기 설정 지정 + +3. **`repo.json`**: 저장소 처리 설정 + - 특정 파일 및 디렉토리를 제외하는 파일 필터 포함 + - 저장소 크기 제한 및 처리 규칙 정의 + +기본적으로 이러한 파일은 `api/config/` 디렉토리에 위치합니다. `DEEPWIKI_CONFIG_DIR` 환경 변수를 사용하여 위치를 사용자 정의할 수 있습니다. + +### Docker 설정 + +Docker를 사용하여 DeepWiki를 실행할 수 있습니다: + +```bash +# GitHub 컨테이너 레지스트리에서 이미지 가져오기 +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# 환경 변수와 함께 컨테이너 실행 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +이 명령어는 또한 호스트의 `~/.adalflow`를 컨테이너의 `/root/.adalflow`에 마운트합니다. 이 경로는 다음을 저장하는 데 사용됩니다: +- 복제된 저장소 (`~/.adalflow/repos/`) +- 해당 저장소의 임베딩 및 인덱스 (`~/.adalflow/databases/`) +- 생성된 위키의 캐시 (`~/.adalflow/wikicache/`) + +이를 통해 컨테이너가 중지되거나 제거되어도 데이터가 유지됩니다. + +또는 제공된 `docker-compose.yml` 파일을 사용하세요: + +```bash +# API 키가 포함된 .env 파일을 먼저 편집 +docker-compose up +``` + +(`docker-compose.yml` 파일은 위의 `docker run` 명령어와 유사하게 데이터 지속성을 위해 `~/.adalflow`를 마운트하도록 미리 구성되어 있습니다.) + +#### Docker에서 .env 파일 사용하기 + +.env 파일을 컨테이너에 마운트할 수도 있습니다: + +```bash +# API 키가 포함된 .env 파일 생성 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# .env 파일을 마운트하여 컨테이너 실행 +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +이 명령어는 또한 호스트의 `~/.adalflow`를 컨테이너의 `/root/.adalflow`에 마운트합니다. 이 경로는 다음을 저장하는 데 사용됩니다: +- 복제된 저장소 (`~/.adalflow/repos/`) +- 해당 저장소의 임베딩 및 인덱스 (`~/.adalflow/databases/`) +- 생성된 위키의 캐시 (`~/.adalflow/wikicache/`) + +이를 통해 컨테이너가 중지되거나 제거되어도 데이터가 유지됩니다. + +#### 로컬에서 Docker 이미지 빌드하기 + +로컬에서 Docker 이미지를 빌드하려면: + +```bash +# 저장소 클론 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Docker 이미지 빌드 +docker build -t deepwiki-open . + +# 컨테이너 실행 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + deepwiki-open +``` + +### API 서버 상세 정보 + +API 서버는 다음을 제공합니다: +- 저장소 복제 및 인덱싱 +- RAG (Retrieval Augmented Generation) +- 스트리밍 채팅 완성 + +자세한 내용은 [API README](./api/README.md)를 참조하세요. + +## 🤖 제공자 기반 모델 선택 시스템 + +DeepWiki는 이제 여러 LLM 제공자를 지원하는 유연한 제공자 기반 모델 선택 시스템을 구현했습니다: + +### 지원되는 제공자 및 모델 + +- **Google**: 기본값 `gemini-2.5-flash`, 또한 `gemini-2.5-flash-lite`, `gemini-2.5-pro` 등도 지원 +- **OpenAI**: 기본값 `gpt-5-nano`, 또한 `gpt-5`, `4o` 등도 지원 +- **OpenRouter**: Claude, Llama, Mistral 등 통합 API를 통해 다양한 모델 접근 가능 +- **Ollama**: `llama3`와 같은 로컬에서 실행되는 오픈소스 모델 지원 + +### 환경 변수 + +각 제공자는 해당 API 키 환경 변수가 필요합니다: + +``` +# API 키 +GOOGLE_API_KEY=귀하의_구글_API_키 # Google Gemini 모델에 필요 +OPENAI_API_KEY=귀하의_OpenAI_키 # OpenAI 모델에 필요 +OPENROUTER_API_KEY=귀하의_OpenRouter_키 # OpenRouter 모델에 필요 + +# OpenAI API 기본 URL 구성 +OPENAI_BASE_URL=https://사용자정의_API_엔드포인트.com/v1 # 선택 사항, 사용자 정의 OpenAI API 엔드포인트용 +``` + +### 서비스 제공자를 위한 사용자 정의 모델 선택 + +사용자 정의 모델 선택 기능은 다음이 필요한 서비스 제공자를 위해 특별히 설계되었습니다: + +- 귀하는 조직 내 사용자에게 다양한 AI 모델 선택 옵션을 제공할 수 있습니다 +- 귀하는 코드 변경 없이 빠르게 진화하는 LLM 환경에 신속하게 적응할 수 있습니다 +- 귀하는 사전 정의된 목록에 없는 특수하거나 미세 조정된 모델을 지원할 수 있습니다 + +서비스 제공자는 사전 정의된 옵션에서 선택하거나 프론트엔드 인터페이스에서 사용자 정의 모델 식별자를 입력하여 모델 제공을 구현할 수 있습니다. + +### 기업 전용 채널을 위한 기본 URL 구성 + +OpenAI 클라이언트의 base_url 구성은 주로 비공개 API 채널이 있는 기업 사용자를 위해 설계되었습니다. 이 기능은: + +- 비공개 또는 기업 전용 API 엔드포인트 연결 가능 +- 조직이 자체 호스팅되거나 사용자 정의 배포된 LLM 서비스 사용 가능 +- 서드파티 OpenAI API 호환 서비스와의 통합 지원 + +**출시 예정**: 향후 업데이트에서 DeepWiki는 사용자가 요청에서 자신의 API 키를 제공해야 하는 모드를 지원할 예정입니다. 이를 통해 비공개 채널이 있는 기업 고객은 DeepWiki 배포와 자격 증명을 공유하지 않고도 기존 API 구성을 사용할 수 있습니다. + +## 🔌 OpenRouter 통합 + +DeepWiki는 이제 [OpenRouter](https://openrouter.ai/)를 모델 제공자로 지원하여, 단일 API를 통해 수백 개의 AI 모델에 접근할 수 있습니다: + +- **다양한 모델 옵션**: OpenAI, Anthropic, Google, Meta, Mistral 등 다양한 모델 이용 가능 +- **간편한 설정**: OpenRouter API 키만 추가하고 원하는 모델 선택 +- **비용 효율성**: 예산과 성능에 맞는 모델 선택 가능 +- **손쉬운 전환**: 코드 변경 없이 다양한 모델 간 전환 가능 + +### DeepWiki에서 OpenRouter 사용법 + +1. **API 키 받기**: [OpenRouter](https://openrouter.ai/) 가입 후 API 키 획득 +2. **환경 변수 추가**: `.env` 파일에 `OPENROUTER_API_KEY=your_key` 추가 +3. **UI에서 활성화**: 홈페이지에서 "Use OpenRouter API" 옵션 체크 +4. **모델 선택**: GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 등 인기 모델 선택 + +OpenRouter는 특히 다음과 같은 경우 유용합니다: +- 여러 서비스에 가입하지 않고 다양한 모델 시도 +- 지역 제한이 있는 모델 접근 +- 모델 제공자별 성능 비교 +- 비용과 성능 최적화 + +## 🤖 Ask 및 DeepResearch 기능 + +### Ask 기능 + +Ask 기능은 Retrieval Augmented Generation (RAG)을 사용해 저장소와 대화할 수 있습니다: + +- **문맥 인지 답변**: 저장소 내 실제 코드 기반으로 정확한 답변 제공 +- **RAG 기반**: 관련 코드 조각을 검색해 근거 있는 답변 생성 +- **실시간 스트리밍**: 답변 생성 과정을 실시간으로 확인 가능 +- **대화 기록 유지**: 질문 간 문맥을 유지해 더 일관된 대화 가능 + +### DeepResearch 기능 + +DeepResearch는 다중 턴 연구 프로세스를 통해 저장소 분석을 한층 심화합니다: + +- **심층 조사**: 여러 연구 반복을 통해 복잡한 주제 철저히 탐구 +- **구조화된 프로세스**: 연구 계획, 업데이트, 최종 결론 단계로 진행 +- **자동 연속 진행**: AI가 최대 5회 반복해 연구를 계속 진행 +- **연구 단계**: + 1. **연구 계획**: 접근법과 초기 발견 사항 개요 작성 + 2. **연구 업데이트**: 이전 반복 내용을 바탕으로 새로운 통찰 추가 + 3. **최종 결론**: 모든 반복을 종합한 포괄적 답변 제공 + +DeepResearch를 사용하려면 질문 제출 전 Ask 인터페이스에서 "Deep Research" 스위치를 켜세요. + +## 📱 스크린샷 + +![DeepWiki Main Interface](screenshots/Interface.png) +*DeepWiki의 메인 인터페이스* + +![Private Repository Support](screenshots/privaterepo.png) +*개인 액세스 토큰으로 비공개 저장소 접근* + +![DeepResearch Feature](screenshots/DeepResearch.png) +*DeepResearch는 복잡한 주제에 대해 다중 턴 조사를 수행* + +### 데모 영상 + +[![DeepWiki Demo Video](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*DeepWiki 작동 영상 보기!* + +## ❓ 문제 해결 + +### API 키 문제 +- **"환경 변수 누락"**: `.env` 파일이 프로젝트 루트에 있고 필요한 API 키가 포함되어 있는지 확인 +- **"API 키가 유효하지 않음"**: 키를 정확히 복사했는지, 공백이 없는지 확인 +- **"OpenRouter API 오류"**: OpenRouter API 키가 유효하고 충분한 크레딧이 있는지 확인 + +### 연결 문제 +- **"API 서버에 연결할 수 없음"**: API 서버가 포트 8001에서 실행 중인지 확인 +- **"CORS 오류"**: API가 모든 출처를 허용하도록 설정되어 있지만 문제가 있으면 프론트엔드와 백엔드를 같은 머신에서 실행해 보세요 + +### 생성 문제 +- **"위키 생성 오류"**: 아주 큰 저장소는 먼저 작은 저장소로 시도해 보세요 +- **"잘못된 저장소 형식"**: 유효한 GitHub, GitLab 또는 Bitbucket URL 형식인지 확인 +- **"저장소 구조를 가져올 수 없음"**: 비공개 저장소라면 적절한 권한의 개인 액세스 토큰을 입력했는지 확인 +- **"다이어그램 렌더링 오류"**: 앱이 자동으로 다이어그램 오류를 수정하려 시도합니다 + +### 일반적인 해결법 +1. **서버 둘 다 재시작**: 간단한 재시작으로 대부분 문제 해결 +2. **콘솔 로그 확인**: 브라우저 개발자 도구에서 자바스크립트 오류 확인 +3. **API 로그 확인**: API 실행 터미널에서 Python 오류 확인 + +## 🤝 기여 + +기여를 환영합니다! 다음을 자유롭게 해주세요: +- 버그나 기능 요청을 위한 이슈 열기 +- 코드 개선을 위한 풀 리퀘스트 제출 +- 피드백과 아이디어 공유 + +## 📄 라이선스 + +이 프로젝트는 MIT 라이선스 하에 있습니다 - 자세한 내용은 [LICENSE](LICENSE) 파일 참고. + +## ⭐ 스타 히스토리 + +[![Star History Chart](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + diff --git a/reference-deepwiki/README.md b/reference-deepwiki/README.md new file mode 100644 index 0000000..6ad6f5a --- /dev/null +++ b/reference-deepwiki/README.md @@ -0,0 +1,651 @@ +# DeepWiki-Open + +![DeepWiki Banner](screenshots/Deepwiki.png) + +**DeepWiki** is my own implementation attempt of DeepWiki, automatically creates beautiful, interactive wikis for any GitHub, GitLab, or BitBucket repository! Just enter a repo name, and DeepWiki will: + +1. Analyze the code structure +2. Generate comprehensive documentation +3. Create visual diagrams to explain how everything works +4. Organize it all into an easy-to-navigate wiki + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Tip in Crypto](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Features + +- **Instant Documentation**: Turn any GitHub, GitLab or BitBucket repo into a wiki in seconds +- **Private Repository Support**: Securely access private repositories with personal access tokens +- **Smart Analysis**: AI-powered understanding of code structure and relationships +- **Beautiful Diagrams**: Automatic Mermaid diagrams to visualize architecture and data flow +- **Easy Navigation**: Simple, intuitive interface to explore the wiki +- **Ask Feature**: Chat with your repository using RAG-powered AI to get accurate answers +- **DeepResearch**: Multi-turn research process that thoroughly investigates complex topics +- **Multiple Model Providers**: Support for Google Gemini, OpenAI, OpenRouter, and local Ollama models +- **Flexible Embeddings**: Choose between OpenAI, Google AI, or local Ollama embeddings for optimal performance + +## 🚀 Quick Start (Super Easy!) + +### Option 1: Using Docker + +```bash +# Clone the repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Create a .env file with your API keys +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# Optional: Use Google AI embeddings instead of OpenAI (recommended if using Google models) +echo "DEEPWIKI_EMBEDDER_TYPE=google" >> .env +# Optional: Add OpenRouter API key if you want to use OpenRouter models +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env +# Optional: Add Ollama host if not local. defaults to http://localhost:11434 +echo "OLLAMA_HOST=your_ollama_host" >> .env +# Optional: Add Azure API key, endpoint and version if you want to use azure openai models +echo "AZURE_OPENAI_API_KEY=your_azure_openai_api_key" >> .env +echo "AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint" >> .env +echo "AZURE_OPENAI_VERSION=your_azure_openai_version" >> .env +# Run with Docker Compose +docker-compose up +``` + +For detailed instructions on using DeepWiki with Ollama and Docker, see [Ollama Instructions](Ollama-instruction.md). + +> 💡 **Where to get these keys:** +> - Get a Google API key from [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Get an OpenAI API key from [OpenAI Platform](https://platform.openai.com/api-keys) +> - Get Azure OpenAI credentials from [Azure Portal](https://portal.azure.com/) - create an Azure OpenAI resource and get the API key, endpoint, and API version + +### Option 2: Manual Setup (Recommended) + +#### Step 1: Set Up Your API Keys + +Create a `.env` file in the project root with these keys: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# Optional: Use Google AI embeddings (recommended if using Google models) +DEEPWIKI_EMBEDDER_TYPE=google +# Optional: Add this if you want to use OpenRouter models +OPENROUTER_API_KEY=your_openrouter_api_key +# Optional: Add this if you want to use Azure OpenAI models +AZURE_OPENAI_API_KEY=your_azure_openai_api_key +AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint +AZURE_OPENAI_VERSION=your_azure_openai_version +# Optional: Add Ollama host if not local. default: http://localhost:11434 +OLLAMA_HOST=your_ollama_host +``` + +#### Step 2: Start the Backend + +```bash +# Install Python dependencies +pip install -r api/requirements.txt + +# Start the API server +python -m api.main +``` + +#### Step 3: Start the Frontend + +```bash +# Install JavaScript dependencies +npm install +# or +yarn install + +# Start the web app +npm run dev +# or +yarn dev +``` + +#### Step 4: Use DeepWiki! + +1. Open [http://localhost:3000](http://localhost:3000) in your browser +2. Enter a GitHub, GitLab, or Bitbucket repository (like `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, or `https://bitbucket.org/redradish/atlassian_app_versions`) +3. For private repositories, click "+ Add access tokens" and enter your GitHub or GitLab personal access token +4. Click "Generate Wiki" and watch the magic happen! + +## 🔍 How It Works + +DeepWiki uses AI to: + +1. Clone and analyze the GitHub, GitLab, or Bitbucket repository (including private repos with token authentication) +2. Create embeddings of the code for smart retrieval +3. Generate documentation with context-aware AI (using Google Gemini, OpenAI, OpenRouter, Azure OpenAI, or local Ollama models) +4. Create visual diagrams to explain code relationships +5. Organize everything into a structured wiki +6. Enable intelligent Q&A with the repository through the Ask feature +7. Provide in-depth research capabilities with DeepResearch + +```mermaid +graph TD + A[User inputs GitHub/GitLab/Bitbucket repo] --> AA{Private repo?} + AA -->|Yes| AB[Add access token] + AA -->|No| B[Clone Repository] + AB --> B + B --> C[Analyze Code Structure] + C --> D[Create Code Embeddings] + + D --> M{Select Model Provider} + M -->|Google Gemini| E1[Generate with Gemini] + M -->|OpenAI| E2[Generate with OpenAI] + M -->|OpenRouter| E3[Generate with OpenRouter] + M -->|Local Ollama| E4[Generate with Ollama] + M -->|Azure| E5[Generate with Azure] + + E1 --> E[Generate Documentation] + E2 --> E + E3 --> E + E4 --> E + E5 --> E + + D --> F[Create Visual Diagrams] + E --> G[Organize as Wiki] + F --> G + G --> H[Interactive DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process; + class H result; +``` + +## 🛠️ Project Structure + +``` +deepwiki/ +├── api/ # Backend API server +│ ├── main.py # API entry point +│ ├── api.py # FastAPI implementation +│ ├── rag.py # Retrieval Augmented Generation +│ ├── data_pipeline.py # Data processing utilities +│ └── requirements.txt # Python dependencies +│ +├── src/ # Frontend Next.js app +│ ├── app/ # Next.js app directory +│ │ └── page.tsx # Main application page +│ └── components/ # React components +│ └── Mermaid.tsx # Mermaid diagram renderer +│ +├── public/ # Static assets +├── package.json # JavaScript dependencies +└── .env # Environment variables (create this) +``` + +## 🤖 Provider-Based Model Selection System + +DeepWiki now implements a flexible provider-based model selection system supporting multiple LLM providers: + +### Supported Providers and Models + +- **Google**: Default `gemini-2.5-flash`, also supports `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc. +- **OpenAI**: Default `gpt-5-nano`, also supports `gpt-5`, `4o`, etc. +- **OpenRouter**: Access to multiple models via a unified API, including Claude, Llama, Mistral, etc. +- **Azure OpenAI**: Default `gpt-4o`, also supports `o4-mini`, etc. +- **Ollama**: Support for locally running open-source models like `llama3` + +### Environment Variables + +Each provider requires its corresponding API key environment variables: + +``` +# API Keys +GOOGLE_API_KEY=your_google_api_key # Required for Google Gemini models +OPENAI_API_KEY=your_openai_api_key # Required for OpenAI models +OPENROUTER_API_KEY=your_openrouter_api_key # Required for OpenRouter models +AZURE_OPENAI_API_KEY=your_azure_openai_api_key #Required for Azure OpenAI models +AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint #Required for Azure OpenAI models +AZURE_OPENAI_VERSION=your_azure_openai_version #Required for Azure OpenAI models + +# OpenAI API Base URL Configuration +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # Optional, for custom OpenAI API endpoints + +# Ollama host +OLLAMA_HOST=your_ollama_host # Optional, if Ollama is not local. default: http://localhost:11434 + +# Configuration Directory +DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # Optional, for custom config file location +``` + +### Configuration Files + +DeepWiki uses JSON configuration files to manage various aspects of the system: + +1. **`generator.json`**: Configuration for text generation models + - Defines available model providers (Google, OpenAI, OpenRouter, Azure, Ollama) + - Specifies default and available models for each provider + - Contains model-specific parameters like temperature and top_p + +2. **`embedder.json`**: Configuration for embedding models and text processing + - Defines embedding models for vector storage + - Contains retriever configuration for RAG + - Specifies text splitter settings for document chunking + +3. **`repo.json`**: Configuration for repository handling + - Contains file filters to exclude certain files and directories + - Defines repository size limits and processing rules + +By default, these files are located in the `api/config/` directory. You can customize their location using the `DEEPWIKI_CONFIG_DIR` environment variable. + +### Custom Model Selection for Service Providers + +The custom model selection feature is specifically designed for service providers who need to: + +- You can offer multiple AI model choices to users within your organization +- You can quickly adapt to the rapidly evolving LLM landscape without code changes +- You can support specialized or fine-tuned models that aren't in the predefined list + +Service providers can implement their model offerings by selecting from the predefined options or entering custom model identifiers in the frontend interface. + +### Base URL Configuration for Enterprise Private Channels + +The OpenAI Client's base_url configuration is designed primarily for enterprise users with private API channels. This feature: + +- Enables connection to private or enterprise-specific API endpoints +- Allows organizations to use their own self-hosted or custom-deployed LLM services +- Supports integration with third-party OpenAI API-compatible services + +**Coming Soon**: In future updates, DeepWiki will support a mode where users need to provide their own API keys in requests. This will allow enterprise customers with private channels to use their existing API arrangements without sharing credentials with the DeepWiki deployment. + +## 🧩 Using OpenAI-Compatible Embedding Models (e.g., Alibaba Qwen) + +If you want to use embedding models compatible with the OpenAI API (such as Alibaba Qwen), follow these steps: + +1. Replace the contents of `api/config/embedder.json` with those from `api/config/embedder_openai_compatible.json`. +2. In your project root `.env` file, set the relevant environment variables, for example: + ``` + OPENAI_API_KEY=your_api_key + OPENAI_BASE_URL=your_openai_compatible_endpoint + ``` +3. The program will automatically substitute placeholders in embedder.json with the values from your environment variables. + +This allows you to seamlessly switch to any OpenAI-compatible embedding service without code changes. + +## 🧠 Using Google AI Embeddings + +DeepWiki now supports Google AI's latest embedding models as an alternative to OpenAI embeddings. This provides better integration when you're already using Google Gemini models for text generation. + +### Features + +- **Latest Model**: Uses Google's `text-embedding-004` model +- **Same API Key**: Uses your existing `GOOGLE_API_KEY` (no additional setup required) +- **Better Integration**: Optimized for use with Google Gemini text generation models +- **Task-Specific**: Supports semantic similarity, retrieval, and classification tasks +- **Batch Processing**: Efficient processing of multiple texts + +### How to Enable Google AI Embeddings + +**Option 1: Environment Variable (Recommended)** + +Set the embedder type in your `.env` file: + +```bash +# Your existing Google API key +GOOGLE_API_KEY=your_google_api_key + +# Enable Google AI embeddings +DEEPWIKI_EMBEDDER_TYPE=google +``` + +**Option 2: Docker Environment** + +```bash +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e DEEPWIKI_EMBEDDER_TYPE=google \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +**Option 3: Docker Compose** + +Add to your `.env` file: + +```bash +GOOGLE_API_KEY=your_google_api_key +DEEPWIKI_EMBEDDER_TYPE=google +``` + +Then run: + +```bash +docker-compose up +``` + +### Available Embedder Types + +| Type | Description | API Key Required | Notes | +|------|-------------|------------------|-------| +| `openai` | OpenAI embeddings (default) | `OPENAI_API_KEY` | Uses `text-embedding-3-small` model | +| `google` | Google AI embeddings | `GOOGLE_API_KEY` | Uses `text-embedding-004` model | +| `ollama` | Local Ollama embeddings | None | Requires local Ollama installation | + +### Why Use Google AI Embeddings? + +- **Consistency**: If you're using Google Gemini for text generation, using Google embeddings provides better semantic consistency +- **Performance**: Google's latest embedding model offers excellent performance for retrieval tasks +- **Cost**: Competitive pricing compared to OpenAI +- **No Additional Setup**: Uses the same API key as your text generation models + +### Switching Between Embedders + +You can easily switch between different embedding providers: + +```bash +# Use OpenAI embeddings (default) +export DEEPWIKI_EMBEDDER_TYPE=openai + +# Use Google AI embeddings +export DEEPWIKI_EMBEDDER_TYPE=google + +# Use local Ollama embeddings +export DEEPWIKI_EMBEDDER_TYPE=ollama +``` + +**Note**: When switching embedders, you may need to regenerate your repository embeddings as different models produce different vector spaces. + +### Logging + +DeepWiki uses Python's built-in `logging` module for diagnostic output. You can configure the verbosity and log file destination via environment variables: + +| Variable | Description | Default | +|-----------------|--------------------------------------------------------------------|------------------------------| +| `LOG_LEVEL` | Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO | +| `LOG_FILE_PATH` | Path to the log file. If set, logs will be written to this file. | `api/logs/application.log` | + +To enable debug logging and direct logs to a custom file: +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` +Or with Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +When running with Docker Compose, the container's `api/logs` directory is bind-mounted to `./api/logs` on your host (see the `volumes` section in `docker-compose.yml`), ensuring log files persist across restarts. + +Alternatively, you can store these settings in your `.env` file: + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` +Then simply run: + +```bash +docker-compose up +``` + +**Logging Path Security Considerations:** In production environments, ensure the `api/logs` directory and any custom log file path are secured with appropriate filesystem permissions and access controls. The application enforces that `LOG_FILE_PATH` resides within the project's `api/logs` directory to prevent path traversal or unauthorized writes. + +## 🛠️ Advanced Setup + +### Environment Variables + +| Variable | Description | Required | Note | +|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Google Gemini API key for AI generation and embeddings | No | Required for Google Gemini models and Google AI embeddings +| `OPENAI_API_KEY` | OpenAI API key for embeddings and models | Conditional | Required if using OpenAI embeddings or models | +| `OPENROUTER_API_KEY` | OpenRouter API key for alternative models | No | Required only if you want to use OpenRouter models | +| `AZURE_OPENAI_API_KEY` | Azure OpenAI API key | No | Required only if you want to use Azure OpenAI models | +| `AZURE_OPENAI_ENDPOINT` | Azure OpenAI endpoint | No | Required only if you want to use Azure OpenAI models | +| `AZURE_OPENAI_VERSION` | Azure OpenAI version | No | Required only if you want to use Azure OpenAI models | +| `OLLAMA_HOST` | Ollama Host (default: http://localhost:11434) | No | Required only if you want to use external Ollama server | +| `DEEPWIKI_EMBEDDER_TYPE` | Embedder type: `openai`, `google`, or `ollama` (default: `openai`) | No | Controls which embedding provider to use | +| `PORT` | Port for the API server (default: 8001) | No | If you host API and frontend on the same machine, make sure change port of `SERVER_BASE_URL` accordingly | +| `SERVER_BASE_URL` | Base URL for the API server (default: http://localhost:8001) | No | +| `DEEPWIKI_AUTH_MODE` | Set to `true` or `1` to enable authorization mode. | No | Defaults to `false`. If enabled, `DEEPWIKI_AUTH_CODE` is required. | +| `DEEPWIKI_AUTH_CODE` | The secret code required for wiki generation when `DEEPWIKI_AUTH_MODE` is enabled. | No | Only used if `DEEPWIKI_AUTH_MODE` is `true` or `1`. | + +**API Key Requirements:** +- If using `DEEPWIKI_EMBEDDER_TYPE=openai` (default): `OPENAI_API_KEY` is required +- If using `DEEPWIKI_EMBEDDER_TYPE=google`: `GOOGLE_API_KEY` is required +- If using `DEEPWIKI_EMBEDDER_TYPE=ollama`: No API key required (local processing) + +Other API keys are only required when configuring and using models from the corresponding providers. + +## Authorization Mode + +DeepWiki can be configured to run in an authorization mode, where wiki generation requires a valid authorization code. This is useful if you want to control who can use the generation feature. +Restricts frontend initiation and protects cache deletion, but doesn't fully prevent backend generation if API endpoints are hit directly. + +To enable authorization mode, set the following environment variables: + +- `DEEPWIKI_AUTH_MODE`: Set this to `true` or `1`. When enabled, the frontend will display an input field for the authorization code. +- `DEEPWIKI_AUTH_CODE`: Set this to the desired secret code. Restricts frontend initiation and protects cache deletion, but doesn't fully prevent backend generation if API endpoints are hit directly. + +If `DEEPWIKI_AUTH_MODE` is not set or is set to `false` (or any other value than `true`/`1`), the authorization feature will be disabled, and no code will be required. + +### Docker Setup + +You can use Docker to run DeepWiki: + +#### Running the Container + +```bash +# Pull the image from GitHub Container Registry +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# Run the container with environment variables +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -e OLLAMA_HOST=your_ollama_host \ + -e AZURE_OPENAI_API_KEY=your_azure_openai_api_key \ + -e AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint \ + -e AZURE_OPENAI_VERSION=your_azure_openai_version \ + + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +This command also mounts `~/.adalflow` on your host to `/root/.adalflow` in the container. This path is used to store: +- Cloned repositories (`~/.adalflow/repos/`) +- Their embeddings and indexes (`~/.adalflow/databases/`) +- Cached generated wiki content (`~/.adalflow/wikicache/`) + +This ensures that your data persists even if the container is stopped or removed. + +Or use the provided `docker-compose.yml` file: + +```bash +# Edit the .env file with your API keys first +docker-compose up +``` + +(The `docker-compose.yml` file is pre-configured to mount `~/.adalflow` for data persistence, similar to the `docker run` command above.) + +#### Using a .env file with Docker + +You can also mount a .env file to the container: + +```bash +# Create a .env file with your API keys +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env +echo "AZURE_OPENAI_API_KEY=your_azure_openai_api_key" >> .env +echo "AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint" >> .env +echo "AZURE_OPENAI_VERSION=your_azure_openai_version" >>.env +echo "OLLAMA_HOST=your_ollama_host" >> .env + +# Run the container with the .env file mounted +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +This command also mounts `~/.adalflow` on your host to `/root/.adalflow` in the container. This path is used to store: +- Cloned repositories (`~/.adalflow/repos/`) +- Their embeddings and indexes (`~/.adalflow/databases/`) +- Cached generated wiki content (`~/.adalflow/wikicache/`) + +This ensures that your data persists even if the container is stopped or removed. + +#### Building the Docker image locally + +If you want to build the Docker image locally: + +```bash +# Clone the repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Build the Docker image +docker build -t deepwiki-open . + +# Run the container +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -e AZURE_OPENAI_API_KEY=your_azure_openai_api_key \ + -e AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint \ + -e AZURE_OPENAI_VERSION=your_azure_openai_version \ + -e OLLAMA_HOST=your_ollama_host \ + deepwiki-open +``` + +#### Using Self-Signed Certificates in Docker + +If you're in an environment that uses self-signed certificates, you can include them in the Docker build: + +1. Create a directory for your certificates (default is `certs` in your project root) +2. Copy your `.crt` or `.pem` certificate files into this directory +3. Build the Docker image: + +```bash +# Build with default certificates directory (certs) +docker build . + +# Or build with a custom certificates directory +docker build --build-arg CUSTOM_CERT_DIR=my-custom-certs . +``` + +### API Server Details + +The API server provides: +- Repository cloning and indexing +- RAG (Retrieval Augmented Generation) +- Streaming chat completions + +For more details, see the [API README](./api/README.md). + +## 🔌 OpenRouter Integration + +DeepWiki now supports [OpenRouter](https://openrouter.ai/) as a model provider, giving you access to hundreds of AI models through a single API: + +- **Multiple Model Options**: Access models from OpenAI, Anthropic, Google, Meta, Mistral, and more +- **Simple Configuration**: Just add your OpenRouter API key and select the model you want to use +- **Cost Efficiency**: Choose models that fit your budget and performance needs +- **Easy Switching**: Toggle between different models without changing your code + +### How to Use OpenRouter with DeepWiki + +1. **Get an API Key**: Sign up at [OpenRouter](https://openrouter.ai/) and get your API key +2. **Add to Environment**: Add `OPENROUTER_API_KEY=your_key` to your `.env` file +3. **Enable in UI**: Check the "Use OpenRouter API" option on the homepage +4. **Select Model**: Choose from popular models like GPT-4o, Claude 3.5 Sonnet, Gemini 2.0, and more + +OpenRouter is particularly useful if you want to: +- Try different models without signing up for multiple services +- Access models that might be restricted in your region +- Compare performance across different model providers +- Optimize for cost vs. performance based on your needs + +## 🤖 Ask & DeepResearch Features + +### Ask Feature + +The Ask feature allows you to chat with your repository using Retrieval Augmented Generation (RAG): + +- **Context-Aware Responses**: Get accurate answers based on the actual code in your repository +- **RAG-Powered**: The system retrieves relevant code snippets to provide grounded responses +- **Real-Time Streaming**: See responses as they're generated for a more interactive experience +- **Conversation History**: The system maintains context between questions for more coherent interactions + +### DeepResearch Feature + +DeepResearch takes repository analysis to the next level with a multi-turn research process: + +- **In-Depth Investigation**: Thoroughly explores complex topics through multiple research iterations +- **Structured Process**: Follows a clear research plan with updates and a comprehensive conclusion +- **Automatic Continuation**: The AI automatically continues research until reaching a conclusion (up to 5 iterations) +- **Research Stages**: + 1. **Research Plan**: Outlines the approach and initial findings + 2. **Research Updates**: Builds on previous iterations with new insights + 3. **Final Conclusion**: Provides a comprehensive answer based on all iterations + +To use DeepResearch, simply toggle the "Deep Research" switch in the Ask interface before submitting your question. + +## 📱 Screenshots + +![DeepWiki Main Interface](screenshots/Interface.png) +*The main interface of DeepWiki* + +![Private Repository Support](screenshots/privaterepo.png) +*Access private repositories with personal access tokens* + +![DeepResearch Feature](screenshots/DeepResearch.png) +*DeepResearch conducts multi-turn investigations for complex topics* + +### Demo Video + +[![DeepWiki Demo Video](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*Watch DeepWiki in action!* + +## ❓ Troubleshooting + +### API Key Issues +- **"Missing environment variables"**: Make sure your `.env` file is in the project root and contains the required API keys +- **"API key not valid"**: Check that you've copied the full key correctly with no extra spaces +- **"OpenRouter API error"**: Verify your OpenRouter API key is valid and has sufficient credits +- **"Azure OpenAI API error"**: Verify your Azure OpenAI credentials (API key, endpoint, and version) are correct and the service is properly deployed + +### Connection Problems +- **"Cannot connect to API server"**: Make sure the API server is running on port 8001 +- **"CORS error"**: The API is configured to allow all origins, but if you're having issues, try running both frontend and backend on the same machine + +### Generation Issues +- **"Error generating wiki"**: For very large repositories, try a smaller one first +- **"Invalid repository format"**: Make sure you're using a valid GitHub, GitLab or Bitbucket URL format +- **"Could not fetch repository structure"**: For private repositories, ensure you've entered a valid personal access token with appropriate permissions +- **"Diagram rendering error"**: The app will automatically try to fix broken diagrams + +### Common Solutions +1. **Restart both servers**: Sometimes a simple restart fixes most issues +2. **Check console logs**: Open browser developer tools to see any JavaScript errors +3. **Check API logs**: Look at the terminal where the API is running for Python errors + +## 🤝 Contributing + +Contributions are welcome! Feel free to: +- Open issues for bugs or feature requests +- Submit pull requests to improve the code +- Share your feedback and ideas + +## 📄 License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +## ⭐ Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) diff --git a/reference-deepwiki/README.pt-br.md b/reference-deepwiki/README.pt-br.md new file mode 100644 index 0000000..f2f13b5 --- /dev/null +++ b/reference-deepwiki/README.pt-br.md @@ -0,0 +1,510 @@ +# DeepWiki-Open + +![DeepWiki Banner](screenshots/Deepwiki.png) + +**DeepWiki** é minha própria tentativa de implementação do DeepWiki, que cria automaticamente wikis bonitas e interativas para qualquer repositório GitHub, GitLab ou BitBucket! Basta inserir o nome de um repositório, e o DeepWiki irá: + +1. Analisar a estrutura do código +2. Gerar documentação abrangente +3. Criar diagramas visuais para explicar como tudo funciona +4. Organizar tudo em uma wiki fácil de navegar + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Tip in Crypto](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Recursos + +- **Documentação Instantânea**: Transforme qualquer repositório GitHub, GitLab ou BitBucket em uma wiki em segundos +- **Suporte a Repositórios Privados**: Acesse repositórios privados com segurança usando tokens de acesso pessoal +- **Análise Inteligente**: Compreensão da estrutura e relacionamentos do código com IA +- **Diagramas Bonitos**: Diagramas Mermaid automáticos para visualizar arquitetura e fluxo de dados +- **Navegação Fácil**: Interface simples e intuitiva para explorar a wiki +- **Recurso de Perguntas**: Converse com seu repositório usando IA com RAG para obter respostas precisas +- **DeepResearch**: Processo de pesquisa em várias etapas que investiga minuciosamente tópicos complexos +- **Múltiplos Provedores de Modelos**: Suporte para Google Gemini, OpenAI, OpenRouter e modelos locais Ollama + +## 🚀 Início Rápido (Super Fácil!) + +### Opção 1: Usando Docker + +```bash +# Clone o repositório +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Crie um arquivo .env com suas chaves de API +echo "GOOGLE_API_KEY=sua_chave_api_google" > .env +echo "OPENAI_API_KEY=sua_chave_api_openai" >> .env +# Opcional: Adicione a chave API OpenRouter se quiser usar modelos OpenRouter +echo "OPENROUTER_API_KEY=sua_chave_api_openrouter" >> .env +# Opcional: Adicione o host Ollama se não for local. padrão: http://localhost:11434 +echo "OLLAMA_HOST=seu_host_ollama" >> .env + +# Execute com Docker Compose +docker-compose up +``` + +Para instruções detalhadas sobre como usar o DeepWiki com Ollama e Docker, veja [Instruções do Ollama (em inglês)](Ollama-instruction.md). + +> 💡 **Onde obter essas chaves:** +> - Obtenha uma chave API Google no [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Obtenha uma chave API OpenAI na [Plataforma OpenAI](https://platform.openai.com/api-keys) + +### Opção 2: Configuração Manual (Recomendada) + +#### Passo 1: Configure Suas Chaves API + +Crie um arquivo `.env` na raiz do projeto com estas chaves: + +``` +GOOGLE_API_KEY=sua_chave_api_google +OPENAI_API_KEY=sua_chave_api_openai +# Opcional: Adicione isso se quiser usar modelos OpenRouter +OPENROUTER_API_KEY=sua_chave_api_openrouter +# Opcional: Adicione o host Ollama se não for local. padrão: http://localhost:11434 +OLLAMA_HOST=seu_host_ollama +``` + +#### Passo 2: Inicie o Backend + +```bash +# Instale as dependências Python +pip install -r api/requirements.txt + +# Inicie o servidor API +python -m api.main +``` + +#### Passo 3: Inicie o Frontend + +```bash +# Instale as dependências JavaScript +npm install +# ou +yarn install + +# Inicie o aplicativo web +npm run dev +# ou +yarn dev +``` + +#### Passo 4: Use o DeepWiki! + +1. Abra [http://localhost:3000](http://localhost:3000) no seu navegador +2. Insira um repositório GitHub, GitLab ou Bitbucket (como `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, ou `https://bitbucket.org/redradish/atlassian_app_versions`) +3. Para repositórios privados, clique em "+ Adicionar tokens de acesso" e insira seu token de acesso pessoal do GitHub ou GitLab +4. Clique em "Gerar Wiki" e veja a mágica acontecer! + +## 🔍 Como Funciona + +O DeepWiki usa IA para: + +1. Clonar e analisar o repositório GitHub, GitLab ou Bitbucket (incluindo repositórios privados com autenticação por token) +2. Criar embeddings do código para recuperação inteligente +3. Gerar documentação com IA contextual (usando modelos Google Gemini, OpenAI, OpenRouter ou Ollama local) +4. Criar diagramas visuais para explicar relações de código +5. Organizar tudo em uma wiki estruturada +6. Permitir perguntas e respostas inteligentes com o repositório através do recurso de Perguntas +7. Fornecer capacidades de pesquisa aprofundada com DeepResearch + +```mermaid +graph TD + A[Usuário insere repo GitHub/GitLab/Bitbucket] --> AA{Repo privado?} + AA -->|Sim| AB[Adicionar token de acesso] + AA -->|Não| B[Clonar Repositório] + AB --> B + B --> C[Analisar Estrutura do Código] + C --> D[Criar Embeddings do Código] + + D --> M{Selecionar Provedor de Modelo} + M -->|Google Gemini| E1[Gerar com Gemini] + M -->|OpenAI| E2[Gerar com OpenAI] + M -->|OpenRouter| E3[Gerar com OpenRouter] + M -->|Ollama Local| E4[Gerar com Ollama] + + E1 --> E[Gerar Documentação] + E2 --> E + E3 --> E + E4 --> E + + D --> F[Criar Diagramas Visuais] + E --> G[Organizar como Wiki] + F --> G + G --> H[DeepWiki Interativo] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ Estrutura do Projeto + +``` +deepwiki/ +├── api/ # Servidor API backend +│ ├── main.py # Ponto de entrada da API +│ ├── api.py # Implementação FastAPI +│ ├── rag.py # Retrieval Augmented Generation +│ ├── data_pipeline.py # Utilitários de processamento de dados +│ └── requirements.txt # Dependências Python +│ +├── src/ # Aplicativo Next.js frontend +│ ├── app/ # Diretório do aplicativo Next.js +│ │ └── page.tsx # Página principal do aplicativo +│ └── components/ # Componentes React +│ └── Mermaid.tsx # Renderizador de diagramas Mermaid +│ +├── public/ # Ativos estáticos +├── package.json # Dependências JavaScript +└── .env # Variáveis de ambiente (crie este arquivo) +``` + +## 🤖 Sistema de Seleção de Modelos Baseado em Provedores + +O DeepWiki agora implementa um sistema flexível de seleção de modelos baseado em provedores, suportando múltiplos provedores de LLM: + +### Provedores e Modelos Suportados + +- **Google**: Padrão `gemini-2.5-flash`, também suporta `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc. +- **OpenAI**: Padrão `gpt-5-nano`, também suporta `gpt-5`, `4o`, etc. +- **OpenRouter**: Acesso a múltiplos modelos via uma API unificada, incluindo Claude, Llama, Mistral, etc. +- **Ollama**: Suporte para modelos de código aberto executados localmente como `llama3` + +### Variáveis de Ambiente + +Cada provedor requer suas variáveis de ambiente de chave API correspondentes: + +``` +# Chaves API +GOOGLE_API_KEY=sua_chave_api_google # Necessária para modelos Google Gemini +OPENAI_API_KEY=sua_chave_api_openai # Necessária para modelos OpenAI +OPENROUTER_API_KEY=sua_chave_api_openrouter # Necessária para modelos OpenRouter + +# Configuração de URL Base da API OpenAI +OPENAI_BASE_URL=https://endpoint-api-personalizado.com/v1 # Opcional, para endpoints de API OpenAI personalizados + +# Host Ollama +OLLAMA_HOST=seu_host_ollama # Opcional, se Ollama não for local. padrão: http://localhost:11434 + +# Diretório de Configuração +DEEPWIKI_CONFIG_DIR=/caminho/para/dir/config/personalizado # Opcional, para localização personalizada de arquivos de configuração +``` + +### Arquivos de Configuração + +O DeepWiki usa arquivos de configuração JSON para gerenciar vários aspectos do sistema: + +1. **`generator.json`**: Configuração para modelos de geração de texto + - Define provedores de modelos disponíveis (Google, OpenAI, OpenRouter, Ollama) + - Especifica modelos padrão e disponíveis para cada provedor + - Contém parâmetros específicos de modelo como temperatura e top_p + +2. **`embedder.json`**: Configuração para modelos de embedding e processamento de texto + - Define modelos de embedding para armazenamento de vetores + - Contém configuração do recuperador para RAG + - Especifica configurações do divisor de texto para divisão de documentos + +3. **`repo.json`**: Configuração para manipulação de repositórios + - Contém filtros de arquivos para excluir certos arquivos e diretórios + - Define limites de tamanho de repositório e regras de processamento + +Por padrão, esses arquivos estão localizados no diretório `api/config/`. Você pode personalizar sua localização usando a variável de ambiente `DEEPWIKI_CONFIG_DIR`. + +### Seleção de Modelo Personalizado para Provedores de Serviço + +O recurso de seleção de modelo personalizado é especificamente projetado para provedores de serviço que precisam: + +- Oferecer múltiplas opções de modelo de IA para usuários dentro de sua organização +- Adaptar-se rapidamente ao panorama de LLM em rápida evolução sem mudanças de código +- Suportar modelos especializados ou ajustados que não estão na lista predefinida + +Provedores de serviço podem implementar suas ofertas de modelo selecionando entre as opções predefinidas ou inserindo identificadores de modelo personalizados na interface do frontend. + +### Configuração de URL Base para Canais Privados Empresariais + +A configuração base_url do Cliente OpenAI é projetada principalmente para usuários empresariais com canais de API privados. Este recurso: + +- Permite conexão a endpoints de API privados ou específicos da empresa +- Permite que organizações usem seus próprios serviços LLM auto-hospedados ou implantados personalizados +- Suporta integração com serviços compatíveis com a API OpenAI de terceiros + +**Em Breve**: Em atualizações futuras, o DeepWiki suportará um modo onde os usuários precisam fornecer suas próprias chaves API nas solicitações. Isso permitirá que clientes empresariais com canais privados usem seus arranjos de API existentes sem compartilhar credenciais com a implantação do DeepWiki. + +## 🤩 Usando Modelos de Embedding Compatíveis com OpenAI (ex., Alibaba Qwen) + +Se você deseja usar modelos de embedding compatíveis com a API OpenAI (como Alibaba Qwen), siga estas etapas: + +1. Substitua o conteúdo de `api/config/embedder.json` pelo de `api/config/embedder_openai_compatible.json`. +2. No arquivo `.env` da raiz do seu projeto, defina as variáveis de ambiente relevantes, por exemplo: + ``` + OPENAI_API_KEY=sua_chave_api + OPENAI_BASE_URL=seu_endpoint_compativel_openai + ``` +3. O programa substituirá automaticamente os espaços reservados em embedder.json pelos valores de suas variáveis de ambiente. + +Isso permite que você mude perfeitamente para qualquer serviço de embedding compatível com OpenAI sem mudanças de código. + +### Logging + +O DeepWiki usa o módulo `logging` integrado do Python para saída de diagnóstico. Você pode configurar a verbosidade e o destino do arquivo de log via variáveis de ambiente: + +| Variável | Descrição | Padrão | +|-----------------|--------------------------------------------------------------------|------------------------------| +| `LOG_LEVEL` | Nível de logging (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO | +| `LOG_FILE_PATH` | Caminho para o arquivo de log. Se definido, logs serão escritos neste arquivo. | `api/logs/application.log` | + +Para habilitar logging de depuração e direcionar logs para um arquivo personalizado: +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` +Ou com Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +Ao executar com Docker Compose, o diretório `api/logs` do container é montado em `./api/logs` no seu host (veja a seção `volumes` em `docker-compose.yml`), garantindo que os arquivos de log persistam entre reinicializações. + +Alternativamente, você pode armazenar essas configurações no seu arquivo `.env`: + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` +Então simplesmente execute: + +```bash +docker-compose up +``` + +**Considerações de Segurança do Caminho de Logging:** Em ambientes de produção, garanta que o diretório `api/logs` e qualquer caminho de arquivo de log personalizado estejam protegidos com permissões de sistema de arquivos e controles de acesso apropriados. O aplicativo impõe que `LOG_FILE_PATH` resida dentro do diretório `api/logs` do projeto para evitar travessia de caminho ou escritas não autorizadas. + +## 🔧 Configuração Avançada + +### Variáveis de Ambiente + +| Variável | Descrição | Obrigatória | Observação | +|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Chave API Google Gemini para geração com IA | Não | Necessária apenas se você quiser usar modelos Google Gemini +| `OPENAI_API_KEY` | Chave API OpenAI para embeddings | Sim | Nota: Isso é necessário mesmo se você não estiver usando modelos OpenAI, pois é usado para embeddings. | +| `OPENROUTER_API_KEY` | Chave API OpenRouter para modelos alternativos | Não | Necessária apenas se você quiser usar modelos OpenRouter | +| `OLLAMA_HOST` | Host Ollama (padrão: http://localhost:11434) | Não | Necessária apenas se você quiser usar servidor Ollama externo | +| `PORT` | Porta para o servidor API (padrão: 8001) | Não | Se você hospedar API e frontend na mesma máquina, certifique-se de alterar a porta de `SERVER_BASE_URL` de acordo | +| `SERVER_BASE_URL` | URL base para o servidor API (padrão: http://localhost:8001) | Não | +| `DEEPWIKI_AUTH_MODE` | Defina como `true` ou `1` para habilitar o modo de autorização. | Não | Padrão é `false`. Se habilitado, `DEEPWIKI_AUTH_CODE` é necessário. | +| `DEEPWIKI_AUTH_CODE` | O código secreto necessário para geração de wiki quando `DEEPWIKI_AUTH_MODE` está habilitado. | Não | Usado apenas se `DEEPWIKI_AUTH_MODE` for `true` ou `1`. | + +Se você não estiver usando o modo ollama, você precisa configurar uma chave API OpenAI para embeddings. Outras chaves API são necessárias apenas ao configurar e usar modelos dos provedores correspondentes. + +## Modo de Autorização + +O DeepWiki pode ser configurado para executar em um modo de autorização, onde a geração de wiki requer um código de autorização válido. Isso é útil se você quiser controlar quem pode usar o recurso de geração. +Restringe a iniciação do frontend e protege a exclusão de cache, mas não impede completamente a geração de backend se os endpoints da API forem acessados diretamente. + +Para habilitar o modo de autorização, defina as seguintes variáveis de ambiente: + +- `DEEPWIKI_AUTH_MODE`: Defina como `true` ou `1`. Quando habilitado, o frontend exibirá um campo de entrada para o código de autorização. +- `DEEPWIKI_AUTH_CODE`: Defina como o código secreto desejado. Restringe a iniciação do frontend e protege a exclusão de cache, mas não impede completamente a geração de backend se os endpoints da API forem acessados diretamente. + +Se `DEEPWIKI_AUTH_MODE` não estiver definido ou estiver definido como `false` (ou qualquer outro valor diferente de `true`/`1`), o recurso de autorização será desativado, e nenhum código será necessário. + +### Configuração Docker + +Você pode usar Docker para executar o DeepWiki: + +```bash +# Baixe a imagem do GitHub Container Registry +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# Execute o container com variáveis de ambiente +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=sua_chave_api_google \ + -e OPENAI_API_KEY=sua_chave_api_openai \ + -e OPENROUTER_API_KEY=sua_chave_api_openrouter \ + -e OLLAMA_HOST=seu_host_ollama \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Este comando também monta `~/.adalflow` no seu host para `/root/.adalflow` no container. Este caminho é usado para armazenar: +- Repositórios clonados (`~/.adalflow/repos/`) +- Seus embeddings e índices (`~/.adalflow/databases/`) +- Conteúdo de wiki gerado em cache (`~/.adalflow/wikicache/`) + +Isso garante que seus dados persistam mesmo se o container for parado ou removido. + +Ou use o arquivo `docker-compose.yml` fornecido: + +```bash +# Edite o arquivo .env com suas chaves API primeiro +docker-compose up +``` + +(O arquivo `docker-compose.yml` é pré-configurado para montar `~/.adalflow` para persistência de dados, similar ao comando `docker run` acima.) + +#### Usando um arquivo .env com Docker + +Você também pode montar um arquivo .env no container: + +```bash +# Crie um arquivo .env com suas chaves API +echo "GOOGLE_API_KEY=sua_chave_api_google" > .env +echo "OPENAI_API_KEY=sua_chave_api_openai" >> .env +echo "OPENROUTER_API_KEY=sua_chave_api_openrouter" >> .env +echo "OLLAMA_HOST=seu_host_ollama" >> .env + +# Execute o container com o arquivo .env montado +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Este comando também monta `~/.adalflow` no seu host para `/root/.adalflow` no container. Este caminho é usado para armazenar: +- Repositórios clonados (`~/.adalflow/repos/`) +- Seus embeddings e índices (`~/.adalflow/databases/`) +- Conteúdo de wiki gerado em cache (`~/.adalflow/wikicache/`) + +Isso garante que seus dados persistam mesmo se o container for parado ou removido. +#### Construindo a imagem Docker localmente + +Se você quiser construir a imagem Docker localmente: + +```bash +# Clone o repositório +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Construa a imagem Docker +docker build -t deepwiki-open . + +# Execute o container +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=sua_chave_api_google \ + -e OPENAI_API_KEY=sua_chave_api_openai \ + -e OPENROUTER_API_KEY=sua_chave_api_openrouter \ + -e OLLAMA_HOST=seu_host_ollama \ + deepwiki-open +``` + +### Detalhes do Servidor API + +O servidor API fornece: +- Clonagem e indexação de repositórios +- RAG (Retrieval Augmented Generation) +- Completions de chat com streaming + +Para mais detalhes, veja o [README da API](./api/README.md). + +## 🔌 Integração com OpenRouter + +O DeepWiki agora suporta [OpenRouter](https://openrouter.ai/) como provedor de modelos, dando acesso a centenas de modelos de IA através de uma única API: + +- **Múltiplas Opções de Modelos**: Acesse modelos da OpenAI, Anthropic, Google, Meta, Mistral e mais +- **Configuração Simples**: Apenas adicione sua chave API OpenRouter e selecione o modelo que deseja usar +- **Eficiência de Custo**: Escolha modelos que se adequem ao seu orçamento e necessidades de desempenho +- **Troca Fácil**: Alterne entre diferentes modelos sem alterar seu código + +### Como Usar o OpenRouter com DeepWiki + +1. **Obtenha uma Chave API**: Cadastre-se no [OpenRouter](https://openrouter.ai/) e obtenha sua chave API +2. **Adicione ao Ambiente**: Adicione `OPENROUTER_API_KEY=sua_chave` ao seu arquivo `.env` +3. **Habilite na UI**: Marque a opção "Usar API OpenRouter" na página inicial +4. **Selecione o Modelo**: Escolha entre modelos populares como GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 e mais + +O OpenRouter é particularmente útil se você quiser: +- Experimentar diferentes modelos sem se cadastrar em múltiplos serviços +- Acessar modelos que podem estar restritos em sua região +- Comparar desempenho entre diferentes provedores de modelos +- Otimizar custo vs. desempenho com base em suas necessidades + +## 🤖 Recursos de Perguntas & DeepResearch + +### Recurso de Perguntas + +O recurso de Perguntas permite que você converse com seu repositório usando Retrieval Augmented Generation (RAG): + +- **Respostas Contextuais**: Obtenha respostas precisas baseadas no código real em seu repositório +- **Alimentado por RAG**: O sistema recupera trechos de código relevantes para fornecer respostas fundamentadas +- **Streaming em Tempo Real**: Veja as respostas conforme são geradas para uma experiência mais interativa +- **Histórico de Conversação**: O sistema mantém contexto entre perguntas para interações mais coerentes + +### Recurso DeepResearch + +O DeepResearch leva a análise de repositórios a um novo nível com um processo de pesquisa em várias etapas: + +- **Investigação Aprofundada**: Explora minuciosamente tópicos complexos através de múltiplas iterações de pesquisa +- **Processo Estruturado**: Segue um plano de pesquisa claro com atualizações e uma conclusão abrangente +- **Continuação Automática**: A IA continua automaticamente a pesquisa até chegar a uma conclusão (até 5 iterações) +- **Estágios de Pesquisa**: + 1. **Plano de Pesquisa**: Descreve a abordagem e descobertas iniciais + 2. **Atualizações de Pesquisa**: Construído sobre iterações anteriores com novos insights + 3. **Conclusão Final**: Fornece uma resposta abrangente baseada em todas as iterações + +Para usar o DeepResearch, simplesmente alterne o interruptor "Pesquisa Aprofundada" na interface de Perguntas antes de enviar sua pergunta. + +## 📱 Capturas de Tela + +![Interface Principal do DeepWiki](screenshots/Interface.png) +*A interface principal do DeepWiki* + +![Suporte a Repositórios Privados](screenshots/privaterepo.png) +*Acesse repositórios privados com tokens de acesso pessoal* + +![Recurso DeepResearch](screenshots/DeepResearch.png) +*DeepResearch conduz investigações em várias etapas para tópicos complexos* + +### Vídeo de Demonstração + +[![Vídeo de Demonstração do DeepWiki](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*Veja o DeepWiki em ação!* + +## ❓ Solução de Problemas + +### Problemas com Chaves API +- **"Variáveis de ambiente ausentes"**: Certifique-se de que seu arquivo `.env` está na raiz do projeto e contém as chaves API necessárias +- **"Chave API não válida"**: Verifique se você copiou a chave completa corretamente sem espaços extras +- **"Erro de API OpenRouter"**: Verifique se sua chave API OpenRouter é válida e tem créditos suficientes + +### Problemas de Conexão +- **"Não é possível conectar ao servidor API"**: Certifique-se de que o servidor API está em execução na porta 8001 +- **"Erro CORS"**: A API está configurada para permitir todas as origens, mas se você estiver tendo problemas, tente executar frontend e backend na mesma máquina + +### Problemas de Geração +- **"Erro ao gerar wiki"**: Para repositórios muito grandes, tente um menor primeiro +- **"Formato de repositório inválido"**: Certifique-se de que está usando um formato de URL GitHub, GitLab ou Bitbucket válido +- **"Não foi possível buscar a estrutura do repositório"**: Para repositórios privados, certifique-se de ter inserido um token de acesso pessoal válido com as permissões apropriadas +- **"Erro de renderização de diagrama"**: O aplicativo tentará corrigir automaticamente diagramas quebrados + +### Soluções Comuns +1. **Reinicie ambos os servidores**: Às vezes um simples reinicio resolve a maioria dos problemas +2. **Verifique os logs do console**: Abra as ferramentas de desenvolvedor do navegador para ver quaisquer erros JavaScript +3. **Verifique os logs da API**: Olhe o terminal onde a API está em execução para erros Python + +## 🤝 Contribuindo + +Contribuições são bem-vindas! Sinta-se à vontade para: +- Abrir issues para bugs ou solicitações de recursos +- Enviar pull requests para melhorar o código +- Compartilhar seu feedback e ideias + +## 📄 Licença + +Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes. + +## ⭐ Histórico de Estrelas + +[![Gráfico de Histórico de Estrelas](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) diff --git a/reference-deepwiki/README.ru.md b/reference-deepwiki/README.ru.md new file mode 100644 index 0000000..f74a9d0 --- /dev/null +++ b/reference-deepwiki/README.ru.md @@ -0,0 +1,509 @@ +# DeepWiki-Open + +![Баннер DeepWiki](screenshots/Deepwiki.png) + +**DeepWiki** — это моя собственная реализация DeepWiki, автоматически создающая красивые, интерактивные вики по любому репозиторию на GitHub, GitLab или BitBucket! Просто укажите название репозитория, и DeepWiki выполнит: + +1. Анализ структуры кода +2. Генерацию полноценной документации +3. Построение визуальных диаграмм, объясняющих работу системы +4. Организацию всего в удобную и структурированную вики + +[!["Купить мне кофе"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Поддержать в криптовалюте](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Возможности + +- **Мгновенная документация**: Превращение любого репозитория в вики за считанные секунды +- **Поддержка приватных репозиториев**: Безопасный доступ с помощью персональных токенов +- **Умный анализ**: Понимание структуры и взаимосвязей в коде с помощью ИИ +- **Красивые диаграммы**: Автоматическая генерация диаграмм Mermaid для отображения архитектуры и потоков данных +- **Простая навигация**: Интуитивный интерфейс для изучения вики +- **Функция “Спросить”**: Общение с репозиторием через ИИ, основанный на RAG, для получения точных ответов +- **DeepResearch**: Многошаговое исследование для глубокого анализа сложных тем +- **Поддержка различных провайдеров моделей**: Google Gemini, OpenAI, OpenRouter и локальные модели Ollama + +## 🚀 Быстрый старт (максимально просто!) + +### Вариант 1: С использованием Docker + +```bash +# Клонируйте репозиторий +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Создайте файл .env с вашими API-ключами +echo "GOOGLE_API_KEY=ваш_google_api_key" > .env +echo "OPENAI_API_KEY=ваш_openai_api_key" >> .env +# Необязательно: ключ OpenRouter +echo "OPENROUTER_API_KEY=ваш_openrouter_api_key" >> .env +# Необязательно: указать хост Ollama, если он не локальный (по умолчанию http://localhost:11434) +echo "OLLAMA_HOST=ваш_ollama_host" >> .env +# Необязательно: ключ и параметры Azure OpenAI +echo "AZURE_OPENAI_API_KEY=ваш_azure_api_key" >> .env +echo "AZURE_OPENAI_ENDPOINT=ваш_azure_endpoint" >> .env +echo "AZURE_OPENAI_VERSION=ваша_azure_version" >> .env +# Запуск через Docker Compose +docker-compose up +``` + +Подробную инструкцию по работе с Ollama и Docker см. в [Ollama Instructions](Ollama-instruction.md). + +> 💡 **Где взять ключи API:** +> - [Google AI Studio](https://makersuite.google.com/app/apikey) +> - [OpenAI Platform](https://platform.openai.com/api-keys) +> - [Azure Portal](https://portal.azure.com/) + +### Вариант 2: Ручная установка (рекомендуется) + +#### Шаг 1: Установка ключей API + +Создайте файл `.env` в корне проекта со следующим содержанием: + +``` +GOOGLE_API_KEY=ваш_google_api_key +OPENAI_API_KEY=ваш_openai_api_key +# Необязательно: для OpenRouter +OPENROUTER_API_KEY=ваш_openrouter_api_key +# Необязательно: для Azure OpenAI +AZURE_OPENAI_API_KEY=ваш_azure_api_key +AZURE_OPENAI_ENDPOINT=ваш_azure_endpoint +AZURE_OPENAI_VERSION=ваша_azure_version +# Необязательно: если Ollama не локальная +OLLAMA_HOST=ваш_ollama_host +``` + +#### Шаг 2: Запуск backend-сервера + +```bash +# Установка зависимостей +pip install -r api/requirements.txt + +# Запуск API +python -m api.main +``` + +#### Шаг 3: Запуск frontend-интерфейса + +```bash +# Установка JS-зависимостей +npm install +# или +yarn install + +# Запуск веб-интерфейса +npm run dev +# или +yarn dev +``` + +#### Шаг 4: Используйте DeepWiki! + +1. Откройте [http://localhost:3000](http://localhost:3000) в браузере +2. Введите URL репозитория (например, `https://github.com/openai/codex`) +3. Для приватных репозиториев нажмите “+ Add access tokens” и введите токен +4. Нажмите “Generate Wiki” и наблюдайте за магией! + +## 🔍 Как это работает + +DeepWiki использует искусственный интеллект, чтобы: + +1. Клонировать и проанализировать репозиторий GitHub, GitLab или Bitbucket (включая приватные — с использованием токенов) +2. Создать эмбеддинги кода для интеллектуального поиска +3. Сгенерировать документацию с учетом контекста (с помощью Google Gemini, OpenAI, OpenRouter, Azure OpenAI или локальных моделей Ollama) +4. Построить визуальные диаграммы для отображения связей в коде +5. Организовать всё в структурированную вики +6. Включить интеллектуальное взаимодействие через функцию "Спросить" +7. Обеспечить углубленный анализ через DeepResearch + +```mermaid +graph TD + A[Пользователь вводит ссылку на репозиторий] --> AA{Приватный репозиторий?} + AA -->|Да| AB[Добавить токен доступа] + AA -->|Нет| B[Клонировать репозиторий] + AB --> B + B --> C[Анализ структуры кода] + C --> D[Создание эмбеддингов] + + D --> M{Выбор провайдера модели} + M -->|Google Gemini| E1[Генерация через Gemini] + M -->|OpenAI| E2[Генерация через OpenAI] + M -->|OpenRouter| E3[Генерация через OpenRouter] + M -->|Локальная Ollama| E4[Генерация через Ollama] + M -->|Azure| E5[Генерация через Azure] + + E1 --> E[Создание документации] + E2 --> E + E3 --> E + E4 --> E + E5 --> E + + D --> F[Создание диаграмм] + E --> G[Формирование вики] + F --> G + G --> H[Интерактивная DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process; + class H result; +``` + +## 🛠️ Структура проекта + +``` +deepwiki/ +├── api/ # Backend API сервер +│ ├── main.py # Точка входа API +│ ├── api.py # Реализация через FastAPI +│ ├── rag.py # RAG: генерация с дополнением +│ ├── data_pipeline.py # Утилиты обработки данных +│ └── requirements.txt # Зависимости Python +│ +├── src/ # Клиентское приложение на Next.js +│ ├── app/ # Каталог приложения Next.js +│ │ └── page.tsx # Главная страница приложения +│ └── components/ # React-компоненты +│ └── Mermaid.tsx # Рендеринг диаграмм Mermaid +│ +├── public/ # Статические ресурсы +├── package.json # JS-зависимости +└── .env # Переменные окружения +``` + +## 🤖 Система выбора моделей по провайдерам + +DeepWiki поддерживает гибкую систему выбора моделей от разных поставщиков: + +### Поддерживаемые провайдеры и модели + +- **Google**: По умолчанию `gemini-2.5-flash`, также доступны `gemini-2.5-flash-lite`, `gemini-2.5-pro`, и др. +- **OpenAI**: По умолчанию `gpt-5-nano`, также поддерживает `gpt-5`, `4o` и другие +- **OpenRouter**: Доступ к множеству моделей через единый API (Claude, Llama, Mistral и др.) +- **Azure OpenAI**: По умолчанию `gpt-4o`, поддерживаются и другие +- **Ollama**: Локальные open-source модели, например `llama3` + +### Переменные окружения + +Каждому провайдеру соответствуют свои ключи: + +```bash +GOOGLE_API_KEY=... # Для моделей Google Gemini +OPENAI_API_KEY=... # Для моделей OpenAI +OPENROUTER_API_KEY=... # Для моделей OpenRouter +AZURE_OPENAI_API_KEY=... # Для моделей Azure +AZURE_OPENAI_ENDPOINT=... +AZURE_OPENAI_VERSION=... + +# Кастомный адрес для OpenAI API +OPENAI_BASE_URL=https://ваш-кастомный-api/v1 + +# Хост Ollama +OLLAMA_HOST=http://localhost:11434 + +# Каталог конфигурации +DEEPWIKI_CONFIG_DIR=/путь/к/конфигурации +``` + +### Конфигурационные файлы + +DeepWiki использует JSON-файлы для настройки: + +1. **`generator.json`** — конфигурация генерации текста и моделей +2. **`embedder.json`** — настройки эмбеддингов и ретривера +3. **`repo.json`** — правила обработки репозиториев + +По умолчанию хранятся в `api/config/`, путь можно изменить через `DEEPWIKI_CONFIG_DIR`. + +### Кастомизация для сервис-провайдеров + +Функция выбора модели позволяет: + +- Предоставлять выбор моделей пользователям вашей системы +- Легко адаптироваться к новым LLM без изменения кода +- Поддерживать кастомные или специализированные модели + +Пользователи могут выбрать модель через интерфейс или указать свой идентификатор. + +### Настройка OpenAI base_url для корпоративных клиентов + +Позволяет: + +- Использовать приватные API OpenAI +- Подключаться к self-hosted решениям +- Интегрироваться с совместимыми сторонними сервисами + +**Скоро**: DeepWiki получит режим, в котором пользователи будут указывать свои API-ключи напрямую в запросах — удобно для корпоративных решений. + +## 🧩 Использование совместимых с OpenAI моделей (например, Alibaba Qwen) + +Чтобы использовать модели эмбеддингов, совместимые с OpenAI: + +1. Замените `api/config/embedder.json` на `embedder_openai_compatible.json` +2. В `.env` добавьте: +```bash +OPENAI_API_KEY=ваш_ключ +OPENAI_BASE_URL=совместимый_endpoint +``` + +Программа автоматически подставит значения из переменных окружения. + +### Логирование + +DeepWiki использует стандартный `logging` из Python. Настраивается через: + +| Переменная | Описание | Значение по умолчанию | +|------------------|-----------------------------------------------|-------------------------------| +| `LOG_LEVEL` | Уровень логов (DEBUG, INFO, WARNING и т.д.) | INFO | +| `LOG_FILE_PATH` | Путь к файлу логов | `api/logs/application.log` | + +Пример: +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` + +Или через Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +Для постоянства логов при перезапуске контейнера `api/logs` монтируется в `./api/logs`. + +Также можно указать переменные в `.env`: + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` + +И просто выполнить: + +```bash +docker-compose up +``` + +**Безопасность логов:** в продакшене важно настроить права доступа к `api/logs`, чтобы исключить несанкционированный доступ или запись. + +## 🛠️ Расширенная настройка + +### Переменные окружения + +| Переменная | Назначение | Обязательно | Примечание | +|--------------------------|------------------------------------------------------------------------|-------------|-----------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Ключ API для Google Gemini | Нет | Только если используете модели от Google | +| `OPENAI_API_KEY` | Ключ API для OpenAI (нужен даже для эмбеддингов) | Да | Обязателен для генерации эмбеддингов | +| `OPENROUTER_API_KEY` | Ключ API для OpenRouter | Нет | Только если используете модели OpenRouter | +| `AZURE_OPENAI_API_KEY` | Ключ Azure OpenAI | Нет | Только если используете Azure | +| `AZURE_OPENAI_ENDPOINT` | Endpoint Azure | Нет | Только если используете Azure | +| `AZURE_OPENAI_VERSION` | Версия API Azure | Нет | Только если используете Azure | +| `OLLAMA_HOST` | Хост Ollama (по умолчанию http://localhost:11434) | Нет | Указывается при использовании внешнего сервера Ollama | +| `PORT` | Порт API-сервера (по умолчанию 8001) | Нет | Меняйте, если frontend и backend работают на одной машине | +| `SERVER_BASE_URL` | Базовый URL для API (по умолчанию http://localhost:8001) | Нет | | +| `DEEPWIKI_AUTH_MODE` | Включает режим авторизации (true или 1) | Нет | Если включён, потребуется код из `DEEPWIKI_AUTH_CODE` | +| `DEEPWIKI_AUTH_CODE` | Секретный код для запуска генерации | Нет | Только если включён режим авторизации | + +Если не используете Ollama, обязательно настройте OpenAI API ключ. + +## Режим авторизации + +DeepWiki может быть запущен в режиме авторизации — для генерации вики потребуется ввести секретный код. Это полезно, если вы хотите ограничить доступ к функциональности. + +Для включения: + +- `DEEPWIKI_AUTH_MODE=true` +- `DEEPWIKI_AUTH_CODE=секретный_код` + +Это ограничивает доступ с фронтенда и защищает кэш, но не блокирует прямые вызовы API. + +### Запуск через Docker + +Вы можете использовать Docker: + +#### Запуск контейнера + +```bash +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=... \ + -e OPENAI_API_KEY=... \ + -e OPENROUTER_API_KEY=... \ + -e OLLAMA_HOST=... \ + -e AZURE_OPENAI_API_KEY=... \ + -e AZURE_OPENAI_ENDPOINT=... \ + -e AZURE_OPENAI_VERSION=... \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Каталог `~/.adalflow` содержит: + +- Клонированные репозитории +- Эмбеддинги и индексы +- Сгенерированные кэшированные вики + +#### Docker Compose + +```bash +# Убедитесь, что .env заполнен +docker-compose up +``` + +#### Использование .env + +```bash +echo "GOOGLE_API_KEY=..." > .env +... +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +#### Локальная сборка Docker-образа + +```bash +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +docker build -t deepwiki-open . + +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=... \ + -e OPENAI_API_KEY=... \ + ... \ + deepwiki-open +``` + +#### Самоподписанные сертификаты + +1. Создайте каталог `certs` (или свой) +2. Поместите сертификаты `.crt` или `.pem` +3. Соберите образ: + +```bash +docker build --build-arg CUSTOM_CERT_DIR=certs . +``` + +### Описание API + +Сервер API: + +- Клонирует и индексирует репозитории +- Реализует RAG +- Поддерживает потоковую генерацию + +См. подробности в [API README](./api/README.md) + +## 🔌 Интеграция с OpenRouter + +Платформа [OpenRouter](https://openrouter.ai/) предоставляет доступ ко множеству моделей: + +- **Много моделей**: OpenAI, Anthropic, Google, Meta и др. +- **Простая настройка**: достаточно API-ключа +- **Гибкость и экономия**: выбирайте модели по цене и производительности +- **Быстрое переключение**: без изменения кода + +### Как использовать + +1. Получите ключ на [OpenRouter](https://openrouter.ai/) +2. Добавьте `OPENROUTER_API_KEY=...` в `.env` +3. Активируйте в интерфейсе +4. Выберите модель (например GPT-4o, Claude 3.5, Gemini 2.0 и др.) + +Подходит для: + +- Тестирования разных моделей без регистрации в каждом сервисе +- Доступа к моделям в регионах с ограничениями +- Сравнения производительности +- Оптимизации затрат + +## 🤖 Возможности Ask и DeepResearch + +### Ask + +- **Ответы по коду**: AI использует содержимое репозитория +- **RAG**: подбираются релевантные фрагменты +- **Потоковая генерация**: ответы формируются в реальном времени +- **История общения**: поддерживается контекст + +### DeepResearch + +Функция глубокого анализа: + +- **Многошаговый подход**: AI сам исследует тему +- **Этапы исследования**: + 1. План + 2. Промежуточные результаты + 3. Итоговый вывод + +Активируется переключателем "Deep Research". + +## 📱 Скриншоты + +![Интерфейс](screenshots/Interface.png) +*Основной интерфейс DeepWiki* + +![Приватный доступ](screenshots/privaterepo.png) +*Доступ к приватным репозиториям* + +![DeepResearch](screenshots/DeepResearch.png) +*DeepResearch анализирует сложные темы* + +### Видео-демо + +[![Видео](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +## ❓ Решение проблем + +### Проблемы с API-ключами + +- **“Отсутствуют переменные окружения”** — проверьте `.env` +- **“Неверный ключ”** — уберите пробелы +- **“Ошибка OpenRouter API”** — проверьте ключ и баланс +- **“Ошибка Azure API”** — проверьте ключ, endpoint и версию + +### Проблемы с подключением + +- **“Нет подключения к API”** — убедитесь, что сервер запущен на 8001 +- **“CORS ошибка”** — пробуйте запускать frontend и backend на одной машине + +### Ошибки генерации + +- **“Ошибка генерации вики”** — попробуйте меньший репозиторий +- **“Неверный формат ссылки”** — используйте корректные ссылки +- **“Нет структуры репозитория”** — проверьте токен доступа +- **“Ошибка диаграмм”** — система попытается автоматически исправить + +### Универсальные советы + +1. Перезапустите frontend и backend +2. Проверьте консоль браузера +3. Проверьте логи API + +## 🤝 Участие + +Вы можете: + +- Заводить issues +- Отправлять pull requests +- Делиться идеями + +## 📄 Лицензия + +Проект распространяется под лицензией MIT. См. файл [LICENSE](LICENSE) + +## ⭐ История звёзд + +[![График звёзд](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) diff --git a/reference-deepwiki/README.vi.md b/reference-deepwiki/README.vi.md new file mode 100644 index 0000000..f526213 --- /dev/null +++ b/reference-deepwiki/README.vi.md @@ -0,0 +1,423 @@ +# DeepWiki-Open + +![DeepWiki Banner](screenshots/Deepwiki.png) + +**Open DeepWiki** là 1 triển khai thay thế cho DeepWiki, tự động tạo ra các trang wiki cho bất kỳ Repository nào trên GitHub, GitLab hoặc BitBucket! Chỉ cần nhập đường dẫn Repository, và DeepWiki sẽ: + +1. Phân tích cấu trúc mã nguồn +2. Tạo tài liệu đầy đủ và chi tiết +3. Tạo sơ đồ trực quan để giải thích cách mọi thứ hoạt động +4. Sắp xếp tất cả documents thành một wiki dễ hiểu + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Tính năng + +- **Tạo Tài liệu tức thì**: Biến bất kỳ Repository GitHub, GitLab hoặc BitBucket nào thành wiki chỉ trong vài giây +- **Hỗ trợ Private Repository**: Truy cập Private Repository một cách an toàn với personal access tokens +- **Phân tích thông minh**: Hiểu cấu trúc và mối quan hệ của source codes nhờ AI +- **Tự động tạo Sơ đồ**: Tự động tạo sơ đồ Mermaid để trực quan hóa kiến trúc và luồng dữ liệu +- **Dễ dàng thao tác**:Giao diện wiki đơn giản, trực quan để khám phá +- **Trò chuyện với repository**: Trò chuyện với repo của bạn bằng AI (tích hợp RAG) để nhận câu trả lời chính xác +- **DeepResearch**:Quy trình Deep Research nhiều bước giúp phân tích kỹ lưỡng các chủ đề phức tạp +- **Hỗ trợ nhiều mô hình**: Hỗ trợ Google Gemini, OpenAI, OpenRouter, và local Ollama models + +## 🚀 Bắt đầu (Siêu dễ :)) + +### Option 1: Sử dụng Docker + +```bash +# Clone repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Tạo .env file với API keys +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# Optional: Thêm OpenRouter API key nếu bạn muốn OpenRouter models +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Run với Docker Compose +docker-compose up +``` + +> 💡 **Hướng dẫn lấy Keys** +> - Lấy Google API key từ [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Lấy OpenAI API key từ [OpenAI Platform](https://platform.openai.com/api-keys) + +### Option 2: Setup thủ công (Khuyên dùng) + +#### Bước 1: Set Up API Keys + +Tạo `.env` file trong thư mục gốc của project với những keys vừa tạo: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# Optional: Thêm OpenRouter API key nếu bạn muốn OpenRouter models +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### Bước 2: Bắt đầu với Backend + +```bash +# Cài đặt Python dependencies +pip install -r api/requirements.txt + +# Chạy API server +python -m api.main +``` + +#### Bước 3: Bắt đầu với Frontend + +```bash +# Cài đặt JavaScript dependencies +npm install +# Hoặc +yarn install + +# Chạy the web app +npm run dev +# Hoặc +yarn dev +``` + +#### Bước 4: Dùng DeepWiki! + +1. Mở [http://localhost:3000](http://localhost:3000) trên trình duyệt +2. Nhập đường dẫn GitHub, GitLab, hoặt Bitbucket repository (ví dụ như `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, hay `https://bitbucket.org/redradish/atlassian_app_versions`) +3. Cho private repositories, Nhấn "+ Add access tokens" và nhập your GitHub hoặt GitLab personal access token +4. Click "Generate Wiki" và xem kết quả! + +## 🔍 Cách Open Deepwiki hoạt động + +DeepWiki dùng AI để: + +1. Clone và phân tích GitHub, GitLab, hoặc Bitbucket repository (bao gồm private repos với token authentication) +2. Tạo embeddings cho code (Rag support) +3. Tạo documentation với context-aware AI (dùng Google Gemini, OpenAI, OpenRouter, hay local Ollama models) +4. Tạo diagrams để giải thích code relationships +5. Organize thông tin thành 1 trang wiki +6. Cho phép Q&A với repository +7. Cung cấp khả năng DeepResearch + +```mermaid +graph TD + A[User inputs GitHub/GitLab/Bitbucket repo] --> AA{Private repo?} + AA -->|Yes| AB[Add access token] + AA -->|No| B[Clone Repository] + AB --> B + B --> C[Analyze Code Structure] + C --> D[Create Code Embeddings] + + D --> M{Select Model Provider} + M -->|Google Gemini| E1[Generate with Gemini] + M -->|OpenAI| E2[Generate with OpenAI] + M -->|OpenRouter| E3[Generate with OpenRouter] + M -->|Local Ollama| E4[Generate with Ollama] + + E1 --> E[Generate Documentation] + E2 --> E + E3 --> E + E4 --> E + + D --> F[Create Visual Diagrams] + E --> G[Organize as Wiki] + F --> G + G --> H[Interactive DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ Cấu trúc dự án + +``` +deepwiki/ +├── api/ # Backend API server +│ ├── main.py # API +│ ├── api.py # FastAPI +│ ├── rag.py # Retrieval Augmented Generation (RAG) +│ ├── data_pipeline.py # Data processing utilities +│ └── requirements.txt # Python dependencies +│ +├── src/ # Frontend Next.js app +│ ├── app/ # Next.js app directory +│ │ └── page.tsx # Main application page +│ └── components/ # React components +│ └── Mermaid.tsx # Mermaid diagram renderer +│ +├── public/ # Static assets +├── package.json # JavaScript dependencies +└── .env # Environment variables (create this) +``` + +## 🛠️ Cài đặt nâng cao + +### Biến môi trường + +| Biến môi trường | Mô tả | bắt buộc | ghi chú | +|----------|-------------|----------|------| +| `GOOGLE_API_KEY` | Google Gemini API key | Có | +| `OPENAI_API_KEY` | OpenAI API key | có | +| `OPENROUTER_API_KEY` | OpenRouter API key | không| Yêu cầu nếu bạn muốn dùng OpenRouter models | +| `PORT` | Port của API server (mặc định: 8001) | không | Nếu bạn muốn chạy API và frontend trên cùng 1 máy, hãy điều chỉnh Port `SERVER_BASE_URL` | +| `SERVER_BASE_URL` | Đường dẫnn mặt định của API server (mặc định: http://localhost:8001) | không | + +### Cài Đặt với Docker + +Bạn có thể dùng Docker để run DeepWiki: + +```bash +# Pull Docker image từ GitHub Container Registry +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# Chạy container với biến môi trường +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Hoặc đơn giản hơn, sử dụng `docker-compose.yml` : + +```bash +# Edit the .env file with your API keys first +docker-compose up +``` + +#### Sử dụng .env file với Docker + +Bạn có thể "mount" .env file vào container: + +```bash +# Tạo .env file với your API keys +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Run container với .env file +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +#### Bạn có thể Building the Docker image trên máy cục bộ + + +```bash +# Clone repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Build Docker image +docker build -t deepwiki-open . + +# Chạy container +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + deepwiki-open +``` + +### Chi tiết API Server + +API server cung cấp: +- Repository cloning và indexing +- RAG (Retrieval Augmented Generation) +- Trò chuyện liên tục + +Biết thêm chi tiết truy cập [ API README](./api/README.md). + +## 🤖 Hệ thống lựa chọn mô hình dựa trên nhà cung cấp + +DeepWiki hiện đã triển khai một hệ thống lựa chọn mô hình linh hoạt dựa trên nhiều nhà cung cấp LLM: + +### Các nhà cung cấp và mô hình được hỗ trợ + +- **Google**: Mặc định là `gemini-2.5-flash`, cũng hỗ trợ `gemini-2.5-flash-lite`, `gemini-2.5-pro`, v.v. +- **OpenAI**: Mặc định là `gpt-5-nano`, cũng hỗ trợ `gpt-5`, `4o`, v.v. +- **OpenRouter**: Truy cập nhiều mô hình qua một API thống nhất, bao gồm Claude, Llama, Mistral, v.v. +- **Ollama**: Hỗ trợ các mô hình mã nguồn mở chạy cục bộ như `llama3` + +### Biến môi trường + +Mỗi nhà cung cấp yêu cầu các biến môi trường API key tương ứng: + +``` +# API Keys +GOOGLE_API_KEY=google_api_key_của_bạn # Bắt buộc cho các mô hình Google Gemini +OPENAI_API_KEY=openai_key_của_bạn # Bắt buộc cho các mô hình OpenAI +OPENROUTER_API_KEY=openrouter_key_của_bạn # Bắt buộc cho các mô hình OpenRouter + +# Cấu hình URL cơ sở cho OpenAI API +OPENAI_BASE_URL=https://endpoint-tùy-chỉnh.com/v1 # Tùy chọn, cho các điểm cuối API OpenAI tùy chỉnh + +# Thư mục cấu hình +DEEPWIKI_CONFIG_DIR=/đường/dẫn/đến/thư_mục/cấu_hình # Tùy chọn, cho vị trí tệp cấu hình tùy chỉnh +``` + +### Tệp cấu hình + +DeepWiki sử dụng các tệp cấu hình JSON để quản lý các khía cạnh khác nhau của hệ thống: + +1. **`generator.json`**: Cấu hình cho các mô hình tạo văn bản + - Xác định các nhà cung cấp mô hình có sẵn (Google, OpenAI, OpenRouter, Ollama) + - Chỉ định các mô hình mặc định và có sẵn cho mỗi nhà cung cấp + - Chứa các tham số đặc thù cho mô hình như temperature và top_p + +2. **`embedder.json`**: Cấu hình cho mô hình embedding và xử lý văn bản + - Xác định mô hình embedding cho lưu trữ vector + - Chứa cấu hình bộ truy xuất cho RAG + - Chỉ định cài đặt trình chia văn bản để phân đoạn tài liệu + +3. **`repo.json`**: Cấu hình xử lý repository + - Chứa bộ lọc tệp để loại trừ một số tệp và thư mục nhất định + - Xác định giới hạn kích thước repository và quy tắc xử lý + +Mặc định, các tệp này nằm trong thư mục `api/config/`. Bạn có thể tùy chỉnh vị trí của chúng bằng biến môi trường `DEEPWIKI_CONFIG_DIR`. + +### Lựa chọn mô hình tùy chỉnh cho nhà cung cấp dịch vụ + +Tính năng lựa chọn mô hình tùy chỉnh được thiết kế đặc biệt cho các nhà cung cấp dịch vụ cần: + +- Bạn có thể cung cấp cho người dùng trong tổ chức của mình nhiều lựa chọn mô hình AI khác nhau +- Bạn có thể thích ứng nhanh chóng với môi trường LLM đang phát triển nhanh chóng mà không cần thay đổi mã +- Bạn có thể hỗ trợ các mô hình chuyên biệt hoặc được tinh chỉnh không có trong danh sách định nghĩa trước + +Bạn có thể triển khai các mô hình cung cấp bằng cách chọn từ các tùy chọn định nghĩa trước hoặc nhập định danh mô hình tùy chỉnh trong giao diện người dùng. + +### Cấu hình URL cơ sở cho các kênh riêng doanh nghiệp + +Cấu hình base_url của OpenAI Client được thiết kế chủ yếu cho người dùng doanh nghiệp có các kênh API riêng. Tính năng này: + +- Cho phép kết nối với các điểm cuối API riêng hoặc dành riêng cho doanh nghiệp +- Cho phép các tổ chức sử dụng dịch vụ LLM tự lưu trữ hoặc triển khai tùy chỉnh +- Hỗ trợ tích hợp với các dịch vụ tương thích API OpenAI của bên thứ ba + +**Sắp ra mắt**: Trong các bản cập nhật tương lai, DeepWiki sẽ hỗ trợ chế độ mà người dùng cần cung cấp API key của riêng họ trong các yêu cầu. Điều này sẽ cho phép khách hàng doanh nghiệp có kênh riêng sử dụng cấu hình API hiện có mà không cần chia sẻ thông tin đăng nhập với triển khai DeepWiki. + +## 🔌 Tích hợp OpenRouter + +DeepWiki hiện đã hỗ trợ [OpenRouter](https://openrouter.ai/) làm nhà cung cấp mô hình, cho phép bạn truy cập hàng trăm mô hình AI thông qua một API duy nhất: + +- **Nhiều tùy chọn mô hình**: Truy cập các mô hình từ OpenAI, Anthropic, Google, Meta, Mistral và nhiều nhà cung cấp khác +- **Cấu hình đơn giản**: Chỉ cần thêm khóa API của bạn từ OpenRouter và chọn mô hình bạn muốn sử dụng +- **Tiết kiệm chi phí**: Lựa chọn mô hình phù hợp với ngân sách và nhu cầu hiệu suất của bạn +- **Chuyển đổi dễ dàng**: Chuyển đổi giữa các mô hình khác nhau mà không cần thay đổi mã nguồn + + +### Cách sử dụng OpenRouter với DeepWiki + +1. **Lấy API Key**: Đăng ký tại [OpenRouter](https://openrouter.ai/) và lấy khóa API +2. **Thêm vào biến môi trường**: Thêm `OPENROUTER_API_KEY=your_key` vào file `.env` +3. **Bật trong giao diện**: Chọn "Use OpenRouter API" trên trang chủ +4. **Chọn mô hình**: Lựa chọn từ các mô hình phổ biến như GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 và nhiều hơn nữa + + +OpenRouter đặc biệt hữu ích nếu bạn muốn: + +- Thử nhiều mô hình khác nhau mà không cần đăng ký nhiều dịch vụ +- Truy cập các mô hình có thể bị giới hạn tại khu vực của bạn +- So sánh hiệu năng giữa các nhà cung cấp mô hình khác nhau +- Tối ưu hóa chi phí so với hiệu suất dựa trên nhu cầu của bạn + + +## 🤖 Tính năng Hỏi & Nghiên cứu Sâu (DeepResearch) + +### Tính năng Hỏi (Ask) + +Tính năng Hỏi cho phép bạn trò chuyện với kho mã của mình bằng cách sử dụng kỹ thuật RAG (Retrieval Augmented Generation): + +- **Phản hồi theo ngữ cảnh**: Nhận câu trả lời chính xác dựa trên mã thực tế trong kho của bạn +- **Ứng dụng RAG**: Hệ thống truy xuất các đoạn mã liên quan để tạo ra câu trả lời có cơ sở +- **Phản hồi theo thởi gian thực**: Xem câu trả lời được tạo ra trực tiếp, mang lại trải nghiệm tương tác hơn +- **Lưu lịch sử cuộc trò chuyện**: Hệ thống duy trì ngữ cảnh giữa các câu hỏi để cuộc đối thoại liền mạch hơn + + +### Tính năng DeepResearch + +DeepResearch nâng tầm phân tích kho mã với quy trình nghiện cứu nhiểu vòng: + +- **Ngieen cứu chuyên sâu**: Khám phá kỹ lưỡng các chủ đề phức tạp thông qua nhiểu vòng nghiện cứu +- **Quy trình có cấu trúc**: Tuân theo kế hoạch nghiện cứu rõ ràng với các bản cập nhật và kết luận tổng thể +- **Tự động tiếp tục**: AI sẽ tự động tiếp tục quá trình nghiện cứu cho đến khi đưa ra kết luận (tối đa 5 vòng) +- **Các giai đoạn nghiện cứu**: + 1. **Kế hoạch nghiện cứu**: Phác thảo phương pháp và những phát hiện ban đầu + 2. **Cập nhật nghiện cứu**: Bổ sung kiến thức mới qua từng vòng lặp + 3. **Kết luận cuối cùng**: Đưa ra câu trả lời toàn diện dựa trên tất cả các vòng nghiện cứu + +Để sử dụng DeepResearch, chỉ cần bật công tắc "Deep Research" trong giao diện Hỏi (Ask) trước khi gửi câu hỏi của bạn. + + +## 📱 Ảnh chụp màng hình + +![Giao diện chính của DeepWiki](screenshots/Interface.png) +*Giao diện chính của DeepWiki* + +![Hỗ trợ kho riêng tư](screenshots/privaterepo.png) +*Truy cập kho riêng tư bằng Personal Access Token* + +![Tính năng DeepResearch](screenshots/DeepResearch.png) +*DeepResearch thực hiện nghiện cứu nhiểu vòng cho các chủ đề phức tạp* + +### Demo Video + +[![DeepWiki Demo Video](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + + + +## ❓ Khắc phục sự cố + +### Vấn đề với API Key +- **"Thiếu biến môi trường"**: Đảm bảo rằng file `.env` của bạn nằm ở thư mục gốc của dự án và chứa các API key cần thiết +- **"API key không hợp lệ"**: Kiểm tra lại xem bạn đã sao chép đầy đủ API key mà không có khoảng trắng thừa chưa +- **"Lỗi API OpenRouter"**: Xác minh rằng API key của OpenRouter là hợp lệ và có đủ tín dụng + +### Vấn đề kết nối +- **"Không thể kết nối với máy chủ API"**: Đảm bảo máy chủ API đang chạy trên cổng 8001 +- **"Lỗi CORS"**: API được cấu hình để cho phép tất cả các nguồn gốc, nhưng nếu gặp sự cố, thử chạy cả frontend và backend trên cùng một máy tính + +### Vấn đề khi tạo nội dung +- **"Lỗi khi tạo wiki"**: Với các kho mã rất lớn, hãy thử trước với kho mã nhỏ hơn +- **"Định dạng kho mã không hợp lệ"**: Đảm bảo bạn đang sử dụng định dạng URL hợp lệ cho GitHub, GitLab hoặc Bitbucket +- **"Không thể lấy cấu trúc kho mã"**: Với các kho mã riêng tư, hãy đảm bảo bạn đã nhập token truy cập cá nhân hợp lệ và có quyền truy cập phù hợp +- **"Lỗi khi render sơ đồ"**: Ứng dụng sẽ tự động thử khắc phục các sơ đồ bị lỗi + +### Các giải pháp phổ biến +1. **Khởi động lại cả hai máy chủ**: Đôi khi, một lần khởi động lại đơn giản có thể giải quyết hầu hết các vấn đề +2. **Kiểm tra nhật ký trình duyệt**: Mở công cụ phát triển của trình duyệt để xem các lỗi JavaScript +3. **Kiểm tra nhật ký API**: Xem các lỗi Python trong terminal nơi API đang chạy + + +## 🤝 Đóng góp + +Chúng tôi hoan nghênh mọi đóng góp! Bạn có thể: +- Mở các vấn đề (issues) để báo lỗi hoặc yêu cầu tính năng +- Gửi pull request để cải thiện mã nguồn +- Chia sẻ phản hồi và ý tưởng của bạn + +## 📄 Giấy phép + +Dự án này được cấp phép theo Giấy phép MIT - xem file [LICENSE](LICENSE) để biết chi tiết. + +## ⭐ Lịch sử + +[![Biểu đồ lịch sử](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + diff --git a/reference-deepwiki/README.zh-tw.md b/reference-deepwiki/README.zh-tw.md new file mode 100644 index 0000000..08e4150 --- /dev/null +++ b/reference-deepwiki/README.zh-tw.md @@ -0,0 +1,607 @@ +# DeepWiki-Open + +![DeepWiki 橫幅](screenshots/Deepwiki.png) + +**DeepWiki** 可以為任何 GitHub、GitLab 或 BitBucket 程式碼儲存庫自動建立美觀、互動式的 Wiki!只需輸入儲存庫名稱,DeepWiki 將: + +1. 分析程式碼結構 +2. 產生全面的文件 +3. 建立視覺化圖表解釋一切如何運作 +4. 將所有內容整理成易於導覽的 Wiki + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Tip in Crypto](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ 特點 + +- **即時文件**:幾秒鐘內將任何 GitHub、GitLab 或 BitBucket 儲存庫轉換為 Wiki +- **私人儲存庫支援**:使用個人存取權杖安全存取私人儲存庫 +- **智慧分析**:AI 驅動的程式碼結構和關係理解 +- **精美圖表**:自動產生 Mermaid 圖表視覺化架構和資料流 +- **簡易導覽**:簡單、直觀的介面探索 Wiki +- **提問功能**:使用 RAG 驅動的 AI 與您的儲存庫聊天,取得準確答案 +- **深度研究**:多輪研究過程,徹底調查複雜主題 +- **多模型提供商**:支援 Google Gemini、OpenAI、OpenRouter 和本機 Ollama 模型 + +## 🚀 快速開始(超級簡單!) + +### 選項 1:使用 Docker + +```bash +# 複製儲存庫 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# 建立包含 API 金鑰的 .env 檔案 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# 可選:如果您想使用 OpenRouter 模型,新增 OpenRouter API 金鑰 +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env +# 可選:如果 Ollama 不在本機執行,新增 Ollama 主機位址,預設為 http://localhost:11434 +echo "OLLAMA_HOST=your_ollama_host" >> .env + +# 使用 Docker Compose 執行 +docker-compose up +``` + +有關使用 DeepWiki 搭配 Ollama 和 Docker 的詳細說明,請參閱 [Ollama 操作說明](Ollama-instruction.md)。 + +(上述 Docker 命令以及 `docker-compose.yml` 設定會掛載您主機上的 `~/.adalflow` 目錄到容器內的 `/root/.adalflow`。此路徑用於儲存: +- 複製的儲存庫 (`~/.adalflow/repos/`) +- 儲存庫的嵌入和索引 (`~/.adalflow/databases/`) +- 快取的已產生 Wiki 內容 (`~/.adalflow/wikicache/`) + +這確保了即使容器停止或移除,您的資料也能持久保存。) + +> 💡 **取得這些金鑰的地方:** +> - 從 [Google AI Studio](https://makersuite.google.com/app/apikey) 取得 Google API 金鑰 +> - 從 [OpenAI Platform](https://platform.openai.com/api-keys) 取得 OpenAI API 金鑰 + +### 選項 2:手動設定(推薦) + +#### 步驟 1:設定 API 金鑰 + +在專案根目錄建立一個 `.env` 檔案,包含以下金鑰: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# 可選:如果您想使用 OpenRouter 模型,新增此項 +OPENROUTER_API_KEY=your_openrouter_api_key +# 可選:如果 Ollama 不在本機執行,新增 Ollama 主機位址,預設為 http://localhost:11434 +OLLAMA_HOST=your_ollama_host +``` + +#### 步驟 2:啟動後端 + +```bash +# 安裝 Python 相依性 +pip install -r api/requirements.txt + +# 啟動 API 伺服器 +python -m api.main +``` + +#### 步驟 3:啟動前端 + +```bash +# 安裝 JavaScript 相依性 +npm install +# 或 +yarn install + +# 啟動 Web 應用 +npm run dev +# 或 +yarn dev +``` + +#### 步驟 4:使用 DeepWiki! + +1. 在瀏覽器中開啟 [http://localhost:3000](http://localhost:3000) +2. 輸入 GitHub、GitLab 或 Bitbucket 儲存庫(如 `https://github.com/openai/codex`、`https://github.com/microsoft/autogen`、`https://gitlab.com/gitlab-org/gitlab` 或 `https://bitbucket.org/redradish/atlassian_app_versions`) +3. 對於私人儲存庫,點擊「+ 新增存取權杖」並輸入您的 GitHub 或 GitLab 個人存取權杖 +4. 點擊「產生 Wiki」,見證奇蹟的發生! + +## 🔍 工作原理 + +DeepWiki 使用 AI 來: + +1. 複製並分析 GitHub、GitLab 或 Bitbucket 儲存庫(包括使用權杖驗證的私人儲存庫) +2. 建立程式碼嵌入用於智慧檢索 +3. 使用上下文感知 AI 產生文件(使用 Google Gemini、OpenAI、OpenRouter 或本機 Ollama 模型) +4. 建立視覺化圖表解釋程式碼關係 +5. 將所有內容組織成結構化 Wiki +6. 透過提問功能實現與儲存庫的智慧問答 +7. 透過深度研究功能提供深入研究能力 + +```mermaid +graph TD + A[使用者輸入 GitHub/GitLab/Bitbucket 儲存庫] --> AA{私人儲存庫?} + AA -->|是| AB[新增存取權杖] + AA -->|否| B[複製儲存庫] + AB --> B + B --> C[分析程式碼結構] + C --> D[建立程式碼嵌入] + + D --> M{選擇模型提供商} + M -->|Google Gemini| E1[使用 Gemini 產生] + M -->|OpenAI| E2[使用 OpenAI 產生] + M -->|OpenRouter| E3[使用 OpenRouter 產生] + M -->|本機 Ollama| E4[使用 Ollama 產生] + + E1 --> E[產生文件] + E2 --> E + E3 --> E + E4 --> E + + D --> F[建立視覺化圖表] + E --> G[組織為 Wiki] + F --> G + G --> H[互動式 DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ 專案結構 + +``` +deepwiki/ +├── api/ # 後端 API 伺服器 +│ ├── main.py # API 進入點 +│ ├── api.py # FastAPI 實作 +│ ├── rag.py # 檢索增強產生 +│ ├── data_pipeline.py # 資料處理工具 +│ └── requirements.txt # Python 相依性 +│ +├── src/ # 前端 Next.js 應用 +│ ├── app/ # Next.js 應用目錄 +│ │ └── page.tsx # 主應用頁面 +│ └── components/ # React 元件 +│ └── Mermaid.tsx # Mermaid 圖表渲染器 +│ +├── public/ # 靜態資源 +├── package.json # JavaScript 相依性 +└── .env # 環境變數(需要建立) +``` + +## 🤖 基於提供商的模型選擇系統 + +DeepWiki 現在實作了靈活的基於提供商的模型選擇系統,支援多種 LLM 提供商: + +### 支援的提供商和模型 + +- **Google**:預設 `gemini-2.5-flash`,也支援 `gemini-2.5-flash-lite`、`gemini-2.5-pro` 等 +- **OpenAI**:預設 `gpt-5-nano`,也支援 `gpt-5`, `4o` 等 +- **OpenRouter**:透過統一 API 存取多種模型,包括 Claude、Llama、Mistral 等 +- **Ollama**:支援本機執行的開源模型,如 `llama3` + +### 環境變數 + +每個提供商都需要對應的 API 金鑰環境變數: + +``` +# API 金鑰 +GOOGLE_API_KEY=your_google_api_key # 使用 Google Gemini 模型時必需 +OPENAI_API_KEY=your_openai_api_key # 使用 OpenAI 模型時必需 +OPENROUTER_API_KEY=your_openrouter_api_key # 使用 OpenRouter 模型時必需 + +# OpenAI API 基礎 URL 設定 +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # 可選,用於自訂 OpenAI API 端點 + +# Ollama 主機 +OLLAMA_HOST=your_ollama_host # 可選,如果 Ollama 不在本機執行,預設為 http://localhost:11434 + +# 設定檔目錄 +DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # 可選,用於自訂設定檔位置 +``` + +### 設定檔 + +DeepWiki 使用 JSON 設定檔來管理系統的各個層面: + +1. **`generator.json`**:文字產生模型設定 + - 定義可用的模型提供商(Google、OpenAI、OpenRouter、Ollama) + - 指定每個提供商的預設和可用模型 + - 包含模型特定參數,如 temperature 和 top_p + +2. **`embedder.json`**:嵌入模型和文字處理設定 + - 定義用於向量儲存的嵌入模型 + - 包含用於 RAG 的檢索器設定 + - 指定文件分塊的文字分割器設定 + +3. **`repo.json`**:儲存庫處理設定 + - 包含排除特定檔案和目錄的檔案篩選器 + - 定義儲存庫大小限制和處理規則 + +預設情況下,這些檔案位於 `api/config/` 目錄中。您可以使用 `DEEPWIKI_CONFIG_DIR` 環境變數自訂它們的位置。 + +### 為服務提供商設計的自訂模型選擇 + +自訂模型選擇功能專為需要以下功能的服務提供商設計: + +- 您可以在組織內為使用者提供多種 AI 模型選擇 +- 您可以快速適應快速發展的 LLM 領域,無需變更程式碼 +- 您可以支援不在預定義清單中的專業或微調模型 + +服務提供商可以透過從預定義選項中選擇或在前端介面中輸入自訂模型識別符來實作其模型提供方案。 + +### 為企業私有通道設計的基礎 URL 設定 + +OpenAI 客戶端的 base_url 設定主要為擁有私有 API 通道的企業使用者設計。此功能: + +- 支援連線到私有或企業特定的 API 端點 +- 允許組織使用自己的自主託管或自訂部署的 LLM 服務 +- 支援與第三方 OpenAI API 相容服務的整合 + +**即將推出**:在未來的更新中,DeepWiki 將支援一種模式,讓使用者需要在請求中提供自己的 API 金鑰。這將允許擁有私有通道的企業客戶使用其現有的 API 安排,而不必與 DeepWiki 部署共享憑證。 + +## 🧩 使用 OpenAI 相容的嵌入模型(如阿里巴巴 Qwen) + +如果您想使用與 OpenAI API 相容的嵌入模型(如阿里巴巴 Qwen),請按照以下步驟操作: + +1. 用 `api/config/embedder_openai_compatible.json` 的內容替換 `api/config/embedder.json` 的內容。 +2. 在專案根目錄的 `.env` 檔案中,設定相關的環境變數,例如: + ``` + OPENAI_API_KEY=your_api_key + OPENAI_BASE_URL=your_openai_compatible_endpoint + ``` +3. 程式會自動用環境變數的值替換 embedder.json 中的預留位置。 + +這讓您可以無縫切換到任何 OpenAI 相容的嵌入服務,無需變更程式碼。 + +### 日誌記錄 + +DeepWiki 使用 Python 的內建 `logging` 模組進行診斷輸出。您可以透過環境變數設定詳細程度和日誌檔案目標: + +| 變數 | 說明 | 預設值 | +|-----------------|----------------------------------------------------------------------|------------------------------| +| `LOG_LEVEL` | 日誌記錄等級(DEBUG、INFO、WARNING、ERROR、CRITICAL) | INFO | +| `LOG_FILE_PATH` | 日誌檔案的路徑。如果設定,日誌將寫入此檔案 | `api/logs/application.log` | + +要啟用除錯日誌並將日誌導向自訂檔案: +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` +或使用 Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +使用 Docker Compose 執行時,容器的 `api/logs` 目錄會掛載到主機上的 `./api/logs`(請參閱 `docker-compose.yml` 中的 `volumes` 區段),確保日誌檔案在重新啟動後仍然存在。 + +您也可以將這些設定儲存在 `.env` 檔案中: + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` +然後簡單執行: + +```bash +docker-compose up +``` + +**日誌路徑安全性考量:** 在生產環境中,請確保 `api/logs` 目錄和任何自訂日誌檔案路徑都受到適當的檔案系統權限和存取控制保護。應用程式會強制要求 `LOG_FILE_PATH` 位於專案的 `api/logs` 目錄內,以防止路徑遍歷或未授權的寫入。 + +## 🛠️ 進階設定 + +### 環境變數 + +| 變數 | 說明 | 必需 | 備註 | +|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Google Gemini API 金鑰,用於 AI 產生 | 否 | 只有在您想使用 Google Gemini 模型時才需要 +| `OPENAI_API_KEY` | OpenAI API 金鑰,用於嵌入 | 是 | 備註:即使您不使用 OpenAI 模型,這個也是必需的,因為它用於嵌入 | +| `OPENROUTER_API_KEY` | OpenRouter API 金鑰,用於替代模型 | 否 | 只有在您想使用 OpenRouter 模型時才需要 | +| `OLLAMA_HOST` | Ollama 主機(預設:http://localhost:11434) | 否 | 只有在您想使用外部 Ollama 伺服器時才需要 | +| `PORT` | API 伺服器的連接埠(預設:8001) | 否 | 如果您在同一台機器上託管 API 和前端,請確保相應地變更 `SERVER_BASE_URL` 的連接埠 | +| `SERVER_BASE_URL` | API 伺服器的基礎 URL(預設:http://localhost:8001) | 否 | +| `DEEPWIKI_AUTH_MODE` | 設定為 `true` 或 `1` 以啟用授權模式 | 否 | 預設為 `false`。如果啟用,則需要 `DEEPWIKI_AUTH_CODE` | +| `DEEPWIKI_AUTH_CODE` | 當 `DEEPWIKI_AUTH_MODE` 啟用時,Wiki 產生所需的秘密代碼 | 否 | 只有在 `DEEPWIKI_AUTH_MODE` 為 `true` 或 `1` 時才使用 | + +如果您不使用 ollama 模式,您需要設定 OpenAI API 金鑰用於嵌入。其他 API 金鑰只有在設定並使用對應提供商的模型時才需要。 + +## 授權模式 + +DeepWiki 可以設定為在授權模式下執行,在此模式下,Wiki 產生需要有效的授權代碼。如果您想控制誰可以使用產生功能,這會很有用。 +限制前端啟動並保護快取刪除,但如果直接存取 API 端點,無法完全防止後端產生。 + +要啟用授權模式,請設定以下環境變數: + +- `DEEPWIKI_AUTH_MODE`:將此設定為 `true` 或 `1`。啟用時,前端將顯示授權代碼的輸入欄位。 +- `DEEPWIKI_AUTH_CODE`:將此設定為所需的秘密代碼。限制前端啟動並保護快取刪除,但如果直接存取 API 端點,無法完全防止後端產生。 + +如果未設定 `DEEPWIKI_AUTH_MODE` 或設定為 `false`(或除 `true`/`1` 以外的任何其他值),授權功能將被停用,不需要任何代碼。 + +### Docker 設定 + +您可以使用 Docker 來執行 DeepWiki: + +```bash +# 從 GitHub Container Registry 拉取映像 +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# 使用環境變數執行容器 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -e OLLAMA_HOST=your_ollama_host \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +此命令也會將主機上的 `~/.adalflow` 掛載到容器中的 `/root/.adalflow`。此路徑用於儲存: +- 複製的儲存庫(`~/.adalflow/repos/`) +- 它們的嵌入和索引(`~/.adalflow/databases/`) +- 快取的已產生 Wiki 內容(`~/.adalflow/wikicache/`) + +這確保即使容器停止或移除,您的資料也會持續存在。 + +或使用提供的 `docker-compose.yml` 檔案: + +```bash +# 首先使用您的 API 金鑰編輯 .env 檔案 +docker-compose up +``` + +(`docker-compose.yml` 檔案預先設定為掛載 `~/.adalflow` 以保持資料持續性,類似於上面的 `docker run` 命令。) + +#### 在 Docker 中使用 .env 檔案 + +您也可以將 .env 檔案掛載到容器: + +```bash +# 使用您的 API 金鑰建立 .env 檔案 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env +echo "OLLAMA_HOST=your_ollama_host" >> .env + +# 使用掛載的 .env 檔案執行容器 +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +此命令也會將主機上的 `~/.adalflow` 掛載到容器中的 `/root/.adalflow`。此路徑用於儲存: +- 複製的儲存庫(`~/.adalflow/repos/`) +- 它們的嵌入和索引(`~/.adalflow/databases/`) +- 快取的已產生 Wiki 內容(`~/.adalflow/wikicache/`) + +這確保即使容器停止或移除,您的資料也會持續存在。 + +#### 在本機建置 Docker 映像 + +如果您想在本機建置 Docker 映像: + +```bash +# 複製儲存庫 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# 建置 Docker 映像 +docker build -t deepwiki-open . + +# 執行容器 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -e OLLAMA_HOST=your_ollama_host \ + deepwiki-open +``` + +### API 伺服器詳細資訊 + +API 伺服器提供: +- 儲存庫複製和索引 +- RAG(檢索增強產生) +- 串流聊天完成 + +更多詳細資訊,請參閱 [API README](./api/README.md)。 + +## 🔌 OpenRouter 整合 + +DeepWiki 現在支援 [OpenRouter](https://openrouter.ai/) 作為模型提供商,讓您可以透過單一 API 存取數百個 AI 模型: + +- **多種模型選項**:存取來自 OpenAI、Anthropic、Google、Meta、Mistral 等的模型 +- **簡單設定**:只需新增您的 OpenRouter API 金鑰並選擇您想使用的模型 +- **成本效益**:選擇符合您預算和效能需求的模型 +- **輕鬆切換**:在不同模型之間切換,無需變更程式碼 + +### 如何在 DeepWiki 中使用 OpenRouter + +1. **取得 API 金鑰**:在 [OpenRouter](https://openrouter.ai/) 註冊並取得您的 API 金鑰 +2. **新增到環境**:在您的 `.env` 檔案中新增 `OPENROUTER_API_KEY=your_key` +3. **在 UI 中啟用**:在首頁勾選「使用 OpenRouter API」選項 +4. **選擇模型**:從熱門模型中選擇,如 GPT-4o、Claude 3.5 Sonnet、Gemini 2.0 等 + +OpenRouter 特別適用於以下情況: +- 想嘗試不同模型而不用註冊多個服務 +- 存取在您所在地區可能受限的模型 +- 比較不同模型提供商的效能 +- 根據您的需求最佳化成本與效能的平衡 + +## 🤖 提問和深度研究功能 + +### 提問功能 + +提問功能允許您使用檢索增強產生(RAG)與您的儲存庫聊天: + +- **上下文感知回應**:基於儲存庫中實際程式碼取得準確答案 +- **RAG 驅動**:系統檢索相關程式碼片段,提供有根據的回應 +- **即時串流傳輸**:即時檢視產生的回應,取得更互動式的體驗 +- **對話歷史**:系統在問題之間保持上下文,實現更連貫的互動 + +### 深度研究功能 + +深度研究透過多輪研究過程將儲存庫分析提升到新水平: + +- **深入調查**:透過多次研究迭代徹底探索複雜主題 +- **結構化過程**:遵循清晰的研究計畫,包含更新和全面結論 +- **自動繼續**:AI 自動繼續研究直到達成結論(最多 5 次迭代) +- **研究階段**: + 1. **研究計畫**:概述方法和初步發現 + 2. **研究更新**:在前一輪迭代基礎上增加新見解 + 3. **最終結論**:基於所有迭代提供全面答案 + +要使用深度研究,只需在提交問題前在提問介面中切換「深度研究」開關。 + +## 📱 螢幕截圖 + +### 主頁面 +![主頁面](screenshots/home.png) + +### Wiki 頁面 +![Wiki 頁面](screenshots/wiki-page.png) + +### 提問功能 +![提問功能](screenshots/ask.png) + +### 深度研究 +![深度研究](screenshots/deep-research.png) + +### 展示影片 + +[![DeepWiki 展示影片](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*觀看 DeepWiki 實際操作!* + +## 🔧 配置選項 + +### 模型提供商 + +DeepWiki 支援多個 AI 模型提供商: + +1. **Google Gemini**(預設) + - 快速且經濟實惠 + - 良好的程式碼理解能力 + +2. **OpenAI** + - 高品質輸出 + - 支援 GPT-4 和 GPT-3.5 + +3. **OpenRouter** + - 存取多個模型 + - 靈活的定價選項 + +4. **本機 Ollama** + - 隱私保護 + - 離線執行 + - 需要本機設定 + +### Wiki 類型 + +- **全面型**:包含詳細分析、程式碼範例和完整文件 +- **簡潔型**:專注於核心功能和關鍵見解 + +## 🌍 支援的平台 + +- **GitHub**:公開和私人儲存庫 +- **GitLab**:GitLab.com 和自主託管實例 +- **Bitbucket**:Atlassian 託管的儲存庫 + +## 📚 API 端點 + +### `/api/wiki_cache` +- **方法**:GET +- **描述**:檢索快取的 Wiki 資料 +- **參數**: + - `repo`: 儲存庫識別符 + - `platform`: git 平台(github、gitlab、bitbucket) + +### `/export/wiki` +- **方法**:GET +- **描述**:匯出 Wiki 為 Markdown 或 JSON +- **參數**: + - `repo`: 儲存庫識別符 + - `format`: 匯出格式(markdown、json) + +## ❓ 故障排除 + +### API 金鑰問題 +- **「缺少環境變數」**:確保您的 `.env` 檔案位於專案根目錄並包含所需的 API 金鑰 +- **「API 金鑰無效」**:檢查您是否正確複製了完整金鑰,沒有多餘空格 +- **「OpenRouter API 錯誤」**:驗證您的 OpenRouter API 金鑰有效且有足夠的額度 + +### 連線問題 +- **「無法連線到 API 伺服器」**:確保 API 伺服器在連接埠 8001 上執行 +- **「CORS 錯誤」**:API 設定為允許所有來源,但如果您遇到問題,請嘗試在同一台機器上執行前端和後端 + +### 產生問題 +- **「產生 Wiki 時出錯」**:對於非常大的儲存庫,請先嘗試較小的儲存庫 +- **「無效的儲存庫格式」**:確保您使用有效的 GitHub、GitLab 或 Bitbucket URL 格式 +- **「無法擷取儲存庫結構」**:對於私人儲存庫,確保您輸入了具有適當權限的有效個人存取權杖 +- **「圖表轉譯錯誤」**:應用程式將自動嘗試修復損壞的圖表 + +### 常見解決方案 +1. **重新啟動兩個伺服器**:有時簡單的重新啟動可以解決大多數問題 +2. **檢查主控台日誌**:開啟瀏覽器開發者工具查看任何 JavaScript 錯誤 +3. **檢查 API 日誌**:查看執行 API 的終端中的 Python 錯誤 + +## 🤝 貢獻 + +我們歡迎各種形式的貢獻!無論是錯誤報告、功能請求還是程式碼貢獻。 + +### 開發設定 + +1. Fork 此儲存庫 +2. 建立功能分支:`git checkout -b feature/amazing-feature` +3. 提交您的變更:`git commit -m 'Add amazing feature'` +4. 推送到分支:`git push origin feature/amazing-feature` +5. 開啟 Pull Request + +### 新增新語言支援 + +1. 在 `src/messages/` 中新增新的翻譯檔案 +2. 更新 `src/i18n.ts` 中的 `locales` 陣列 +3. 建立相對應的 README 檔案 +4. 測試翻譯 + +## 📄 授權 + +此專案根據 MIT 授權條款授權 - 詳情請參閱 [LICENSE](LICENSE) 檔案。 + +## 🙏 致謝 + +- 感謝所有貢獻者的努力 +- 基於 Next.js、FastAPI 和各種開源程式庫建構 +- 特別感謝 AI 模型提供商讓此專案成為可能 + +## 🐛 問題回報 + +如果您遇到任何問題,請在 GitHub Issues 中建立問題報告。請包含: + +- 錯誤描述 +- 重現步驟 +- 預期行為 +- 螢幕截圖(如果適用) +- 系統資訊 + +## 🔮 未來計劃 + +- [ ] 更多 AI 模型整合 +- [ ] 進階程式碼分析功能 +- [ ] 即時協作編輯 +- [ ] 行動應用支援 +- [ ] 企業級功能 + +## ⭐ Star 歷史 + +[![Star 歷史圖表](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) diff --git a/reference-deepwiki/README.zh.md b/reference-deepwiki/README.zh.md new file mode 100644 index 0000000..e05ce05 --- /dev/null +++ b/reference-deepwiki/README.zh.md @@ -0,0 +1,385 @@ +# DeepWiki-Open + +![DeepWiki 横幅](screenshots/Deepwiki.png) + +**DeepWiki**可以为任何GitHub、GitLab或BitBucket代码仓库自动创建美观、交互式的Wiki!只需输入仓库名称,DeepWiki将: + +1. 分析代码结构 +2. 生成全面的文档 +3. 创建可视化图表解释一切如何运作 +4. 将所有内容整理成易于导航的Wiki + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ 特点 + +- **即时文档**:几秒钟内将任何GitHub、GitLab或BitBucket仓库转换为Wiki +- **私有仓库支持**:使用个人访问令牌安全访问私有仓库 +- **智能分析**:AI驱动的代码结构和关系理解 +- **精美图表**:自动生成Mermaid图表可视化架构和数据流 +- **简易导航**:简单、直观的界面探索Wiki +- **提问功能**:使用RAG驱动的AI与您的仓库聊天,获取准确答案 +- **深度研究**:多轮研究过程,彻底调查复杂主题 +- **多模型提供商**:支持Google Gemini、OpenAI、OpenRouter和本地Ollama模型 + +## 🚀 快速开始(超级简单!) + +### 选项1:使用Docker + +```bash +# 克隆仓库 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# 创建包含API密钥的.env文件 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# 可选:如果您想使用OpenRouter模型,添加OpenRouter API密钥 +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# 使用Docker Compose运行 +docker-compose up +``` + +(上述 Docker 命令以及 `docker-compose.yml` 配置会挂载您主机上的 `~/.adalflow` 目录到容器内的 `/root/.adalflow`。此路径用于存储: +- 克隆的仓库 (`~/.adalflow/repos/`) +- 仓库的嵌入和索引 (`~/.adalflow/databases/`) +- 缓存的已生成 Wiki 内容 (`~/.adalflow/wikicache/`) + +这确保了即使容器停止或移除,您的数据也能持久保存。) + +> 💡 **获取这些密钥的地方:** +> - 从[Google AI Studio](https://makersuite.google.com/app/apikey)获取Google API密钥 +> - 从[OpenAI Platform](https://platform.openai.com/api-keys)获取OpenAI API密钥 + +### 选项2:手动设置(推荐) + +#### 步骤1:设置API密钥 + +在项目根目录创建一个`.env`文件,包含以下密钥: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# 可选:如果您想使用OpenRouter模型,添加此项 +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### 步骤2:启动后端 + +```bash +# 安装Python依赖 +pip install -r api/requirements.txt + +# 启动API服务器 +python -m api.main +``` + +#### 步骤3:启动前端 + +```bash +# 安装JavaScript依赖 +npm install +# 或 +yarn install + +# 启动Web应用 +npm run dev +# 或 +yarn dev +``` + +#### 步骤4:使用DeepWiki! + +1. 在浏览器中打开[http://localhost:3000](http://localhost:3000) +2. 输入GitHub、GitLab或Bitbucket仓库(如`https://github.com/openai/codex`、`https://github.com/microsoft/autogen`、`https://gitlab.com/gitlab-org/gitlab`或`https://bitbucket.org/redradish/atlassian_app_versions`) +3. 对于私有仓库,点击"+ 添加访问令牌"并输入您的GitHub或GitLab个人访问令牌 +4. 点击"生成Wiki",见证奇迹的发生! + +## 🔍 工作原理 + +DeepWiki使用AI来: + +1. 克隆并分析GitHub、GitLab或Bitbucket仓库(包括使用令牌认证的私有仓库) +2. 创建代码嵌入用于智能检索 +3. 使用上下文感知AI生成文档(使用Google Gemini、OpenAI、OpenRouter或本地Ollama模型) +4. 创建可视化图表解释代码关系 +5. 将所有内容组织成结构化Wiki +6. 通过提问功能实现与仓库的智能问答 +7. 通过深度研究功能提供深入研究能力 + +```mermaid +graph TD + A[用户输入GitHub/GitLab/Bitbucket仓库] --> AA{私有仓库?} + AA -->|是| AB[添加访问令牌] + AA -->|否| B[克隆仓库] + AB --> B + B --> C[分析代码结构] + C --> D[创建代码嵌入] + + D --> M{选择模型提供商} + M -->|Google Gemini| E1[使用Gemini生成] + M -->|OpenAI| E2[使用OpenAI生成] + M -->|OpenRouter| E3[使用OpenRouter生成] + M -->|本地Ollama| E4[使用Ollama生成] + + E1 --> E[生成文档] + E2 --> E + E3 --> E + E4 --> E + + D --> F[创建可视化图表] + E --> G[组织为Wiki] + F --> G + G --> H[交互式DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ 项目结构 + +``` +deepwiki/ +├── api/ # 后端API服务器 +│ ├── main.py # API入口点 +│ ├── api.py # FastAPI实现 +│ ├── rag.py # 检索增强生成 +│ ├── data_pipeline.py # 数据处理工具 +│ └── requirements.txt # Python依赖 +│ +├── src/ # 前端Next.js应用 +│ ├── app/ # Next.js应用目录 +│ │ └── page.tsx # 主应用页面 +│ └── components/ # React组件 +│ └── Mermaid.tsx # Mermaid图表渲染器 +│ +├── public/ # 静态资源 +├── package.json # JavaScript依赖 +└── .env # 环境变量(需要创建) +``` + +## 🤖 提问和深度研究功能 + +### 提问功能 + +提问功能允许您使用检索增强生成(RAG)与您的仓库聊天: + +- **上下文感知响应**:基于仓库中实际代码获取准确答案 +- **RAG驱动**:系统检索相关代码片段,提供有根据的响应 +- **实时流式传输**:实时查看生成的响应,获得更交互式的体验 +- **对话历史**:系统在问题之间保持上下文,实现更连贯的交互 + +### 深度研究功能 + +深度研究通过多轮研究过程将仓库分析提升到新水平: + +- **深入调查**:通过多次研究迭代彻底探索复杂主题 +- **结构化过程**:遵循清晰的研究计划,包含更新和全面结论 +- **自动继续**:AI自动继续研究直到达成结论(最多5次迭代) +- **研究阶段**: + 1. **研究计划**:概述方法和初步发现 + 2. **研究更新**:在前一轮迭代基础上增加新见解 + 3. **最终结论**:基于所有迭代提供全面答案 + +要使用深度研究,只需在提交问题前在提问界面中切换"深度研究"开关。 + +## 📱 截图 + +![DeepWiki主界面](screenshots/Interface.png) +*DeepWiki的主界面* + +![私有仓库支持](screenshots/privaterepo.png) +*使用个人访问令牌访问私有仓库* + +![深度研究功能](screenshots/DeepResearch.png) +*深度研究为复杂主题进行多轮调查* + +### 演示视频 + +[![DeepWiki演示视频](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*观看DeepWiki实际操作!* + +## ❓ 故障排除 + +### API密钥问题 +- **"缺少环境变量"**:确保您的`.env`文件位于项目根目录并包含所需的API密钥 +- **"API密钥无效"**:检查您是否正确复制了完整密钥,没有多余空格 +- **"OpenRouter API错误"**:验证您的OpenRouter API密钥有效且有足够的额度 + +### 连接问题 +- **"无法连接到API服务器"**:确保API服务器在端口8001上运行 +- **"CORS错误"**:API配置为允许所有来源,但如果您遇到问题,请尝试在同一台机器上运行前端和后端 + +### 生成问题 +- **"生成Wiki时出错"**:对于非常大的仓库,请先尝试较小的仓库 +- **"无效的仓库格式"**:确保您使用有效的GitHub、GitLab或Bitbucket URL格式 +- **"无法获取仓库结构"**:对于私有仓库,确保您输入了具有适当权限的有效个人访问令牌 +- **"图表渲染错误"**:应用程序将自动尝试修复损坏的图表 + +### 常见解决方案 +1. **重启两个服务器**:有时简单的重启可以解决大多数问题 +2. **检查控制台日志**:打开浏览器开发者工具查看任何JavaScript错误 +3. **检查API日志**:查看运行API的终端中的Python错误 + +## 🤝 贡献 + +欢迎贡献!随时: +- 为bug或功能请求开issue +- 提交pull request改进代码 +- 分享您的反馈和想法 + +## 📄 许可证 + +本项目根据MIT许可证授权 - 详情请参阅[LICENSE](LICENSE)文件。 + +## ⭐ 星标历史 + +[![星标历史图表](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + +## 🤖 基于提供者的模型选择系统 + +DeepWiki 现在实现了灵活的基于提供者的模型选择系统,支持多种 LLM 提供商: + +### 支持的提供商和模型 + +- **Google**: 默认使用 `gemini-2.5-flash`,还支持 `gemini-2.5-flash-lite`、`gemini-2.5-pro` 等 +- **OpenAI**: 默认使用 `gpt-5-nano`,还支持 `gpt-5`, `4o` 等 +- **OpenRouter**: 通过统一 API 访问多种模型,包括 Claude、Llama、Mistral 等 +- **Ollama**: 支持本地运行的开源模型,如 `llama3` + +### 环境变量 + +每个提供商需要相应的 API 密钥环境变量: + +``` +# API 密钥 +GOOGLE_API_KEY=你的谷歌API密钥 # 使用 Google Gemini 模型必需 +OPENAI_API_KEY=你的OpenAI密钥 # 使用 OpenAI 模型必需 +OPENROUTER_API_KEY=你的OpenRouter密钥 # 使用 OpenRouter 模型必需 + +# OpenAI API 基础 URL 配置 +OPENAI_BASE_URL=https://自定义API端点.com/v1 # 可选,用于自定义 OpenAI API 端点 +``` + +### 为服务提供者设计的自定义模型选择 + +自定义模型选择功能专为需要以下功能的服务提供者设计: + +- 您可在您的组织内部为用户提供多种 AI 模型选择 +- 您无需代码更改即可快速适应快速发展的 LLM 领域 +- 您可支持预定义列表中没有的专业或微调模型 + +使用者可以通过从服务提供者预定义选项中选择或在前端界面中输入自定义模型标识符来实现其模型产品。 + +### 为企业私有渠道设计的基础 URL 配置 + +OpenAI 客户端的 base_url 配置主要为拥有私有 API 渠道的企业用户设计。此功能: + +- 支持连接到私有或企业特定的 API 端点 +- 允许组织使用自己的自托管或自定义部署的 LLM 服务 +- 支持与第三方 OpenAI API 兼容服务的集成 + +**即将推出**:在未来的更新中,DeepWiki 将支持一种模式,用户需要在请求中提供自己的 API 密钥。这将允许拥有私有渠道的企业客户使用其现有的 API 安排,而不是与 DeepWiki 部署共享凭据。 + +### 环境变量 + +每个提供商需要其相应的API密钥环境变量: + +``` +# API密钥 +GOOGLE_API_KEY=your_google_api_key # Google Gemini模型必需 +OPENAI_API_KEY=your_openai_api_key # OpenAI模型必需 +OPENROUTER_API_KEY=your_openrouter_api_key # OpenRouter模型必需 + +# OpenAI API基础URL配置 +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # 可选,用于自定义OpenAI API端点 + +# 配置目录 +DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # 可选,用于自定义配置文件位置 + +# 授权模式 +DEEPWIKI_AUTH_MODE=true # 设置为 true 或 1 以启用授权模式 +DEEPWIKI_AUTH_CODE=your_secret_code # 当 DEEPWIKI_AUTH_MODE 启用时所需的授权码 +``` +如果不使用ollama模式,那么需要配置OpenAI API密钥用于embeddings。其他密钥只有配置并使用使用对应提供商的模型时才需要。 + +## 授权模式 + +DeepWiki 可以配置为在授权模式下运行,在该模式下,生成 Wiki 需要有效的授权码。如果您想控制谁可以使用生成功能,这将非常有用。 +限制使用前端页面生成wiki并保护已生成页面的缓存删除,但无法完全阻止直接访问 API 端点生成wiki。主要目的是为了保护管理员已生成的wiki页面,防止被访问者重新生成。 + +要启用授权模式,请设置以下环境变量: + +- `DEEPWIKI_AUTH_MODE`: 将此设置为 `true` 或 `1`。启用后,前端将显示一个用于输入授权码的字段。 +- `DEEPWIKI_AUTH_CODE`: 将此设置为所需的密钥。限制使用前端页面生成wiki并保护已生成页面的缓存删除,但无法完全阻止直接访问 API 端点生成wiki。 + +如果未设置 `DEEPWIKI_AUTH_MODE` 或将其设置为 `false`(或除 `true`/`1` 之外的任何其他值),则授权功能将被禁用,并且不需要任何代码。 + +### 配置文件 + +DeepWiki使用JSON配置文件管理系统的各个方面: + +1. **`generator.json`**:文本生成模型配置 + - 定义可用的模型提供商(Google、OpenAI、OpenRouter、Ollama) + - 指定每个提供商的默认和可用模型 + - 包含特定模型的参数,如temperature和top_p + +2. **`embedder.json`**:嵌入模型和文本处理配置 + - 定义用于向量存储的嵌入模型 + - 包含用于RAG的检索器配置 + - 指定文档分块的文本分割器设置 + +3. **`repo.json`**:仓库处理配置 + - 包含排除特定文件和目录的文件过滤器 + - 定义仓库大小限制和处理规则 + +默认情况下,这些文件位于`api/config/`目录中。您可以使用`DEEPWIKI_CONFIG_DIR`环境变量自定义它们的位置。 + +### 面向服务提供商的自定义模型选择 + +自定义模型选择功能专为需要以下功能的服务提供者设计: + +- 您可在您的组织内部为用户提供多种 AI 模型选择 +- 您无需代码更改即可快速适应快速发展的 LLM 领域 +- 您可支持预定义列表中没有的专业或微调模型 + +使用者可以通过从服务提供者预定义选项中选择或在前端界面中输入自定义模型标识符来实现其模型产品。 + +### 为企业私有渠道设计的基础 URL 配置 + +OpenAI 客户端的 base_url 配置主要为拥有私有 API 渠道的企业用户设计。此功能: + +- 支持连接到私有或企业特定的 API 端点 +- 允许组织使用自己的自托管或自定义部署的 LLM 服务 +- 支持与第三方 OpenAI API 兼容服务的集成 + +**即将推出**:在未来的更新中,DeepWiki 将支持一种模式,用户需要在请求中提供自己的 API 密钥。这将允许拥有私有渠道的企业客户使用其现有的 API 安排,而不是与 DeepWiki 部署共享凭据。 + +## 🧩 使用 OpenAI 兼容的 Embedding 模型(如阿里巴巴 Qwen) + +如果你希望使用 OpenAI 以外、但兼容 OpenAI 接口的 embedding 模型(如阿里巴巴 Qwen),请参考以下步骤: + +1. 用 `api/config/embedder_openai_compatible.json` 的内容替换 `api/config/embedder.json`。 +2. 在项目根目录的 `.env` 文件中,配置相应的环境变量,例如: + ``` + OPENAI_API_KEY=你的_api_key + OPENAI_BASE_URL=你的_openai_兼容接口地址 + ``` +3. 程序会自动用环境变量的值替换 embedder.json 里的占位符。 + +这样即可无缝切换到 OpenAI 兼容的 embedding 服务,无需修改代码。 + diff --git a/reference-deepwiki/api/README.md b/reference-deepwiki/api/README.md new file mode 100644 index 0000000..4e09fb3 --- /dev/null +++ b/reference-deepwiki/api/README.md @@ -0,0 +1,199 @@ +# 🚀 DeepWiki API + +This is the backend API for DeepWiki, providing smart code analysis and AI-powered documentation generation. + +## ✨ Features + +- **Streaming AI Responses**: Real-time responses using Google's Generative AI (Gemini) +- **Smart Code Analysis**: Automatically analyzes GitHub repositories +- **RAG Implementation**: Retrieval Augmented Generation for context-aware responses +- **Local Storage**: All data stored locally - no cloud dependencies +- **Conversation History**: Maintains context across multiple questions + +## 🔧 Quick Setup + +### Step 1: Install Dependencies + +```bash +# From the project root +pip install -r api/requirements.txt +``` + +### Step 2: Set Up Environment Variables + +Create a `.env` file in the project root: + +``` +# Required API Keys +GOOGLE_API_KEY=your_google_api_key # Required for Google Gemini models +OPENAI_API_KEY=your_openai_api_key # Required for embeddings and OpenAI models + +# Optional API Keys +OPENROUTER_API_KEY=your_openrouter_api_key # Required only if using OpenRouter models + +# AWS Bedrock Configuration +AWS_ACCESS_KEY_ID=your_aws_access_key_id # Required for AWS Bedrock models +AWS_SECRET_ACCESS_KEY=your_aws_secret_key # Required for AWS Bedrock models +AWS_REGION=us-east-1 # Optional, defaults to us-east-1 +AWS_ROLE_ARN=your_aws_role_arn # Optional, for role-based authentication + +# OpenAI API Configuration +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # Optional, for custom OpenAI API endpoints + +# Ollama host +OLLAMA_HOST=https://your_ollama_host" # Optional: Add Ollama host if not local. default: http://localhost:11434 + +# Server Configuration +PORT=8001 # Optional, defaults to 8001 +``` + +If you're not using Ollama mode, you need to configure an OpenAI API key for embeddings. Other API keys are only required when configuring and using models from the corresponding providers. + +> 💡 **Where to get these keys:** +> - Get a Google API key from [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Get an OpenAI API key from [OpenAI Platform](https://platform.openai.com/api-keys) +> - Get an OpenRouter API key from [OpenRouter](https://openrouter.ai/keys) +> - Get AWS credentials from [AWS IAM Console](https://console.aws.amazon.com/iam/) + +#### Advanced Environment Configuration + +##### Provider-Based Model Selection +DeepWiki supports multiple LLM providers. The environment variables above are required depending on which providers you want to use: + +- **Google Gemini**: Requires `GOOGLE_API_KEY` +- **OpenAI**: Requires `OPENAI_API_KEY` +- **OpenRouter**: Requires `OPENROUTER_API_KEY` +- **AWS Bedrock**: Requires `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` +- **Ollama**: No API key required (runs locally) + +##### Custom OpenAI API Endpoints +The `OPENAI_BASE_URL` variable allows you to specify a custom endpoint for the OpenAI API. This is useful for: + +- Enterprise users with private API channels +- Organizations using self-hosted or custom-deployed LLM services +- Integration with third-party OpenAI API-compatible services + +**Example:** you can use the endpoint which support the OpenAI protocol provided by any organization +``` +OPENAI_BASE_URL=https://custom-openai-endpoint.com/v1 +``` + +##### Configuration Files +DeepWiki now uses JSON configuration files to manage various system components instead of hardcoded values: + +1. **`generator.json`**: Configuration for text generation models + - Located in `api/config/` by default + - Defines available model providers (Google, OpenAI, OpenRouter, AWS Bedrock, Ollama) + - Specifies default and available models for each provider + - Contains model-specific parameters like temperature and top_p + +2. **`embedder.json`**: Configuration for embedding models and text processing + - Located in `api/config/` by default + - Defines embedding models for vector storage + - Contains retriever configuration for RAG + - Specifies text splitter settings for document chunking + +3. **`repo.json`**: Configuration for repository handling + - Located in `api/config/` by default + - Contains file filters to exclude certain files and directories + - Defines repository size limits and processing rules + +You can customize the configuration directory location using the environment variable: + +``` +DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # Optional, for custom config file location +``` + +This allows you to maintain different configurations for various environments or deployment scenarios without modifying the code. + +### Step 3: Start the API Server + +```bash +# From the project root +python -m api.main +``` + +The API will be available at `http://localhost:8001` + +## 🧠 How It Works + +### 1. Repository Indexing +When you provide a GitHub repository URL, the API: +- Clones the repository locally (if not already cloned) +- Reads all files in the repository +- Creates embeddings for the files using OpenAI +- Stores the embeddings in a local database + +### 2. Smart Retrieval (RAG) +When you ask a question: +- The API finds the most relevant code snippets +- These snippets are used as context for the AI +- The AI generates a response based on this context + +### 3. Real-Time Streaming +- Responses are streamed in real-time +- You see the answer as it's being generated +- This creates a more interactive experience + +## 📡 API Endpoints + +### GET / +Returns basic API information and available endpoints. + +### POST /chat/completions/stream +Streams an AI-generated response about a GitHub repository. + +**Request Body:** + +```json +{ + "repo_url": "https://github.com/username/repo", + "messages": [ + { + "role": "user", + "content": "What does this repository do?" + } + ], + "filePath": "optional/path/to/file.py" // Optional +} +``` + +**Response:** +A streaming response with the generated text. + +## 📝 Example Code + +```python +import requests + +# API endpoint +url = "http://localhost:8001/chat/completions/stream" + +# Request data +payload = { + "repo_url": "https://github.com/AsyncFuncAI/deepwiki-open", + "messages": [ + { + "role": "user", + "content": "Explain how React components work" + } + ] +} + +# Make streaming request +response = requests.post(url, json=payload, stream=True) + +# Process the streaming response +for chunk in response.iter_content(chunk_size=None): + if chunk: + print(chunk.decode('utf-8'), end='', flush=True) +``` + +## 💾 Storage + +All data is stored locally on your machine: +- Cloned repositories: `~/.adalflow/repos/` +- Embeddings and indexes: `~/.adalflow/databases/` +- Generated wiki cache: `~/.adalflow/wikicache/` + +No cloud storage is used - everything runs on your computer! diff --git a/reference-deepwiki/api/__init__.py b/reference-deepwiki/api/__init__.py new file mode 100644 index 0000000..3660b8d --- /dev/null +++ b/reference-deepwiki/api/__init__.py @@ -0,0 +1,3 @@ +# Make the api package importable + +# api package diff --git a/reference-deepwiki/api/api.py b/reference-deepwiki/api/api.py new file mode 100644 index 0000000..d40e73f --- /dev/null +++ b/reference-deepwiki/api/api.py @@ -0,0 +1,634 @@ +import os +import logging +from fastapi import FastAPI, HTTPException, Query, Request, WebSocket +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse, Response +from typing import List, Optional, Dict, Any, Literal +import json +from datetime import datetime +from pydantic import BaseModel, Field +import google.generativeai as genai +import asyncio + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +logger = logging.getLogger(__name__) + + +# Initialize FastAPI app +app = FastAPI( + title="Streaming API", + description="API for streaming chat completions" +) + +# Configure CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Allows all origins + allow_credentials=True, + allow_methods=["*"], # Allows all methods + allow_headers=["*"], # Allows all headers +) + +# Helper function to get adalflow root path +def get_adalflow_default_root_path(): + return os.path.expanduser(os.path.join("~", ".adalflow")) + +# --- Pydantic Models --- +class WikiPage(BaseModel): + """ + Model for a wiki page. + """ + id: str + title: str + content: str + filePaths: List[str] + importance: str # Should ideally be Literal['high', 'medium', 'low'] + relatedPages: List[str] + +class ProcessedProjectEntry(BaseModel): + id: str # Filename + owner: str + repo: str + name: str # owner/repo + repo_type: str # Renamed from type to repo_type for clarity with existing models + submittedAt: int # Timestamp + language: str # Extracted from filename + +class RepoInfo(BaseModel): + owner: str + repo: str + type: str + token: Optional[str] = None + localPath: Optional[str] = None + repoUrl: Optional[str] = None + + +class WikiSection(BaseModel): + """ + Model for the wiki sections. + """ + id: str + title: str + pages: List[str] + subsections: Optional[List[str]] = None + + +class WikiStructureModel(BaseModel): + """ + Model for the overall wiki structure. + """ + id: str + title: str + description: str + pages: List[WikiPage] + sections: Optional[List[WikiSection]] = None + rootSections: Optional[List[str]] = None + +class WikiCacheData(BaseModel): + """ + Model for the data to be stored in the wiki cache. + """ + wiki_structure: WikiStructureModel + generated_pages: Dict[str, WikiPage] + repo_url: Optional[str] = None #compatible for old cache + repo: Optional[RepoInfo] = None + provider: Optional[str] = None + model: Optional[str] = None + +class WikiCacheRequest(BaseModel): + """ + Model for the request body when saving wiki cache. + """ + repo: RepoInfo + language: str + wiki_structure: WikiStructureModel + generated_pages: Dict[str, WikiPage] + provider: str + model: str + +class WikiExportRequest(BaseModel): + """ + Model for requesting a wiki export. + """ + repo_url: str = Field(..., description="URL of the repository") + pages: List[WikiPage] = Field(..., description="List of wiki pages to export") + format: Literal["markdown", "json"] = Field(..., description="Export format (markdown or json)") + +# --- Model Configuration Models --- +class Model(BaseModel): + """ + Model for LLM model configuration + """ + id: str = Field(..., description="Model identifier") + name: str = Field(..., description="Display name for the model") + +class Provider(BaseModel): + """ + Model for LLM provider configuration + """ + id: str = Field(..., description="Provider identifier") + name: str = Field(..., description="Display name for the provider") + models: List[Model] = Field(..., description="List of available models for this provider") + supportsCustomModel: Optional[bool] = Field(False, description="Whether this provider supports custom models") + +class ModelConfig(BaseModel): + """ + Model for the entire model configuration + """ + providers: List[Provider] = Field(..., description="List of available model providers") + defaultProvider: str = Field(..., description="ID of the default provider") + +class AuthorizationConfig(BaseModel): + code: str = Field(..., description="Authorization code") + +from api.config import configs, WIKI_AUTH_MODE, WIKI_AUTH_CODE + +@app.get("/lang/config") +async def get_lang_config(): + return configs["lang_config"] + +@app.get("/auth/status") +async def get_auth_status(): + """ + Check if authentication is required for the wiki. + """ + return {"auth_required": WIKI_AUTH_MODE} + +@app.post("/auth/validate") +async def validate_auth_code(request: AuthorizationConfig): + """ + Check authorization code. + """ + return {"success": WIKI_AUTH_CODE == request.code} + +@app.get("/models/config", response_model=ModelConfig) +async def get_model_config(): + """ + Get available model providers and their models. + + This endpoint returns the configuration of available model providers and their + respective models that can be used throughout the application. + + Returns: + ModelConfig: A configuration object containing providers and their models + """ + try: + logger.info("Fetching model configurations") + + # Create providers from the config file + providers = [] + default_provider = configs.get("default_provider", "google") + + # Add provider configuration based on config.py + for provider_id, provider_config in configs["providers"].items(): + models = [] + # Add models from config + for model_id in provider_config["models"].keys(): + # Get a more user-friendly display name if possible + models.append(Model(id=model_id, name=model_id)) + + # Add provider with its models + providers.append( + Provider( + id=provider_id, + name=f"{provider_id.capitalize()}", + supportsCustomModel=provider_config.get("supportsCustomModel", False), + models=models + ) + ) + + # Create and return the full configuration + config = ModelConfig( + providers=providers, + defaultProvider=default_provider + ) + return config + + except Exception as e: + logger.error(f"Error creating model configuration: {str(e)}") + # Return some default configuration in case of error + return ModelConfig( + providers=[ + Provider( + id="google", + name="Google", + supportsCustomModel=True, + models=[ + Model(id="gemini-2.5-flash", name="Gemini 2.5 Flash") + ] + ) + ], + defaultProvider="google" + ) + +@app.post("/export/wiki") +async def export_wiki(request: WikiExportRequest): + """ + Export wiki content as Markdown or JSON. + + Args: + request: The export request containing wiki pages and format + + Returns: + A downloadable file in the requested format + """ + try: + logger.info(f"Exporting wiki for {request.repo_url} in {request.format} format") + + # Extract repository name from URL for the filename + repo_parts = request.repo_url.rstrip('/').split('/') + repo_name = repo_parts[-1] if len(repo_parts) > 0 else "wiki" + + # Get current timestamp for the filename + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + if request.format == "markdown": + # Generate Markdown content + content = generate_markdown_export(request.repo_url, request.pages) + filename = f"{repo_name}_wiki_{timestamp}.md" + media_type = "text/markdown" + else: # JSON format + # Generate JSON content + content = generate_json_export(request.repo_url, request.pages) + filename = f"{repo_name}_wiki_{timestamp}.json" + media_type = "application/json" + + # Create response with appropriate headers for file download + response = Response( + content=content, + media_type=media_type, + headers={ + "Content-Disposition": f"attachment; filename={filename}" + } + ) + + return response + + except Exception as e: + error_msg = f"Error exporting wiki: {str(e)}" + logger.error(error_msg) + raise HTTPException(status_code=500, detail=error_msg) + +@app.get("/local_repo/structure") +async def get_local_repo_structure(path: str = Query(None, description="Path to local repository")): + """Return the file tree and README content for a local repository.""" + if not path: + return JSONResponse( + status_code=400, + content={"error": "No path provided. Please provide a 'path' query parameter."} + ) + + if not os.path.isdir(path): + return JSONResponse( + status_code=404, + content={"error": f"Directory not found: {path}"} + ) + + try: + logger.info(f"Processing local repository at: {path}") + file_tree_lines = [] + readme_content = "" + + for root, dirs, files in os.walk(path): + # Exclude hidden dirs/files and virtual envs + dirs[:] = [d for d in dirs if not d.startswith('.') and d != '__pycache__' and d != 'node_modules' and d != '.venv'] + for file in files: + if file.startswith('.') or file == '__init__.py' or file == '.DS_Store': + continue + rel_dir = os.path.relpath(root, path) + rel_file = os.path.join(rel_dir, file) if rel_dir != '.' else file + file_tree_lines.append(rel_file) + # Find README.md (case-insensitive) + if file.lower() == 'readme.md' and not readme_content: + try: + with open(os.path.join(root, file), 'r', encoding='utf-8') as f: + readme_content = f.read() + except Exception as e: + logger.warning(f"Could not read README.md: {str(e)}") + readme_content = "" + + file_tree_str = '\n'.join(sorted(file_tree_lines)) + return {"file_tree": file_tree_str, "readme": readme_content} + except Exception as e: + logger.error(f"Error processing local repository: {str(e)}") + return JSONResponse( + status_code=500, + content={"error": f"Error processing local repository: {str(e)}"} + ) + +def generate_markdown_export(repo_url: str, pages: List[WikiPage]) -> str: + """ + Generate Markdown export of wiki pages. + + Args: + repo_url: The repository URL + pages: List of wiki pages + + Returns: + Markdown content as string + """ + # Start with metadata + markdown = f"# Wiki Documentation for {repo_url}\n\n" + markdown += f"Generated on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" + + # Add table of contents + markdown += "## Table of Contents\n\n" + for page in pages: + markdown += f"- [{page.title}](#{page.id})\n" + markdown += "\n" + + # Add each page + for page in pages: + markdown += f"\n\n" + markdown += f"## {page.title}\n\n" + + + + # Add related pages + if page.relatedPages and len(page.relatedPages) > 0: + markdown += "### Related Pages\n\n" + related_titles = [] + for related_id in page.relatedPages: + # Find the title of the related page + related_page = next((p for p in pages if p.id == related_id), None) + if related_page: + related_titles.append(f"[{related_page.title}](#{related_id})") + + if related_titles: + markdown += "Related topics: " + ", ".join(related_titles) + "\n\n" + + # Add page content + markdown += f"{page.content}\n\n" + markdown += "---\n\n" + + return markdown + +def generate_json_export(repo_url: str, pages: List[WikiPage]) -> str: + """ + Generate JSON export of wiki pages. + + Args: + repo_url: The repository URL + pages: List of wiki pages + + Returns: + JSON content as string + """ + # Create a dictionary with metadata and pages + export_data = { + "metadata": { + "repository": repo_url, + "generated_at": datetime.now().isoformat(), + "page_count": len(pages) + }, + "pages": [page.model_dump() for page in pages] + } + + # Convert to JSON string with pretty formatting + return json.dumps(export_data, indent=2) + +# Import the simplified chat implementation +from api.simple_chat import chat_completions_stream +from api.websocket_wiki import handle_websocket_chat + +# Add the chat_completions_stream endpoint to the main app +app.add_api_route("/chat/completions/stream", chat_completions_stream, methods=["POST"]) + +# Add the WebSocket endpoint +app.add_websocket_route("/ws/chat", handle_websocket_chat) + +# --- Wiki Cache Helper Functions --- + +WIKI_CACHE_DIR = os.path.join(get_adalflow_default_root_path(), "wikicache") +os.makedirs(WIKI_CACHE_DIR, exist_ok=True) + +def get_wiki_cache_path(owner: str, repo: str, repo_type: str, language: str) -> str: + """Generates the file path for a given wiki cache.""" + filename = f"deepwiki_cache_{repo_type}_{owner}_{repo}_{language}.json" + return os.path.join(WIKI_CACHE_DIR, filename) + +async def read_wiki_cache(owner: str, repo: str, repo_type: str, language: str) -> Optional[WikiCacheData]: + """Reads wiki cache data from the file system.""" + cache_path = get_wiki_cache_path(owner, repo, repo_type, language) + if os.path.exists(cache_path): + try: + with open(cache_path, 'r', encoding='utf-8') as f: + data = json.load(f) + return WikiCacheData(**data) + except Exception as e: + logger.error(f"Error reading wiki cache from {cache_path}: {e}") + return None + return None + +async def save_wiki_cache(data: WikiCacheRequest) -> bool: + """Saves wiki cache data to the file system.""" + cache_path = get_wiki_cache_path(data.repo.owner, data.repo.repo, data.repo.type, data.language) + logger.info(f"Attempting to save wiki cache. Path: {cache_path}") + try: + payload = WikiCacheData( + wiki_structure=data.wiki_structure, + generated_pages=data.generated_pages, + repo=data.repo, + provider=data.provider, + model=data.model + ) + # Log size of data to be cached for debugging (avoid logging full content if large) + try: + payload_json = payload.model_dump_json() + payload_size = len(payload_json.encode('utf-8')) + logger.info(f"Payload prepared for caching. Size: {payload_size} bytes.") + except Exception as ser_e: + logger.warning(f"Could not serialize payload for size logging: {ser_e}") + + + logger.info(f"Writing cache file to: {cache_path}") + with open(cache_path, 'w', encoding='utf-8') as f: + json.dump(payload.model_dump(), f, indent=2) + logger.info(f"Wiki cache successfully saved to {cache_path}") + return True + except IOError as e: + logger.error(f"IOError saving wiki cache to {cache_path}: {e.strerror} (errno: {e.errno})", exc_info=True) + return False + except Exception as e: + logger.error(f"Unexpected error saving wiki cache to {cache_path}: {e}", exc_info=True) + return False + +# --- Wiki Cache API Endpoints --- + +@app.get("/api/wiki_cache", response_model=Optional[WikiCacheData]) +async def get_cached_wiki( + owner: str = Query(..., description="Repository owner"), + repo: str = Query(..., description="Repository name"), + repo_type: str = Query(..., description="Repository type (e.g., github, gitlab)"), + language: str = Query(..., description="Language of the wiki content") +): + """ + Retrieves cached wiki data (structure and generated pages) for a repository. + """ + # Language validation + supported_langs = configs["lang_config"]["supported_languages"] + if not supported_langs.__contains__(language): + language = configs["lang_config"]["default"] + + logger.info(f"Attempting to retrieve wiki cache for {owner}/{repo} ({repo_type}), lang: {language}") + cached_data = await read_wiki_cache(owner, repo, repo_type, language) + if cached_data: + return cached_data + else: + # Return 200 with null body if not found, as frontend expects this behavior + # Or, raise HTTPException(status_code=404, detail="Wiki cache not found") if preferred + logger.info(f"Wiki cache not found for {owner}/{repo} ({repo_type}), lang: {language}") + return None + +@app.post("/api/wiki_cache") +async def store_wiki_cache(request_data: WikiCacheRequest): + """ + Stores generated wiki data (structure and pages) to the server-side cache. + """ + # Language validation + supported_langs = configs["lang_config"]["supported_languages"] + + if not supported_langs.__contains__(request_data.language): + request_data.language = configs["lang_config"]["default"] + + logger.info(f"Attempting to save wiki cache for {request_data.repo.owner}/{request_data.repo.repo} ({request_data.repo.type}), lang: {request_data.language}") + success = await save_wiki_cache(request_data) + if success: + return {"message": "Wiki cache saved successfully"} + else: + raise HTTPException(status_code=500, detail="Failed to save wiki cache") + +@app.delete("/api/wiki_cache") +async def delete_wiki_cache( + owner: str = Query(..., description="Repository owner"), + repo: str = Query(..., description="Repository name"), + repo_type: str = Query(..., description="Repository type (e.g., github, gitlab)"), + language: str = Query(..., description="Language of the wiki content"), + authorization_code: Optional[str] = Query(None, description="Authorization code") +): + """ + Deletes a specific wiki cache from the file system. + """ + # Language validation + supported_langs = configs["lang_config"]["supported_languages"] + if not supported_langs.__contains__(language): + raise HTTPException(status_code=400, detail="Language is not supported") + + if WIKI_AUTH_MODE: + logger.info("check the authorization code") + if not authorization_code or WIKI_AUTH_CODE != authorization_code: + raise HTTPException(status_code=401, detail="Authorization code is invalid") + + logger.info(f"Attempting to delete wiki cache for {owner}/{repo} ({repo_type}), lang: {language}") + cache_path = get_wiki_cache_path(owner, repo, repo_type, language) + + if os.path.exists(cache_path): + try: + os.remove(cache_path) + logger.info(f"Successfully deleted wiki cache: {cache_path}") + return {"message": f"Wiki cache for {owner}/{repo} ({language}) deleted successfully"} + except Exception as e: + logger.error(f"Error deleting wiki cache {cache_path}: {e}") + raise HTTPException(status_code=500, detail=f"Failed to delete wiki cache: {str(e)}") + else: + logger.warning(f"Wiki cache not found, cannot delete: {cache_path}") + raise HTTPException(status_code=404, detail="Wiki cache not found") + +@app.get("/health") +async def health_check(): + """Health check endpoint for Docker and monitoring""" + return { + "status": "healthy", + "timestamp": datetime.now().isoformat(), + "service": "deepwiki-api" + } + +@app.get("/") +async def root(): + """Root endpoint to check if the API is running and list available endpoints dynamically.""" + # Collect routes dynamically from the FastAPI app + endpoints = {} + for route in app.routes: + if hasattr(route, "methods") and hasattr(route, "path"): + # Skip docs and static routes + if route.path in ["/openapi.json", "/docs", "/redoc", "/favicon.ico"]: + continue + # Group endpoints by first path segment + path_parts = route.path.strip("/").split("/") + group = path_parts[0].capitalize() if path_parts[0] else "Root" + method_list = list(route.methods - {"HEAD", "OPTIONS"}) + for method in method_list: + endpoints.setdefault(group, []).append(f"{method} {route.path}") + + # Optionally, sort endpoints for readability + for group in endpoints: + endpoints[group].sort() + + return { + "message": "Welcome to Streaming API", + "version": "1.0.0", + "endpoints": endpoints + } + +# --- Processed Projects Endpoint --- (New Endpoint) +@app.get("/api/processed_projects", response_model=List[ProcessedProjectEntry]) +async def get_processed_projects(): + """ + Lists all processed projects found in the wiki cache directory. + Projects are identified by files named like: deepwiki_cache_{repo_type}_{owner}_{repo}_{language}.json + """ + project_entries: List[ProcessedProjectEntry] = [] + # WIKI_CACHE_DIR is already defined globally in the file + + try: + if not os.path.exists(WIKI_CACHE_DIR): + logger.info(f"Cache directory {WIKI_CACHE_DIR} not found. Returning empty list.") + return [] + + logger.info(f"Scanning for project cache files in: {WIKI_CACHE_DIR}") + filenames = await asyncio.to_thread(os.listdir, WIKI_CACHE_DIR) # Use asyncio.to_thread for os.listdir + + for filename in filenames: + if filename.startswith("deepwiki_cache_") and filename.endswith(".json"): + file_path = os.path.join(WIKI_CACHE_DIR, filename) + try: + stats = await asyncio.to_thread(os.stat, file_path) # Use asyncio.to_thread for os.stat + parts = filename.replace("deepwiki_cache_", "").replace(".json", "").split('_') + + # Expecting repo_type_owner_repo_language + # Example: deepwiki_cache_github_AsyncFuncAI_deepwiki-open_en.json + # parts = [github, AsyncFuncAI, deepwiki-open, en] + if len(parts) >= 4: + repo_type = parts[0] + owner = parts[1] + language = parts[-1] # language is the last part + repo = "_".join(parts[2:-1]) # repo can contain underscores + + project_entries.append( + ProcessedProjectEntry( + id=filename, + owner=owner, + repo=repo, + name=f"{owner}/{repo}", + repo_type=repo_type, + submittedAt=int(stats.st_mtime * 1000), # Convert to milliseconds + language=language + ) + ) + else: + logger.warning(f"Could not parse project details from filename: {filename}") + except Exception as e: + logger.error(f"Error processing file {file_path}: {e}") + continue # Skip this file on error + + # Sort by most recent first + project_entries.sort(key=lambda p: p.submittedAt, reverse=True) + logger.info(f"Found {len(project_entries)} processed project entries.") + return project_entries + + except Exception as e: + logger.error(f"Error listing processed projects from {WIKI_CACHE_DIR}: {e}", exc_info=True) + raise HTTPException(status_code=500, detail="Failed to list processed projects from server cache.") diff --git a/reference-deepwiki/api/azureai_client.py b/reference-deepwiki/api/azureai_client.py new file mode 100644 index 0000000..948e86c --- /dev/null +++ b/reference-deepwiki/api/azureai_client.py @@ -0,0 +1,488 @@ +"""AzureOpenAI ModelClient integration.""" + +import os +from typing import ( + Dict, + Sequence, + Optional, + List, + Any, + TypeVar, + Callable, + Generator, + Union, + Literal, +) +import re + +import logging +import backoff + +# optional import +from adalflow.utils.lazy_import import safe_import, OptionalPackages + +import sys + +openai = safe_import(OptionalPackages.OPENAI.value[0], OptionalPackages.OPENAI.value[1]) +# Importing all Azure packages together +azure_modules = safe_import( + OptionalPackages.AZURE.value[0], # List of package names + OptionalPackages.AZURE.value[1], # Error message +) +# Manually add each module to sys.modules to make them available globally as if imported normally +azure_module_names = OptionalPackages.AZURE.value[0] +for name, module in zip(azure_module_names, azure_modules): + sys.modules[name] = module + +# Use the modules as if they were imported normally +from azure.identity import DefaultAzureCredential, get_bearer_token_provider + +# from azure.core.credentials import AccessToken +from openai import AzureOpenAI, AsyncAzureOpenAI, Stream +from openai import ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, +) +from openai.types import ( + Completion, + CreateEmbeddingResponse, +) +from openai.types.chat import ChatCompletionChunk, ChatCompletion + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ( + ModelType, + EmbedderOutput, + TokenLogProb, + CompletionUsage, + GeneratorOutput, +) +from adalflow.components.model_client.utils import parse_embedding_response + +log = logging.getLogger(__name__) +T = TypeVar("T") + + +__all__ = ["AzureAIClient"] + +# TODO: this overlaps with openai client largely, might need to refactor to subclass openai client to simplify the code + + +# completion parsing functions and you can combine them into one singple chat completion parser +def get_first_message_content(completion: ChatCompletion) -> str: + r"""When we only need the content of the first message. + It is the default parser for chat completion.""" + return completion.choices[0].message.content + + +# def _get_chat_completion_usage(completion: ChatCompletion) -> OpenAICompletionUsage: +# return completion.usage + + +def parse_stream_response(completion: ChatCompletionChunk) -> str: + r"""Parse the response of the stream API.""" + return completion.choices[0].delta.content + + +def handle_streaming_response(generator: Stream[ChatCompletionChunk]): + r"""Handle the streaming response.""" + for completion in generator: + log.debug(f"Raw chunk completion: {completion}") + parsed_content = parse_stream_response(completion) + yield parsed_content + + +def get_all_messages_content(completion: ChatCompletion) -> List[str]: + r"""When the n > 1, get all the messages content.""" + return [c.message.content for c in completion.choices] + + +def get_probabilities(completion: ChatCompletion) -> List[List[TokenLogProb]]: + r"""Get the probabilities of each token in the completion.""" + log_probs = [] + for c in completion.choices: + content = c.logprobs.content + print(content) + log_probs_for_choice = [] + for openai_token_logprob in content: + token = openai_token_logprob.token + logprob = openai_token_logprob.logprob + log_probs_for_choice.append(TokenLogProb(token=token, logprob=logprob)) + log_probs.append(log_probs_for_choice) + return log_probs + + +class AzureAIClient(ModelClient): + __doc__ = r""" + A client wrapper for interacting with Azure OpenAI's API. + + This class provides support for both embedding and chat completion API calls. + Users can use this class to simplify their interactions with Azure OpenAI models + through the `Embedder` and `Generator` components. + + **Initialization:** + + You can initialize the `AzureAIClient` with either an API key or Azure Active Directory (AAD) token + authentication. It is recommended to set environment variables for sensitive data like API keys. + + Args: + api_key (Optional[str]): Azure OpenAI API key. Default is None. + api_version (Optional[str]): API version to use. Default is None. + azure_endpoint (Optional[str]): Azure OpenAI endpoint URL. Default is None. + credential (Optional[DefaultAzureCredential]): Azure AD credential for token-based authentication. Default is None. + chat_completion_parser (Callable[[Completion], Any]): Function to parse chat completions. Default is `get_first_message_content`. + input_type (Literal["text", "messages"]): Format for input, either "text" or "messages". Default is "text". + + **Setup Instructions:** + + - **Using API Key:** + Set up the following environment variables: + ```bash + export AZURE_OPENAI_API_KEY="your_api_key" + export AZURE_OPENAI_ENDPOINT="your_endpoint" + export AZURE_OPENAI_VERSION="your_version" + ``` + + - **Using Azure AD Token:** + Ensure you have configured Azure AD credentials. The `DefaultAzureCredential` will automatically use your configured credentials. + + **Example Usage:** + + .. code-block:: python + + from azure.identity import DefaultAzureCredential + from your_module import AzureAIClient # Adjust import based on your module name + + # Initialize with API key + client = AzureAIClient( + api_key="your_api_key", + api_version="2023-05-15", + azure_endpoint="https://your-endpoint.openai.azure.com/" + ) + + # Or initialize with Azure AD token + client = AzureAIClient( + api_version="2023-05-15", + azure_endpoint="https://your-endpoint.openai.azure.com/", + credential=DefaultAzureCredential() + ) + + # Example call to the chat completion API + api_kwargs = { + "model": "gpt-3.5-turbo", + "messages": [{"role": "user", "content": "What is the meaning of life?"}], + "stream": True + } + response = client.call(api_kwargs=api_kwargs, model_type=ModelType.LLM) + + for chunk in response: + print(chunk) + + + **Notes:** + - Ensure that the API key or credentials are correctly set up and accessible to avoid authentication errors. + - Use `chat_completion_parser` to define how to extract and handle the chat completion responses. + - The `input_type` parameter determines how input is formatted for the API call. + + **References:** + - [Azure OpenAI API Documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/overview) + - [OpenAI API Documentation](https://platform.openai.com/docs/guides/text-generation) + """ + + def __init__( + self, + api_key: Optional[str] = None, + api_version: Optional[str] = None, + azure_endpoint: Optional[str] = None, + credential: Optional[DefaultAzureCredential] = None, + chat_completion_parser: Callable[[Completion], Any] = None, + input_type: Literal["text", "messages"] = "text", + ): + r"""It is recommended to set the API_KEY into the environment variable instead of passing it as an argument. + + + Initializes the Azure OpenAI client with either API key or AAD token authentication. + + Args: + api_key: Azure OpenAI API key. + api_version: Azure OpenAI API version. + azure_endpoint: Azure OpenAI endpoint. + credential: Azure AD credential for token-based authentication. + chat_completion_parser: Function to parse chat completions. + input_type: Input format, either "text" or "messages". + + """ + super().__init__() + + # added api_type azure for azure Ai + self.api_type = "azure" + self._api_key = api_key + self._apiversion = api_version + self._azure_endpoint = azure_endpoint + self._credential = credential + self.sync_client = self.init_sync_client() + self.async_client = None # only initialize if the async call is called + self.chat_completion_parser = ( + chat_completion_parser or get_first_message_content + ) + self._input_type = input_type + + def init_sync_client(self): + api_key = self._api_key or os.getenv("AZURE_OPENAI_API_KEY") + azure_endpoint = self._azure_endpoint or os.getenv("AZURE_OPENAI_ENDPOINT") + api_version = self._apiversion or os.getenv("AZURE_OPENAI_VERSION") + # credential = self._credential or DefaultAzureCredential + if not azure_endpoint: + raise ValueError("Environment variable AZURE_OPENAI_ENDPOINT must be set") + if not api_version: + raise ValueError("Environment variable AZURE_OPENAI_VERSION must be set") + + if api_key: + return AzureOpenAI( + api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version + ) + elif self._credential: + # credential = DefaultAzureCredential() + token_provider = get_bearer_token_provider( + DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" + ) + return AzureOpenAI( + azure_ad_token_provider=token_provider, + azure_endpoint=azure_endpoint, + api_version=api_version, + ) + else: + raise ValueError( + "Environment variable AZURE_OPENAI_API_KEY must be set or credential must be provided" + ) + + def init_async_client(self): + api_key = self._api_key or os.getenv("AZURE_OPENAI_API_KEY") + azure_endpoint = self._azure_endpoint or os.getenv("AZURE_OPENAI_ENDPOINT") + api_version = self._apiversion or os.getenv("AZURE_OPENAI_VERSION") + # credential = self._credential or DefaultAzureCredential() + if not azure_endpoint: + raise ValueError("Environment variable AZURE_OPENAI_ENDPOINT must be set") + if not api_version: + raise ValueError("Environment variable AZURE_OPENAI_VERSION must be set") + + if api_key: + return AsyncAzureOpenAI( + api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version + ) + elif self._credential: + # credential = DefaultAzureCredential() + token_provider = get_bearer_token_provider( + DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" + ) + return AsyncAzureOpenAI( + azure_ad_token_provider=token_provider, + azure_endpoint=azure_endpoint, + api_version=api_version, + ) + else: + raise ValueError( + "Environment variable AZURE_OPENAI_API_KEY must be set or credential must be provided" + ) + + # def _parse_chat_completion(self, completion: ChatCompletion) -> "GeneratorOutput": + # # TODO: raw output it is better to save the whole completion as a source of truth instead of just the message + # try: + # data = self.chat_completion_parser(completion) + # usage = self.track_completion_usage(completion) + # return GeneratorOutput( + # data=data, error=None, raw_response=str(data), usage=usage + # ) + # except Exception as e: + # log.error(f"Error parsing the completion: {e}") + # return GeneratorOutput(data=None, error=str(e), raw_response=completion) + + def parse_chat_completion( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> "GeneratorOutput": + """Parse the completion, and put it into the raw_response.""" + log.debug(f"completion: {completion}, parser: {self.chat_completion_parser}") + try: + data = self.chat_completion_parser(completion) + usage = self.track_completion_usage(completion) + return GeneratorOutput( + data=None, error=None, raw_response=data, usage=usage + ) + except Exception as e: + log.error(f"Error parsing the completion: {e}") + return GeneratorOutput(data=None, error=str(e), raw_response=completion) + + def track_completion_usage( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> CompletionUsage: + if isinstance(completion, ChatCompletion): + usage: CompletionUsage = CompletionUsage( + completion_tokens=completion.usage.completion_tokens, + prompt_tokens=completion.usage.prompt_tokens, + total_tokens=completion.usage.total_tokens, + ) + return usage + else: + raise NotImplementedError( + "streaming completion usage tracking is not implemented" + ) + + def parse_embedding_response( + self, response: CreateEmbeddingResponse + ) -> EmbedderOutput: + r"""Parse the embedding response to a structure AdalFlow components can understand. + + Should be called in ``Embedder``. + """ + try: + return parse_embedding_response(response) + except Exception as e: + log.error(f"Error parsing the embedding response: {e}") + return EmbedderOutput(data=[], error=str(e), raw_response=response) + + def convert_inputs_to_api_kwargs( + self, + input: Optional[Any] = None, + model_kwargs: Dict = {}, + model_type: ModelType = ModelType.UNDEFINED, + ) -> Dict: + r""" + Specify the API input type and output api_kwargs that will be used in _call and _acall methods. + Convert the Component's standard input, and system_input(chat model) and model_kwargs into API-specific format + """ + + final_model_kwargs = model_kwargs.copy() + if model_type == ModelType.EMBEDDER: + if isinstance(input, str): + input = [input] + # convert input to input + if not isinstance(input, Sequence): + raise TypeError("input must be a sequence of text") + final_model_kwargs["input"] = input + elif model_type == ModelType.LLM: + # convert input to messages + messages: List[Dict[str, str]] = [] + + if self._input_type == "messages": + system_start_tag = "" + system_end_tag = "" + user_start_tag = "" + user_end_tag = "" + pattern = f"{system_start_tag}(.*?){system_end_tag}{user_start_tag}(.*?){user_end_tag}" + # Compile the regular expression + regex = re.compile(pattern) + # Match the pattern + match = regex.search(input) + system_prompt, input_str = None, None + + if match: + system_prompt = match.group(1) + input_str = match.group(2) + + else: + print("No match found.") + if system_prompt and input_str: + messages.append({"role": "system", "content": system_prompt}) + messages.append({"role": "user", "content": input_str}) + if len(messages) == 0: + messages.append({"role": "system", "content": input}) + final_model_kwargs["messages"] = messages + else: + raise ValueError(f"model_type {model_type} is not supported") + return final_model_kwargs + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """ + kwargs is the combined input and model_kwargs. Support streaming call. + """ + log.info(f"api_kwargs: {api_kwargs}") + if model_type == ModelType.EMBEDDER: + return self.sync_client.embeddings.create(**api_kwargs) + elif model_type == ModelType.LLM: + if "stream" in api_kwargs and api_kwargs.get("stream", False): + log.debug("streaming call") + self.chat_completion_parser = handle_streaming_response + return self.sync_client.chat.completions.create(**api_kwargs) + return self.sync_client.chat.completions.create(**api_kwargs) + else: + raise ValueError(f"model_type {model_type} is not supported") + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + async def acall( + self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED + ): + """ + kwargs is the combined input and model_kwargs + """ + if self.async_client is None: + self.async_client = self.init_async_client() + if model_type == ModelType.EMBEDDER: + return await self.async_client.embeddings.create(**api_kwargs) + elif model_type == ModelType.LLM: + return await self.async_client.chat.completions.create(**api_kwargs) + else: + raise ValueError(f"model_type {model_type} is not supported") + + @classmethod + def from_dict(cls: type[T], data: Dict[str, Any]) -> T: + obj = super().from_dict(data) + # recreate the existing clients + obj.sync_client = obj.init_sync_client() + obj.async_client = obj.init_async_client() + return obj + + def to_dict(self) -> Dict[str, Any]: + r"""Convert the component to a dictionary.""" + # TODO: not exclude but save yes or no for recreating the clients + exclude = [ + "sync_client", + "async_client", + ] # unserializable object + output = super().to_dict(exclude=exclude) + return output + + +# if __name__ == "__main__": +# from adalflow.core import Generator +# from adalflow.utils import setup_env, get_logger + +# log = get_logger(level="DEBUG") + +# setup_env() +# prompt_kwargs = {"input_str": "What is the meaning of life?"} + +# gen = Generator( +# model_client=OpenAIClient(), +# model_kwargs={"model": "gpt-3.5-turbo", "stream": True}, +# ) +# gen_response = gen(prompt_kwargs) +# print(f"gen_response: {gen_response}") + +# for genout in gen_response.data: +# print(f"genout: {genout}") \ No newline at end of file diff --git a/reference-deepwiki/api/bedrock_client.py b/reference-deepwiki/api/bedrock_client.py new file mode 100644 index 0000000..2799597 --- /dev/null +++ b/reference-deepwiki/api/bedrock_client.py @@ -0,0 +1,317 @@ +"""AWS Bedrock ModelClient integration.""" + +import os +import json +import logging +import boto3 +import botocore +import backoff +from typing import Dict, Any, Optional, List, Generator, Union, AsyncGenerator + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ModelType, GeneratorOutput + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +log = logging.getLogger(__name__) + +class BedrockClient(ModelClient): + __doc__ = r"""A component wrapper for the AWS Bedrock API client. + + AWS Bedrock provides a unified API that gives access to various foundation models + including Amazon's own models and third-party models like Anthropic Claude. + + Example: + ```python + from api.bedrock_client import BedrockClient + + client = BedrockClient() + generator = adal.Generator( + model_client=client, + model_kwargs={"model": "anthropic.claude-3-sonnet-20240229-v1:0"} + ) + ``` + """ + + def __init__( + self, + aws_access_key_id: Optional[str] = None, + aws_secret_access_key: Optional[str] = None, + aws_region: Optional[str] = None, + aws_role_arn: Optional[str] = None, + *args, + **kwargs + ) -> None: + """Initialize the AWS Bedrock client. + + Args: + aws_access_key_id: AWS access key ID. If not provided, will use environment variable AWS_ACCESS_KEY_ID. + aws_secret_access_key: AWS secret access key. If not provided, will use environment variable AWS_SECRET_ACCESS_KEY. + aws_region: AWS region. If not provided, will use environment variable AWS_REGION. + aws_role_arn: AWS IAM role ARN for role-based authentication. If not provided, will use environment variable AWS_ROLE_ARN. + """ + super().__init__(*args, **kwargs) + from api.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_ROLE_ARN + + self.aws_access_key_id = aws_access_key_id or AWS_ACCESS_KEY_ID + self.aws_secret_access_key = aws_secret_access_key or AWS_SECRET_ACCESS_KEY + self.aws_region = aws_region or AWS_REGION or "us-east-1" + self.aws_role_arn = aws_role_arn or AWS_ROLE_ARN + + self.sync_client = self.init_sync_client() + self.async_client = None # Initialize async client only when needed + + def init_sync_client(self): + """Initialize the synchronous AWS Bedrock client.""" + try: + # Create a session with the provided credentials + session = boto3.Session( + aws_access_key_id=self.aws_access_key_id, + aws_secret_access_key=self.aws_secret_access_key, + region_name=self.aws_region + ) + + # If a role ARN is provided, assume that role + if self.aws_role_arn: + sts_client = session.client('sts') + assumed_role = sts_client.assume_role( + RoleArn=self.aws_role_arn, + RoleSessionName="DeepWikiBedrockSession" + ) + credentials = assumed_role['Credentials'] + + # Create a new session with the assumed role credentials + session = boto3.Session( + aws_access_key_id=credentials['AccessKeyId'], + aws_secret_access_key=credentials['SecretAccessKey'], + aws_session_token=credentials['SessionToken'], + region_name=self.aws_region + ) + + # Create the Bedrock client + bedrock_runtime = session.client( + service_name='bedrock-runtime', + region_name=self.aws_region + ) + + return bedrock_runtime + + except Exception as e: + log.error(f"Error initializing AWS Bedrock client: {str(e)}") + # Return None to indicate initialization failure + return None + + def init_async_client(self): + """Initialize the asynchronous AWS Bedrock client. + + Note: boto3 doesn't have native async support, so we'll use the sync client + in async methods and handle async behavior at a higher level. + """ + # For now, just return the sync client + return self.sync_client + + def _get_model_provider(self, model_id: str) -> str: + """Extract the provider from the model ID. + + Args: + model_id: The model ID, e.g., "anthropic.claude-3-sonnet-20240229-v1:0" + + Returns: + The provider name, e.g., "anthropic" + """ + if "." in model_id: + return model_id.split(".")[0] + return "amazon" # Default provider + + def _format_prompt_for_provider(self, provider: str, prompt: str, messages=None) -> Dict[str, Any]: + """Format the prompt according to the provider's requirements. + + Args: + provider: The provider name, e.g., "anthropic" + prompt: The prompt text + messages: Optional list of messages for chat models + + Returns: + A dictionary with the formatted prompt + """ + if provider == "anthropic": + # Format for Claude models + if messages: + # Format as a conversation + formatted_messages = [] + for msg in messages: + role = "user" if msg.get("role") == "user" else "assistant" + formatted_messages.append({ + "role": role, + "content": [{"type": "text", "text": msg.get("content", "")}] + }) + return { + "anthropic_version": "bedrock-2023-05-31", + "messages": formatted_messages, + "max_tokens": 4096 + } + else: + # Format as a single prompt + return { + "anthropic_version": "bedrock-2023-05-31", + "messages": [ + {"role": "user", "content": [{"type": "text", "text": prompt}]} + ], + "max_tokens": 4096 + } + elif provider == "amazon": + # Format for Amazon Titan models + return { + "inputText": prompt, + "textGenerationConfig": { + "maxTokenCount": 4096, + "stopSequences": [], + "temperature": 0.7, + "topP": 0.8 + } + } + elif provider == "cohere": + # Format for Cohere models + return { + "prompt": prompt, + "max_tokens": 4096, + "temperature": 0.7, + "p": 0.8 + } + elif provider == "ai21": + # Format for AI21 models + return { + "prompt": prompt, + "maxTokens": 4096, + "temperature": 0.7, + "topP": 0.8 + } + else: + # Default format + return {"prompt": prompt} + + def _extract_response_text(self, provider: str, response: Dict[str, Any]) -> str: + """Extract the generated text from the response. + + Args: + provider: The provider name, e.g., "anthropic" + response: The response from the Bedrock API + + Returns: + The generated text + """ + if provider == "anthropic": + return response.get("content", [{}])[0].get("text", "") + elif provider == "amazon": + return response.get("results", [{}])[0].get("outputText", "") + elif provider == "cohere": + return response.get("generations", [{}])[0].get("text", "") + elif provider == "ai21": + return response.get("completions", [{}])[0].get("data", {}).get("text", "") + else: + # Try to extract text from the response + if isinstance(response, dict): + for key in ["text", "content", "output", "completion"]: + if key in response: + return response[key] + return str(response) + + @backoff.on_exception( + backoff.expo, + (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError), + max_time=5, + ) + def call(self, api_kwargs: Dict = None, model_type: ModelType = None) -> Any: + """Make a synchronous call to the AWS Bedrock API.""" + api_kwargs = api_kwargs or {} + + # Check if client is initialized + if not self.sync_client: + error_msg = "AWS Bedrock client not initialized. Check your AWS credentials and region." + log.error(error_msg) + return error_msg + + if model_type == ModelType.LLM: + model_id = api_kwargs.get("model", "anthropic.claude-3-sonnet-20240229-v1:0") + provider = self._get_model_provider(model_id) + + # Get the prompt from api_kwargs + prompt = api_kwargs.get("input", "") + messages = api_kwargs.get("messages") + + # Format the prompt according to the provider + request_body = self._format_prompt_for_provider(provider, prompt, messages) + + # Add model parameters if provided + if "temperature" in api_kwargs: + if provider == "anthropic": + request_body["temperature"] = api_kwargs["temperature"] + elif provider == "amazon": + request_body["textGenerationConfig"]["temperature"] = api_kwargs["temperature"] + elif provider == "cohere": + request_body["temperature"] = api_kwargs["temperature"] + elif provider == "ai21": + request_body["temperature"] = api_kwargs["temperature"] + + if "top_p" in api_kwargs: + if provider == "anthropic": + request_body["top_p"] = api_kwargs["top_p"] + elif provider == "amazon": + request_body["textGenerationConfig"]["topP"] = api_kwargs["top_p"] + elif provider == "cohere": + request_body["p"] = api_kwargs["top_p"] + elif provider == "ai21": + request_body["topP"] = api_kwargs["top_p"] + + # Convert request body to JSON + body = json.dumps(request_body) + + try: + # Make the API call + response = self.sync_client.invoke_model( + modelId=model_id, + body=body + ) + + # Parse the response + response_body = json.loads(response["body"].read()) + + # Extract the generated text + generated_text = self._extract_response_text(provider, response_body) + + return generated_text + + except Exception as e: + log.error(f"Error calling AWS Bedrock API: {str(e)}") + return f"Error: {str(e)}" + else: + raise ValueError(f"Model type {model_type} is not supported by AWS Bedrock client") + + async def acall(self, api_kwargs: Dict = None, model_type: ModelType = None) -> Any: + """Make an asynchronous call to the AWS Bedrock API.""" + # For now, just call the sync method + # In a real implementation, you would use an async library or run the sync method in a thread pool + return self.call(api_kwargs, model_type) + + def convert_inputs_to_api_kwargs( + self, input: Any = None, model_kwargs: Dict = None, model_type: ModelType = None + ) -> Dict: + """Convert inputs to API kwargs for AWS Bedrock.""" + model_kwargs = model_kwargs or {} + api_kwargs = {} + + if model_type == ModelType.LLM: + api_kwargs["model"] = model_kwargs.get("model", "anthropic.claude-3-sonnet-20240229-v1:0") + api_kwargs["input"] = input + + # Add model parameters + if "temperature" in model_kwargs: + api_kwargs["temperature"] = model_kwargs["temperature"] + if "top_p" in model_kwargs: + api_kwargs["top_p"] = model_kwargs["top_p"] + + return api_kwargs + else: + raise ValueError(f"Model type {model_type} is not supported by AWS Bedrock client") diff --git a/reference-deepwiki/api/config.py b/reference-deepwiki/api/config.py new file mode 100644 index 0000000..3650f48 --- /dev/null +++ b/reference-deepwiki/api/config.py @@ -0,0 +1,387 @@ +import os +import json +import logging +import re +from pathlib import Path +from typing import List, Union, Dict, Any + +logger = logging.getLogger(__name__) + +from api.openai_client import OpenAIClient +from api.openrouter_client import OpenRouterClient +from api.bedrock_client import BedrockClient +from api.google_embedder_client import GoogleEmbedderClient +from api.azureai_client import AzureAIClient +from api.dashscope_client import DashscopeClient +from adalflow import GoogleGenAIClient, OllamaClient + +# Get API keys from environment variables +OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY') +GOOGLE_API_KEY = os.environ.get('GOOGLE_API_KEY') +OPENROUTER_API_KEY = os.environ.get('OPENROUTER_API_KEY') +AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') +AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') +AWS_REGION = os.environ.get('AWS_REGION') +AWS_ROLE_ARN = os.environ.get('AWS_ROLE_ARN') + +# Set keys in environment (in case they're needed elsewhere in the code) +if OPENAI_API_KEY: + os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY +if GOOGLE_API_KEY: + os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY +if OPENROUTER_API_KEY: + os.environ["OPENROUTER_API_KEY"] = OPENROUTER_API_KEY +if AWS_ACCESS_KEY_ID: + os.environ["AWS_ACCESS_KEY_ID"] = AWS_ACCESS_KEY_ID +if AWS_SECRET_ACCESS_KEY: + os.environ["AWS_SECRET_ACCESS_KEY"] = AWS_SECRET_ACCESS_KEY +if AWS_REGION: + os.environ["AWS_REGION"] = AWS_REGION +if AWS_ROLE_ARN: + os.environ["AWS_ROLE_ARN"] = AWS_ROLE_ARN + +# Wiki authentication settings +raw_auth_mode = os.environ.get('DEEPWIKI_AUTH_MODE', 'False') +WIKI_AUTH_MODE = raw_auth_mode.lower() in ['true', '1', 't'] +WIKI_AUTH_CODE = os.environ.get('DEEPWIKI_AUTH_CODE', '') + +# Embedder settings +EMBEDDER_TYPE = os.environ.get('DEEPWIKI_EMBEDDER_TYPE', 'openai').lower() + +# Get configuration directory from environment variable, or use default if not set +CONFIG_DIR = os.environ.get('DEEPWIKI_CONFIG_DIR', None) + +# Client class mapping +CLIENT_CLASSES = { + "GoogleGenAIClient": GoogleGenAIClient, + "GoogleEmbedderClient": GoogleEmbedderClient, + "OpenAIClient": OpenAIClient, + "OpenRouterClient": OpenRouterClient, + "OllamaClient": OllamaClient, + "BedrockClient": BedrockClient, + "AzureAIClient": AzureAIClient, + "DashscopeClient": DashscopeClient +} + +def replace_env_placeholders(config: Union[Dict[str, Any], List[Any], str, Any]) -> Union[Dict[str, Any], List[Any], str, Any]: + """ + Recursively replace placeholders like "${ENV_VAR}" in string values + within a nested configuration structure (dicts, lists, strings) + with environment variable values. Logs a warning if a placeholder is not found. + """ + pattern = re.compile(r"\$\{([A-Z0-9_]+)\}") + + def replacer(match: re.Match[str]) -> str: + env_var_name = match.group(1) + original_placeholder = match.group(0) + env_var_value = os.environ.get(env_var_name) + if env_var_value is None: + logger.warning( + f"Environment variable placeholder '{original_placeholder}' was not found in the environment. " + f"The placeholder string will be used as is." + ) + return original_placeholder + return env_var_value + + if isinstance(config, dict): + return {k: replace_env_placeholders(v) for k, v in config.items()} + elif isinstance(config, list): + return [replace_env_placeholders(item) for item in config] + elif isinstance(config, str): + return pattern.sub(replacer, config) + else: + # Handles numbers, booleans, None, etc. + return config + +# Load JSON configuration file +def load_json_config(filename): + try: + # If environment variable is set, use the directory specified by it + if CONFIG_DIR: + config_path = Path(CONFIG_DIR) / filename + else: + # Otherwise use default directory + config_path = Path(__file__).parent / "config" / filename + + logger.info(f"Loading configuration from {config_path}") + + if not config_path.exists(): + logger.warning(f"Configuration file {config_path} does not exist") + return {} + + with open(config_path, 'r', encoding='utf-8') as f: + config = json.load(f) + config = replace_env_placeholders(config) + return config + except Exception as e: + logger.error(f"Error loading configuration file {filename}: {str(e)}") + return {} + +# Load generator model configuration +def load_generator_config(): + generator_config = load_json_config("generator.json") + + # Add client classes to each provider + if "providers" in generator_config: + for provider_id, provider_config in generator_config["providers"].items(): + # Try to set client class from client_class + if provider_config.get("client_class") in CLIENT_CLASSES: + provider_config["model_client"] = CLIENT_CLASSES[provider_config["client_class"]] + # Fall back to default mapping based on provider_id + elif provider_id in ["google", "openai", "openrouter", "ollama", "bedrock", "azure", "dashscope"]: + default_map = { + "google": GoogleGenAIClient, + "openai": OpenAIClient, + "openrouter": OpenRouterClient, + "ollama": OllamaClient, + "bedrock": BedrockClient, + "azure": AzureAIClient, + "dashscope": DashscopeClient + } + provider_config["model_client"] = default_map[provider_id] + else: + logger.warning(f"Unknown provider or client class: {provider_id}") + + return generator_config + +# Load embedder configuration +def load_embedder_config(): + embedder_config = load_json_config("embedder.json") + + # Process client classes + for key in ["embedder", "embedder_ollama", "embedder_google"]: + if key in embedder_config and "client_class" in embedder_config[key]: + class_name = embedder_config[key]["client_class"] + if class_name in CLIENT_CLASSES: + embedder_config[key]["model_client"] = CLIENT_CLASSES[class_name] + + return embedder_config + +def get_embedder_config(): + """ + Get the current embedder configuration based on DEEPWIKI_EMBEDDER_TYPE. + + Returns: + dict: The embedder configuration with model_client resolved + """ + embedder_type = EMBEDDER_TYPE + if embedder_type == 'google' and 'embedder_google' in configs: + return configs.get("embedder_google", {}) + elif embedder_type == 'ollama' and 'embedder_ollama' in configs: + return configs.get("embedder_ollama", {}) + else: + return configs.get("embedder", {}) + +def is_ollama_embedder(): + """ + Check if the current embedder configuration uses OllamaClient. + + Returns: + bool: True if using OllamaClient, False otherwise + """ + embedder_config = get_embedder_config() + if not embedder_config: + return False + + # Check if model_client is OllamaClient + model_client = embedder_config.get("model_client") + if model_client: + return model_client.__name__ == "OllamaClient" + + # Fallback: check client_class string + client_class = embedder_config.get("client_class", "") + return client_class == "OllamaClient" + +def is_google_embedder(): + """ + Check if the current embedder configuration uses GoogleEmbedderClient. + + Returns: + bool: True if using GoogleEmbedderClient, False otherwise + """ + embedder_config = get_embedder_config() + if not embedder_config: + return False + + # Check if model_client is GoogleEmbedderClient + model_client = embedder_config.get("model_client") + if model_client: + return model_client.__name__ == "GoogleEmbedderClient" + + # Fallback: check client_class string + client_class = embedder_config.get("client_class", "") + return client_class == "GoogleEmbedderClient" + +def get_embedder_type(): + """ + Get the current embedder type based on configuration. + + Returns: + str: 'ollama', 'google', or 'openai' (default) + """ + if is_ollama_embedder(): + return 'ollama' + elif is_google_embedder(): + return 'google' + else: + return 'openai' + +# Load repository and file filters configuration +def load_repo_config(): + return load_json_config("repo.json") + +# Load language configuration +def load_lang_config(): + default_config = { + "supported_languages": { + "en": "English", + "ja": "Japanese (日本語)", + "zh": "Mandarin Chinese (中文)", + "zh-tw": "Traditional Chinese (繁體中文)", + "es": "Spanish (Español)", + "kr": "Korean (한국어)", + "vi": "Vietnamese (Tiếng Việt)", + "pt-br": "Brazilian Portuguese (Português Brasileiro)", + "fr": "Français (French)", + "ru": "Русский (Russian)" + }, + "default": "en" + } + + loaded_config = load_json_config("lang.json") # Let load_json_config handle path and loading + + if not loaded_config: + return default_config + + if "supported_languages" not in loaded_config or "default" not in loaded_config: + logger.warning("Language configuration file 'lang.json' is malformed. Using default language configuration.") + return default_config + + return loaded_config + +# Default excluded directories and files +DEFAULT_EXCLUDED_DIRS: List[str] = [ + # Virtual environments and package managers + "./.venv/", "./venv/", "./env/", "./virtualenv/", + "./node_modules/", "./bower_components/", "./jspm_packages/", + # Version control + "./.git/", "./.svn/", "./.hg/", "./.bzr/", + # Cache and compiled files + "./__pycache__/", "./.pytest_cache/", "./.mypy_cache/", "./.ruff_cache/", "./.coverage/", + # Build and distribution + "./dist/", "./build/", "./out/", "./target/", "./bin/", "./obj/", + # Documentation + "./docs/", "./_docs/", "./site-docs/", "./_site/", + # IDE specific + "./.idea/", "./.vscode/", "./.vs/", "./.eclipse/", "./.settings/", + # Logs and temporary files + "./logs/", "./log/", "./tmp/", "./temp/", +] + +DEFAULT_EXCLUDED_FILES: List[str] = [ + "yarn.lock", "pnpm-lock.yaml", "npm-shrinkwrap.json", "poetry.lock", + "Pipfile.lock", "requirements.txt.lock", "Cargo.lock", "composer.lock", + ".lock", ".DS_Store", "Thumbs.db", "desktop.ini", "*.lnk", ".env", + ".env.*", "*.env", "*.cfg", "*.ini", ".flaskenv", ".gitignore", + ".gitattributes", ".gitmodules", ".github", ".gitlab-ci.yml", + ".prettierrc", ".eslintrc", ".eslintignore", ".stylelintrc", + ".editorconfig", ".jshintrc", ".pylintrc", ".flake8", "mypy.ini", + "pyproject.toml", "tsconfig.json", "webpack.config.js", "babel.config.js", + "rollup.config.js", "jest.config.js", "karma.conf.js", "vite.config.js", + "next.config.js", "*.min.js", "*.min.css", "*.bundle.js", "*.bundle.css", + "*.map", "*.gz", "*.zip", "*.tar", "*.tgz", "*.rar", "*.7z", "*.iso", + "*.dmg", "*.img", "*.msix", "*.appx", "*.appxbundle", "*.xap", "*.ipa", + "*.deb", "*.rpm", "*.msi", "*.exe", "*.dll", "*.so", "*.dylib", "*.o", + "*.obj", "*.jar", "*.war", "*.ear", "*.jsm", "*.class", "*.pyc", "*.pyd", + "*.pyo", "__pycache__", "*.a", "*.lib", "*.lo", "*.la", "*.slo", "*.dSYM", + "*.egg", "*.egg-info", "*.dist-info", "*.eggs", "node_modules", + "bower_components", "jspm_packages", "lib-cov", "coverage", "htmlcov", + ".nyc_output", ".tox", "dist", "build", "bld", "out", "bin", "target", + "packages/*/dist", "packages/*/build", ".output" +] + +# Initialize empty configuration +configs = {} + +# Load all configuration files +generator_config = load_generator_config() +embedder_config = load_embedder_config() +repo_config = load_repo_config() +lang_config = load_lang_config() + +# Update configuration +if generator_config: + configs["default_provider"] = generator_config.get("default_provider", "google") + configs["providers"] = generator_config.get("providers", {}) + +# Update embedder configuration +if embedder_config: + for key in ["embedder", "embedder_ollama", "embedder_google", "retriever", "text_splitter"]: + if key in embedder_config: + configs[key] = embedder_config[key] + +# Update repository configuration +if repo_config: + for key in ["file_filters", "repository"]: + if key in repo_config: + configs[key] = repo_config[key] + +# Update language configuration +if lang_config: + configs["lang_config"] = lang_config + + +def get_model_config(provider="google", model=None): + """ + Get configuration for the specified provider and model + + Parameters: + provider (str): Model provider ('google', 'openai', 'openrouter', 'ollama', 'bedrock') + model (str): Model name, or None to use default model + + Returns: + dict: Configuration containing model_client, model and other parameters + """ + # Get provider configuration + if "providers" not in configs: + raise ValueError("Provider configuration not loaded") + + provider_config = configs["providers"].get(provider) + if not provider_config: + raise ValueError(f"Configuration for provider '{provider}' not found") + + model_client = provider_config.get("model_client") + if not model_client: + raise ValueError(f"Model client not specified for provider '{provider}'") + + # If model not provided, use default model for the provider + if not model: + model = provider_config.get("default_model") + if not model: + raise ValueError(f"No default model specified for provider '{provider}'") + + # Get model parameters (if present) + model_params = {} + if model in provider_config.get("models", {}): + model_params = provider_config["models"][model] + else: + default_model = provider_config.get("default_model") + model_params = provider_config["models"][default_model] + + # Prepare base configuration + result = { + "model_client": model_client, + } + + # Provider-specific adjustments + if provider == "ollama": + # Ollama uses a slightly different parameter structure + if "options" in model_params: + result["model_kwargs"] = {"model": model, **model_params["options"]} + else: + result["model_kwargs"] = {"model": model} + else: + # Standard structure for other providers + result["model_kwargs"] = {"model": model, **model_params} + + return result diff --git a/reference-deepwiki/api/config/embedder.json b/reference-deepwiki/api/config/embedder.json new file mode 100644 index 0000000..f0ab52d --- /dev/null +++ b/reference-deepwiki/api/config/embedder.json @@ -0,0 +1,33 @@ +{ + "embedder": { + "client_class": "OpenAIClient", + "batch_size": 500, + "model_kwargs": { + "model": "text-embedding-3-small", + "dimensions": 256, + "encoding_format": "float" + } + }, + "embedder_ollama": { + "client_class": "OllamaClient", + "model_kwargs": { + "model": "nomic-embed-text" + } + }, + "embedder_google": { + "client_class": "GoogleEmbedderClient", + "batch_size": 100, + "model_kwargs": { + "model": "text-embedding-004", + "task_type": "SEMANTIC_SIMILARITY" + } + }, + "retriever": { + "top_k": 20 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 350, + "chunk_overlap": 100 + } +} diff --git a/reference-deepwiki/api/config/embedder.json.bak b/reference-deepwiki/api/config/embedder.json.bak new file mode 100644 index 0000000..a70bdb4 --- /dev/null +++ b/reference-deepwiki/api/config/embedder.json.bak @@ -0,0 +1,19 @@ +{ + "embedder": { + "client_class": "OpenAIClient", + "batch_size": 500, + "model_kwargs": { + "model": "text-embedding-3-small", + "dimensions": 256, + "encoding_format": "float" + } + }, + "retriever": { + "top_k": 20 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 350, + "chunk_overlap": 100 + } +} diff --git a/reference-deepwiki/api/config/embedder.ollama.json.bak b/reference-deepwiki/api/config/embedder.ollama.json.bak new file mode 100644 index 0000000..9d31649 --- /dev/null +++ b/reference-deepwiki/api/config/embedder.ollama.json.bak @@ -0,0 +1,16 @@ +{ + "embedder": { + "client_class": "OllamaClient", + "model_kwargs": { + "model": "nomic-embed-text" + } + }, + "retriever": { + "top_k": 20 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 350, + "chunk_overlap": 100 + } +} diff --git a/reference-deepwiki/api/config/embedder.openai_compatible.json.bak b/reference-deepwiki/api/config/embedder.openai_compatible.json.bak new file mode 100644 index 0000000..dfcfcda --- /dev/null +++ b/reference-deepwiki/api/config/embedder.openai_compatible.json.bak @@ -0,0 +1,29 @@ +{ + "embedder": { + "client_class": "OpenAIClient", + "initialize_kwargs": { + "api_key": "${OPENAI_API_KEY}", + "base_url": "${OPENAI_BASE_URL}" + }, + "batch_size": 10, + "model_kwargs": { + "model": "text-embedding-v3", + "dimensions": 256, + "encoding_format": "float" + } + }, + "embedder_ollama": { + "client_class": "OllamaClient", + "model_kwargs": { + "model": "nomic-embed-text" + } + }, + "retriever": { + "top_k": 20 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 350, + "chunk_overlap": 100 + } +} diff --git a/reference-deepwiki/api/config/generator.json b/reference-deepwiki/api/config/generator.json new file mode 100644 index 0000000..f881790 --- /dev/null +++ b/reference-deepwiki/api/config/generator.json @@ -0,0 +1,199 @@ +{ + "default_provider": "google", + "providers": { + "dashscope": { + "default_model": "qwen-plus", + "supportsCustomModel": true, + "models": { + "qwen-plus": { + "temperature": 0.7, + "top_p": 0.8 + }, + "qwen-turbo": { + "temperature": 0.7, + "top_p": 0.8 + }, + "deepseek-r1": { + "temperature": 0.7, + "top_p": 0.8 + } + } + }, + "google": { + "default_model": "gemini-2.5-flash", + "supportsCustomModel": true, + "models": { + "gemini-2.5-flash": { + "temperature": 1.0, + "top_p": 0.8, + "top_k": 20 + }, + "gemini-2.5-flash-lite": { + "temperature": 1.0, + "top_p": 0.8, + "top_k": 20 + }, + "gemini-2.5-pro": { + "temperature": 1.0, + "top_p": 0.8, + "top_k": 20 + } + } + }, + "openai": { + "default_model": "gpt-5-nano", + "supportsCustomModel": true, + "models": { + "gpt-5": { + "temperature": 1.0 + }, + "gpt-5-nano": { + "temperature": 1.0 + }, + "gpt-5-mini": { + "temperature": 1.0 + }, + "gpt-4o": { + "temperature": 0.7, + "top_p": 0.8 + }, + "gpt-4.1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "o1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "o3": { + "temperature": 1.0 + }, + "o4-mini": { + "temperature": 1.0 + } + } + }, + "openrouter": { + "default_model": "openai/gpt-5-nano", + "supportsCustomModel": true, + "models": { + "openai/gpt-5-nano": { + "temperature": 0.7, + "top_p": 0.8 + }, + "openai/gpt-4o": { + "temperature": 0.7, + "top_p": 0.8 + }, + "deepseek/deepseek-r1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "openai/gpt-4.1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "openai/o1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "openai/o3": { + "temperature": 1.0 + }, + "openai/o4-mini": { + "temperature": 1.0 + }, + "anthropic/claude-3.7-sonnet": { + "temperature": 0.7, + "top_p": 0.8 + }, + "anthropic/claude-3.5-sonnet": { + "temperature": 0.7, + "top_p": 0.8 + } + } + }, + "ollama": { + "default_model": "qwen3:1.7b", + "supportsCustomModel": true, + "models": { + "qwen3:1.7b": { + "options": { + "temperature": 0.7, + "top_p": 0.8, + "num_ctx": 32000 + } + }, + "llama3:8b": { + "options": { + "temperature": 0.7, + "top_p": 0.8, + "num_ctx": 8000 + } + }, + "qwen3:8b": { + "options": { + "temperature": 0.7, + "top_p": 0.8, + "num_ctx": 32000 + } + } + } + }, + "bedrock": { + "client_class": "BedrockClient", + "default_model": "anthropic.claude-3-sonnet-20240229-v1:0", + "supportsCustomModel": true, + "models": { + "anthropic.claude-3-sonnet-20240229-v1:0": { + "temperature": 0.7, + "top_p": 0.8 + }, + "anthropic.claude-3-haiku-20240307-v1:0": { + "temperature": 0.7, + "top_p": 0.8 + }, + "anthropic.claude-3-opus-20240229-v1:0": { + "temperature": 0.7, + "top_p": 0.8 + }, + "amazon.titan-text-express-v1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "cohere.command-r-v1:0": { + "temperature": 0.7, + "top_p": 0.8 + }, + "ai21.j2-ultra-v1": { + "temperature": 0.7, + "top_p": 0.8 + } + } + }, + "azure": { + "client_class": "AzureAIClient", + "default_model": "gpt-4o", + "supportsCustomModel": true, + "models": { + "gpt-4o": { + "temperature": 0.7, + "top_p": 0.8 + }, + "gpt-4": { + "temperature": 0.7, + "top_p": 0.8 + }, + "gpt-35-turbo": { + "temperature": 0.7, + "top_p": 0.8 + }, + "gpt-4-turbo": { + "temperature": 0.7, + "top_p": 0.8 + } + } + } + } +} + diff --git a/reference-deepwiki/api/config/lang.json b/reference-deepwiki/api/config/lang.json new file mode 100644 index 0000000..ca25771 --- /dev/null +++ b/reference-deepwiki/api/config/lang.json @@ -0,0 +1,15 @@ +{ + "supported_languages": { + "en": "English", + "ja": "Japanese (日本語)", + "zh": "Mandarin Chinese (中文)", + "zh-tw": "Traditional Chinese (繁體中文)", + "es": "Spanish (Español)", + "kr": "Korean (한국어)", + "vi": "Vietnamese (Tiếng Việt)", + "pt-br": "Brazilian Portuguese (Português Brasileiro)", + "fr": "Français (French)", + "ru": "Русский (Russian)" + }, + "default": "en" +} diff --git a/reference-deepwiki/api/config/repo.json b/reference-deepwiki/api/config/repo.json new file mode 100644 index 0000000..52c3150 --- /dev/null +++ b/reference-deepwiki/api/config/repo.json @@ -0,0 +1,128 @@ +{ + "file_filters": { + "excluded_dirs": [ + "./.venv/", + "./venv/", + "./env/", + "./virtualenv/", + "./node_modules/", + "./bower_components/", + "./jspm_packages/", + "./.git/", + "./.svn/", + "./.hg/", + "./.bzr/" + ], + "excluded_files": [ + "yarn.lock", + "pnpm-lock.yaml", + "npm-shrinkwrap.json", + "poetry.lock", + "Pipfile.lock", + "requirements.txt.lock", + "Cargo.lock", + "composer.lock", + ".lock", + ".DS_Store", + "Thumbs.db", + "desktop.ini", + "*.lnk", + ".env", + ".env.*", + "*.env", + "*.cfg", + "*.ini", + ".flaskenv", + ".gitignore", + ".gitattributes", + ".gitmodules", + ".github", + ".gitlab-ci.yml", + ".prettierrc", + ".eslintrc", + ".eslintignore", + ".stylelintrc", + ".editorconfig", + ".jshintrc", + ".pylintrc", + ".flake8", + "mypy.ini", + "pyproject.toml", + "tsconfig.json", + "webpack.config.js", + "babel.config.js", + "rollup.config.js", + "jest.config.js", + "karma.conf.js", + "vite.config.js", + "next.config.js", + "*.min.js", + "*.min.css", + "*.bundle.js", + "*.bundle.css", + "*.map", + "*.gz", + "*.zip", + "*.tar", + "*.tgz", + "*.rar", + "*.7z", + "*.iso", + "*.dmg", + "*.img", + "*.msix", + "*.appx", + "*.appxbundle", + "*.xap", + "*.ipa", + "*.deb", + "*.rpm", + "*.msi", + "*.exe", + "*.dll", + "*.so", + "*.dylib", + "*.o", + "*.obj", + "*.jar", + "*.war", + "*.ear", + "*.jsm", + "*.class", + "*.pyc", + "*.pyd", + "*.pyo", + "__pycache__", + "*.a", + "*.lib", + "*.lo", + "*.la", + "*.slo", + "*.dSYM", + "*.egg", + "*.egg-info", + "*.dist-info", + "*.eggs", + "node_modules", + "bower_components", + "jspm_packages", + "lib-cov", + "coverage", + "htmlcov", + ".nyc_output", + ".tox", + "dist", + "build", + "bld", + "out", + "bin", + "target", + "packages/*/dist", + "packages/*/build", + ".output" + ] + }, + "repository": { + "max_size_mb": 50000 + } +} diff --git a/reference-deepwiki/api/dashscope_client.py b/reference-deepwiki/api/dashscope_client.py new file mode 100644 index 0000000..c727954 --- /dev/null +++ b/reference-deepwiki/api/dashscope_client.py @@ -0,0 +1,914 @@ +"""Dashscope (Alibaba Cloud) ModelClient integration.""" + +import os +import pickle +from typing import ( + Dict, + Optional, + Any, + Callable, + Generator, + Union, + Literal, + List, + Sequence, +) + +import logging +import backoff +from copy import deepcopy +from tqdm import tqdm + +# optional import +from adalflow.utils.lazy_import import safe_import, OptionalPackages + +openai = safe_import(OptionalPackages.OPENAI.value[0], OptionalPackages.OPENAI.value[1]) + +from openai import OpenAI, AsyncOpenAI, Stream +from openai import ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, +) +from openai.types import ( + Completion, + CreateEmbeddingResponse, +) +from openai.types.chat import ChatCompletionChunk, ChatCompletion + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ( + ModelType, + EmbedderOutput, + CompletionUsage, + GeneratorOutput, + Document, + Embedding, + EmbedderOutputType, + EmbedderInputType, +) +from adalflow.core.component import DataComponent +from adalflow.core.embedder import ( + BatchEmbedderOutputType, + BatchEmbedderInputType, +) +import adalflow.core.functional as F +from adalflow.components.model_client.utils import parse_embedding_response + +from api.logging_config import setup_logging + +# # Disable tqdm progress bars +# os.environ["TQDM_DISABLE"] = "1" + +setup_logging() +log = logging.getLogger(__name__) + +def get_first_message_content(completion: ChatCompletion) -> str: + """When we only need the content of the first message.""" + log.info(f"🔍 get_first_message_content called with: {type(completion)}") + log.debug(f"raw completion: {completion}") + + try: + if hasattr(completion, 'choices') and len(completion.choices) > 0: + choice = completion.choices[0] + if hasattr(choice, 'message') and hasattr(choice.message, 'content'): + content = choice.message.content + log.info(f"✅ Successfully extracted content: {type(content)}, length: {len(content) if content else 0}") + return content + else: + log.error("❌ Choice doesn't have message.content") + return str(completion) + else: + log.error("❌ Completion doesn't have choices") + return str(completion) + except Exception as e: + log.error(f"❌ Error in get_first_message_content: {e}") + return str(completion) + + +def parse_stream_response(completion: ChatCompletionChunk) -> str: + """Parse the response of the stream API.""" + return completion.choices[0].delta.content + + +def handle_streaming_response(generator: Stream[ChatCompletionChunk]): + """Handle the streaming response.""" + for completion in generator: + log.debug(f"Raw chunk completion: {completion}") + parsed_content = parse_stream_response(completion) + yield parsed_content + + +class DashscopeClient(ModelClient): + """A component wrapper for the Dashscope (Alibaba Cloud) API client. + + Dashscope provides access to Alibaba Cloud's Qwen and other models through an OpenAI-compatible API. + + Args: + api_key (Optional[str], optional): Dashscope API key. Defaults to None. + workspace_id (Optional[str], optional): Dashscope workspace ID. Defaults to None. + base_url (str): The API base URL. Defaults to "https://dashscope.aliyuncs.com/compatible-mode/v1". + env_api_key_name (str): Environment variable name for the API key. Defaults to "DASHSCOPE_API_KEY". + env_workspace_id_name (str): Environment variable name for the workspace ID. Defaults to "DASHSCOPE_WORKSPACE_ID". + + References: + - Dashscope API Documentation: https://help.aliyun.com/zh/dashscope/ + """ + + def __init__( + self, + api_key: Optional[str] = None, + workspace_id: Optional[str] = None, + chat_completion_parser: Callable[[Completion], Any] = None, + input_type: Literal["text", "messages"] = "text", + base_url: Optional[str] = None, + env_base_url_name: str = "DASHSCOPE_BASE_URL", + env_api_key_name: str = "DASHSCOPE_API_KEY", + env_workspace_id_name: str = "DASHSCOPE_WORKSPACE_ID", + ): + super().__init__() + self._api_key = api_key + self._workspace_id = workspace_id + self._env_api_key_name = env_api_key_name + self._env_workspace_id_name = env_workspace_id_name + self._env_base_url_name = env_base_url_name + self.base_url = base_url or os.getenv(self._env_base_url_name, "https://dashscope.aliyuncs.com/compatible-mode/v1") + self.sync_client = self.init_sync_client() + self.async_client = None + + # Force use of get_first_message_content to ensure string output + self.chat_completion_parser = get_first_message_content + self._input_type = input_type + self._api_kwargs = {} + + def _prepare_client_config(self): + """ + Private helper method to prepare client configuration. + + Returns: + tuple: (api_key, workspace_id, base_url) for client initialization + + Raises: + ValueError: If API key is not provided + """ + api_key = self._api_key or os.getenv(self._env_api_key_name) + workspace_id = self._workspace_id or os.getenv(self._env_workspace_id_name) + + if not api_key: + raise ValueError( + f"Environment variable {self._env_api_key_name} must be set" + ) + + if not workspace_id: + log.warning(f"Environment variable {self._env_workspace_id_name} not set. Some features may not work properly.") + + # For Dashscope, we need to include the workspace ID in the base URL if provided + base_url = self.base_url + if workspace_id: + # Add workspace ID to headers or URL as required by Dashscope + base_url = f"{self.base_url.rstrip('/')}" + + return api_key, workspace_id, base_url + + def init_sync_client(self): + api_key, workspace_id, base_url = self._prepare_client_config() + + client = OpenAI(api_key=api_key, base_url=base_url) + + # Store workspace_id for later use in requests + if workspace_id: + client._workspace_id = workspace_id + + return client + + def init_async_client(self): + api_key, workspace_id, base_url = self._prepare_client_config() + + client = AsyncOpenAI(api_key=api_key, base_url=base_url) + + # Store workspace_id for later use in requests + if workspace_id: + client._workspace_id = workspace_id + + return client + + def parse_chat_completion( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> "GeneratorOutput": + """Parse the completion response to a GeneratorOutput.""" + try: + # If the completion is already a GeneratorOutput, return it directly (prevent recursion) + if isinstance(completion, GeneratorOutput): + return completion + + # Check if it's a ChatCompletion object (non-streaming response) + if hasattr(completion, 'choices') and hasattr(completion, 'usage'): + # ALWAYS extract the string content directly + try: + # Direct extraction of message content + if (hasattr(completion, 'choices') and + len(completion.choices) > 0 and + hasattr(completion.choices[0], 'message') and + hasattr(completion.choices[0].message, 'content')): + + content = completion.choices[0].message.content + if isinstance(content, str): + parsed_data = content + else: + parsed_data = str(content) + else: + # Fallback: convert entire completion to string + parsed_data = str(completion) + + except Exception as e: + # Ultimate fallback + parsed_data = str(completion) + + return GeneratorOutput( + data=parsed_data, + usage=CompletionUsage( + completion_tokens=completion.usage.completion_tokens, + prompt_tokens=completion.usage.prompt_tokens, + total_tokens=completion.usage.total_tokens, + ), + raw_response=str(completion), + ) + else: + # Handle streaming response - collect all content parts into a single string + content_parts = [] + usage_info = None + for chunk in completion: + if chunk.choices[0].delta.content: + content_parts.append(chunk.choices[0].delta.content) + # Try to get usage info from the last chunk + if hasattr(chunk, 'usage') and chunk.usage: + usage_info = chunk.usage + + # Join all content parts into a single string + full_content = ''.join(content_parts) + + # Create usage object + usage = None + if usage_info: + usage = CompletionUsage( + completion_tokens=usage_info.completion_tokens, + prompt_tokens=usage_info.prompt_tokens, + total_tokens=usage_info.total_tokens, + ) + + return GeneratorOutput( + data=full_content, + usage=usage, + raw_response="streaming" + ) + except Exception as e: + log.error(f"Error parsing completion: {e}") + raise + + def track_completion_usage( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> CompletionUsage: + """Track the completion usage.""" + if isinstance(completion, ChatCompletion): + return CompletionUsage( + completion_tokens=completion.usage.completion_tokens, + prompt_tokens=completion.usage.prompt_tokens, + total_tokens=completion.usage.total_tokens, + ) + else: + # For streaming, we can't track usage accurately + return CompletionUsage(completion_tokens=0, prompt_tokens=0, total_tokens=0) + + def parse_embedding_response( + self, response: CreateEmbeddingResponse + ) -> EmbedderOutput: + """Parse the embedding response to a EmbedderOutput.""" + # Add detailed debugging + try: + result = parse_embedding_response(response) + if result.data: + log.info(f"🔍 Number of embeddings: {len(result.data)}") + if len(result.data) > 0: + log.info(f"🔍 First embedding length: {len(result.data[0].embedding) if hasattr(result.data[0], 'embedding') else 'N/A'}") + else: + log.warning(f"🔍 No embedding data found in result") + return result + except Exception as e: + log.error(f"🔍 Error parsing DashScope embedding response: {e}") + log.error(f"🔍 Raw response details: {repr(response)}") + return EmbedderOutput(data=[], error=str(e), raw_response=response) + + def convert_inputs_to_api_kwargs( + self, + input: Optional[Any] = None, + model_kwargs: Dict = {}, + model_type: ModelType = ModelType.UNDEFINED, + ) -> Dict: + """Convert inputs to API kwargs.""" + final_model_kwargs = model_kwargs.copy() + + if model_type == ModelType.LLM: + messages = [] + if isinstance(input, str): + messages = [{"role": "user", "content": input}] + elif isinstance(input, list): + messages = input + else: + raise ValueError(f"Unsupported input type: {type(input)}") + + api_kwargs = { + "messages": messages, + **final_model_kwargs + } + + # Add workspace ID to headers if available + workspace_id = getattr(self.sync_client, '_workspace_id', None) or getattr(self.async_client, '_workspace_id', None) + if workspace_id: + # Dashscope may require workspace ID in headers + if 'extra_headers' not in api_kwargs: + api_kwargs['extra_headers'] = {} + api_kwargs['extra_headers']['X-DashScope-WorkSpace'] = workspace_id + + return api_kwargs + + elif model_type == ModelType.EMBEDDER: + # Convert Documents to text strings for embedding + processed_input = input + if isinstance(input, list): + # Extract text from Document objects + processed_input = [] + for item in input: + if hasattr(item, 'text'): + # It's a Document object, extract text + processed_input.append(item.text) + elif isinstance(item, str): + # It's already a string + processed_input.append(item) + else: + # Try to convert to string + processed_input.append(str(item)) + elif hasattr(input, 'text'): + # Single Document object + processed_input = input.text + elif isinstance(input, str): + # Single string + processed_input = input + else: + # Convert to string as fallback + processed_input = str(input) + + api_kwargs = { + "input": processed_input, + **final_model_kwargs + } + + # Add workspace ID to headers if available + workspace_id = getattr(self.sync_client, '_workspace_id', None) or getattr(self.async_client, '_workspace_id', None) + if workspace_id: + if 'extra_headers' not in api_kwargs: + api_kwargs['extra_headers'] = {} + api_kwargs['extra_headers']['X-DashScope-WorkSpace'] = workspace_id + + return api_kwargs + else: + raise ValueError(f"model_type {model_type} is not supported") + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """Call the Dashscope API.""" + if model_type == ModelType.LLM: + if not api_kwargs.get("stream", False): + # For non-streaming, enable_thinking must be false. + # Pass it via extra_body to avoid TypeError from openai client validation. + extra_body = api_kwargs.get("extra_body", {}) + extra_body["enable_thinking"] = False + api_kwargs["extra_body"] = extra_body + + completion = self.sync_client.chat.completions.create(**api_kwargs) + + if api_kwargs.get("stream", False): + return handle_streaming_response(completion) + else: + return self.parse_chat_completion(completion) + elif model_type == ModelType.EMBEDDER: + # Extract input texts from api_kwargs + texts = api_kwargs.get("input", []) + + if not texts: + log.warning("😭 No input texts provided") + return EmbedderOutput(data=[], error="No input texts provided", raw_response=None) + + # Ensure texts is a list + if isinstance(texts, str): + texts = [texts] + + # Filter out empty or None texts - following HuggingFace client pattern + valid_texts = [] + valid_indices = [] + for i, text in enumerate(texts): + if text and isinstance(text, str) and text.strip(): + valid_texts.append(text) + valid_indices.append(i) + else: + log.warning(f"🔍 Skipping empty or invalid text at index {i}: type={type(text)}, length={len(text) if hasattr(text, '__len__') else 'N/A'}, repr={repr(text)[:100]}") + + if not valid_texts: + log.error("😭 No valid texts found after filtering") + return EmbedderOutput(data=[], error="No valid texts found after filtering", raw_response=None) + + if len(valid_texts) != len(texts): + filtered_count = len(texts) - len(valid_texts) + log.warning(f"🔍 Filtered out {filtered_count} empty/invalid texts out of {len(texts)} total texts") + + # Create modified api_kwargs with only valid texts + filtered_api_kwargs = api_kwargs.copy() + filtered_api_kwargs["input"] = valid_texts + + log.info(f"🔍 DashScope embedding API call with {len(valid_texts)} valid texts out of {len(texts)} total") + + try: + response = self.sync_client.embeddings.create(**filtered_api_kwargs) + log.info(f"🔍 DashScope API call successful, response type: {type(response)}") + result = self.parse_embedding_response(response) + + # If we filtered texts, we need to create embeddings for the original indices + if len(valid_texts) != len(texts): + log.info(f"🔍 Creating embeddings for {len(texts)} original positions") + + # Get the correct embedding dimension from the first valid embedding + embedding_dim = None # Must be determined from a successful response + if result.data and len(result.data) > 0 and hasattr(result.data[0], 'embedding'): + embedding_dim = len(result.data[0].embedding) + log.info(f"🔍 Using embedding dimension: {embedding_dim}") + + final_data = [] + valid_idx = 0 + for i in range(len(texts)): + if i in valid_indices: + # Use the embedding from valid texts + final_data.append(result.data[valid_idx]) + valid_idx += 1 + else: + # Create zero embedding for filtered texts with correct dimension + log.warning(f"🔍 Creating zero embedding for filtered text at index {i}") + final_data.append(Embedding( + embedding=[0.0] * embedding_dim, # Use correct embedding dimension + index=i + )) + + result = EmbedderOutput( + data=final_data, + error=None, + raw_response=result.raw_response + ) + + return result + + except Exception as e: + log.error(f"🔍 DashScope API call failed: {e}") + return EmbedderOutput(data=[], error=str(e), raw_response=None) + else: + raise ValueError(f"model_type {model_type} is not supported") + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + async def acall( + self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED + ): + """Async call to the Dashscope API.""" + if not self.async_client: + self.async_client = self.init_async_client() + + if model_type == ModelType.LLM: + if not api_kwargs.get("stream", False): + # For non-streaming, enable_thinking must be false. + extra_body = api_kwargs.get("extra_body", {}) + extra_body["enable_thinking"] = False + api_kwargs["extra_body"] = extra_body + + completion = await self.async_client.chat.completions.create(**api_kwargs) + + if api_kwargs.get("stream", False): + return handle_streaming_response(completion) + else: + return self.parse_chat_completion(completion) + elif model_type == ModelType.EMBEDDER: + # Extract input texts from api_kwargs + texts = api_kwargs.get("input", []) + + if not texts: + log.warning("😭 No input texts provided") + return EmbedderOutput(data=[], error="No input texts provided", raw_response=None) + + # Ensure texts is a list + if isinstance(texts, str): + texts = [texts] + + # Filter out empty or None texts - following HuggingFace client pattern + valid_texts = [] + valid_indices = [] + for i, text in enumerate(texts): + if text and isinstance(text, str) and text.strip(): + valid_texts.append(text) + valid_indices.append(i) + else: + log.warning(f"🔍 Skipping empty or invalid text at index {i}: type={type(text)}, length={len(text) if hasattr(text, '__len__') else 'N/A'}, repr={repr(text)[:100]}") + + if not valid_texts: + log.error("😭 No valid texts found after filtering") + return EmbedderOutput(data=[], error="No valid texts found after filtering", raw_response=None) + + if len(valid_texts) != len(texts): + filtered_count = len(texts) - len(valid_texts) + log.warning(f"🔍 Filtered out {filtered_count} empty/invalid texts out of {len(texts)} total texts") + + # Create modified api_kwargs with only valid texts + filtered_api_kwargs = api_kwargs.copy() + filtered_api_kwargs["input"] = valid_texts + + log.info(f"🔍 DashScope async embedding API call with {len(valid_texts)} valid texts out of {len(texts)} total") + + try: + response = await self.async_client.embeddings.create(**filtered_api_kwargs) + log.info(f"🔍 DashScope async API call successful, response type: {type(response)}") + result = self.parse_embedding_response(response) + + # If we filtered texts, we need to create embeddings for the original indices + if len(valid_texts) != len(texts): + log.info(f"🔍 Creating embeddings for {len(texts)} original positions") + + # Get the correct embedding dimension from the first valid embedding + embedding_dim = 256 # Default fallback based on config + if result.data and len(result.data) > 0 and hasattr(result.data[0], 'embedding'): + embedding_dim = len(result.data[0].embedding) + log.info(f"🔍 Using embedding dimension: {embedding_dim}") + + final_data = [] + valid_idx = 0 + for i in range(len(texts)): + if i in valid_indices: + # Use the embedding from valid texts + final_data.append(result.data[valid_idx]) + valid_idx += 1 + else: + # Create zero embedding for filtered texts with correct dimension + log.warning(f"🔍 Creating zero embedding for filtered text at index {i}") + final_data.append(Embedding( + embedding=[0.0] * embedding_dim, # Use correct embedding dimension + index=i + )) + + result = EmbedderOutput( + data=final_data, + error=None, + raw_response=result.raw_response + ) + + return result + + except Exception as e: + log.error(f"🔍 DashScope async API call failed: {e}") + return EmbedderOutput(data=[], error=str(e), raw_response=None) + else: + raise ValueError(f"model_type {model_type} is not supported") + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + """Create an instance from a dictionary.""" + return cls(**data) + + def to_dict(self) -> Dict[str, Any]: + """Convert to dictionary.""" + return { + "api_key": self._api_key, + "workspace_id": self._workspace_id, + "base_url": self.base_url, + "input_type": self._input_type, + } + + def __getstate__(self): + """ + Customize serialization to exclude non-picklable client objects. + This method is called by pickle when saving the object's state. + """ + state = self.__dict__.copy() + # Remove the unpicklable client instances + if 'sync_client' in state: + del state['sync_client'] + if 'async_client' in state: + del state['async_client'] + return state + + def __setstate__(self, state): + """ + Customize deserialization to re-create the client objects. + This method is called by pickle when loading the object's state. + """ + self.__dict__.update(state) + # Re-initialize the clients after unpickling + self.sync_client = self.init_sync_client() + self.async_client = None # It will be lazily initialized when acall is used + + +class DashScopeEmbedder(DataComponent): + r""" + A user-facing component that orchestrates an embedder model via the DashScope model client and output processors. + + Args: + model_client (ModelClient): The DashScope model client to use for the embedder. + model_kwargs (Dict[str, Any], optional): The model kwargs to pass to the model client. Defaults to {}. + output_processors (Optional[Component], optional): The output processors after model call. Defaults to None. + """ + + model_type: ModelType = ModelType.EMBEDDER + model_client: ModelClient + output_processors: Optional[DataComponent] + + def __init__( + self, + *, + model_client: ModelClient, + model_kwargs: Dict[str, Any] = {}, + output_processors: Optional[DataComponent] = None, + ) -> None: + + super().__init__(model_kwargs=model_kwargs) + if not isinstance(model_kwargs, Dict): + raise TypeError( + f"{type(self).__name__} requires a dictionary for model_kwargs, not a string" + ) + self.model_kwargs = model_kwargs.copy() + + if not isinstance(model_client, ModelClient): + raise TypeError( + f"{type(self).__name__} requires a ModelClient instance for model_client." + ) + self.model_client = model_client + self.output_processors = output_processors + + def call( + self, + input: EmbedderInputType, + model_kwargs: Optional[Dict] = {}, + ) -> EmbedderOutputType: + log.debug(f"Calling {self.__class__.__name__} with input: {input}") + api_kwargs = self.model_client.convert_inputs_to_api_kwargs( + input=input, + model_kwargs=self._compose_model_kwargs(**model_kwargs), + model_type=self.model_type, + ) + try: + output = self.model_client.call( + api_kwargs=api_kwargs, model_type=self.model_type + ) + except Exception as e: + log.error(f"🤡 Error calling the DashScope model: {e}") + output = EmbedderOutput(error=str(e)) + return output + + async def acall( + self, + input: EmbedderInputType, + model_kwargs: Optional[Dict] = {}, + ) -> EmbedderOutputType: + log.debug(f"Calling {self.__class__.__name__} with input: {input}") + api_kwargs = self.model_client.convert_inputs_to_api_kwargs( + input=input, + model_kwargs=self._compose_model_kwargs(**model_kwargs), + model_type=self.model_type, + ) + output: EmbedderOutputType = None + try: + response = await self.model_client.acall( + api_kwargs=api_kwargs, model_type=self.model_type + ) + output = self.model_client.parse_embedding_response(response) + except Exception as e: + log.error(f"Error calling the DashScope model: {e}") + output = EmbedderOutput(error=str(e)) + + output.input = [input] if isinstance(input, str) else input + log.debug(f"Output from {self.__class__.__name__}: {output}") + return output + + def _compose_model_kwargs(self, **model_kwargs) -> Dict[str, object]: + return F.compose_model_kwargs(self.model_kwargs, model_kwargs) + +# Batch Embedding Components for DashScope +class DashScopeBatchEmbedder(DataComponent): + """Batch embedder specifically designed for DashScope API""" + + def __init__(self, embedder, batch_size: int = 100, embedding_cache_file_name: str = "default") -> None: + super().__init__(batch_size=batch_size) + self.embedder = embedder + self.batch_size = batch_size + if self.batch_size > 25: + log.warning(f"DashScope batch embedder initialization, batch size: {self.batch_size}, note that DashScope batch embedding size cannot exceed 25, automatically set to 25") + self.batch_size = 25 + self.cache_path = f'./embedding_cache/{embedding_cache_file_name}_{self.embedder.__class__.__name__}_dashscope_embeddings.pkl' + + def call( + self, input: BatchEmbedderInputType, model_kwargs: Optional[Dict] = {}, force_recreate: bool = False + ) -> BatchEmbedderOutputType: + """ + Batch call to DashScope embedder + + Args: + input: List of input texts + model_kwargs: Model parameters + force_recreate: Whether to force recreation + + Returns: + Batch embedding output + """ + # Check cache first + + if not force_recreate and os.path.exists(self.cache_path): + try: + with open(self.cache_path, 'rb') as f: + embeddings = pickle.load(f) + log.info(f"Loaded cached DashScope embeddings from: {self.cache_path}") + return embeddings + except Exception as e: + log.warning(f"Failed to load cache file {self.cache_path}: {e}, proceeding with fresh embedding") + + if isinstance(input, str): + input = [input] + + n = len(input) + embeddings: List[EmbedderOutput] = [] + + log.info(f"Starting DashScope batch embedding processing, total {n} texts, batch size: {self.batch_size}") + + for i in tqdm( + range(0, n, self.batch_size), + desc="DashScope batch embedding", + disable=False, + ): + batch_input = input[i : min(i + self.batch_size, n)] + + try: + # Use correct calling method: directly call embedder instance + batch_output = self.embedder( + input=batch_input, model_kwargs=model_kwargs + ) + embeddings.append(batch_output) + + # Validate batch output + if batch_output.error: + log.error(f"Batch {i//self.batch_size + 1} embedding failed: {batch_output.error}") + elif batch_output.data: + log.debug(f"Batch {i//self.batch_size + 1} successfully generated {len(batch_output.data)} embedding vectors") + else: + log.warning(f"Batch {i//self.batch_size + 1} returned no embedding data") + + except Exception as e: + log.error(f"Batch {i//self.batch_size + 1} processing exception: {e}") + # Create error embedding output + error_output = EmbedderOutput( + data=[], + error=str(e), + raw_response=None + ) + embeddings.append(error_output) + + log.info(f"DashScope batch embedding completed, processed {len(embeddings)} batches") + + # Save to cache + try: + if not os.path.exists('./embedding_cache'): + os.makedirs('./embedding_cache') + with open(self.cache_path, 'wb') as f: + pickle.dump(embeddings, f) + log.info(f"Saved DashScope embeddings cache to: {self.cache_path}") + except Exception as e: + log.warning(f"Failed to save cache to {self.cache_path}: {e}") + + return embeddings + + def __call__(self, input: BatchEmbedderInputType, model_kwargs: Optional[Dict] = {}, force_recreate: bool = False) -> BatchEmbedderOutputType: + """ + Call operator interface, delegates to call method + """ + return self.call(input=input, model_kwargs=model_kwargs, force_recreate=force_recreate) + + +class DashScopeToEmbeddings(DataComponent): + """Component that converts document sequences to embedding vector sequences, specifically optimized for DashScope API""" + + def __init__(self, embedder, batch_size: int = 100, force_recreate_db: bool = False, embedding_cache_file_name: str = "default") -> None: + super().__init__(batch_size=batch_size) + self.embedder = embedder + self.batch_size = batch_size + self.batch_embedder = DashScopeBatchEmbedder(embedder=embedder, batch_size=batch_size, embedding_cache_file_name=embedding_cache_file_name) + self.force_recreate_db = force_recreate_db + + def __call__(self, input: List[Document]) -> List[Document]: + """ + Process list of documents, generating embedding vectors for each document + + Args: + input: List of input documents + + Returns: + List of documents containing embedding vectors + """ + output = deepcopy(input) + + # Convert to text list + embedder_input: List[str] = [chunk.text for chunk in output] + + log.info(f"Starting to process embeddings for {len(embedder_input)} documents") + + # Batch process embeddings + outputs: List[EmbedderOutput] = self.batch_embedder( + input=embedder_input, + force_recreate=self.force_recreate_db + ) + + # Validate output + total_embeddings = 0 + error_batches = 0 + + for batch_output in outputs: + if batch_output.error: + error_batches += 1 + log.error(f"Found error batch: {batch_output.error}") + elif batch_output.data: + total_embeddings += len(batch_output.data) + + log.info(f"Embedding statistics: total {total_embeddings} valid embeddings, {error_batches} error batches") + + # Assign embedding vectors back to documents + doc_idx = 0 + for batch_idx, batch_output in tqdm( + enumerate(outputs), + desc="Assigning embedding vectors to documents", + disable=False + ): + if batch_output.error: + # Create empty vectors for documents in error batches + batch_size_actual = min(self.batch_size, len(output) - doc_idx) + log.warning(f"Creating empty vectors for {batch_size_actual} documents in batch {batch_idx}") + + for i in range(batch_size_actual): + if doc_idx < len(output): + output[doc_idx].vector = [] + doc_idx += 1 + else: + # Assign normal embedding vectors + for embedding in batch_output.data: + if doc_idx < len(output): + if hasattr(embedding, 'embedding'): + output[doc_idx].vector = embedding.embedding + else: + log.warning(f"Invalid embedding format for document {doc_idx}") + output[doc_idx].vector = [] + doc_idx += 1 + + # Validate results + valid_count = 0 + empty_count = 0 + + for doc in output: + if hasattr(doc, 'vector') and doc.vector and len(doc.vector) > 0: + valid_count += 1 + else: + empty_count += 1 + + log.info(f"Embedding results: {valid_count} valid vectors, {empty_count} empty vectors") + + if valid_count == 0: + log.error("❌ All documents have empty embedding vectors!") + elif empty_count > 0: + log.warning(f"⚠️ Found {empty_count} empty embedding vectors") + else: + log.info("✅ All documents successfully generated embedding vectors") + + return output + + def _extra_repr(self) -> str: + return f"batch_size={self.batch_size}" \ No newline at end of file diff --git a/reference-deepwiki/api/data_pipeline.py b/reference-deepwiki/api/data_pipeline.py new file mode 100644 index 0000000..fcea34c --- /dev/null +++ b/reference-deepwiki/api/data_pipeline.py @@ -0,0 +1,881 @@ +import adalflow as adal +from adalflow.core.types import Document, List +from adalflow.components.data_process import TextSplitter, ToEmbeddings +import os +import subprocess +import json +import tiktoken +import logging +import base64 +import re +import glob +from adalflow.utils import get_adalflow_default_root_path +from adalflow.core.db import LocalDB +from api.config import configs, DEFAULT_EXCLUDED_DIRS, DEFAULT_EXCLUDED_FILES +from api.ollama_patch import OllamaDocumentProcessor +from urllib.parse import urlparse, urlunparse, quote +import requests +from requests.exceptions import RequestException + +from api.tools.embedder import get_embedder + +# Configure logging +logger = logging.getLogger(__name__) + +# Maximum token limit for OpenAI embedding models +MAX_EMBEDDING_TOKENS = 8192 + +def count_tokens(text: str, embedder_type: str = None, is_ollama_embedder: bool = None) -> int: + """ + Count the number of tokens in a text string using tiktoken. + + Args: + text (str): The text to count tokens for. + embedder_type (str, optional): The embedder type ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + + Returns: + int: The number of tokens in the text. + """ + try: + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + + # Determine embedder type if not specified + if embedder_type is None: + from api.config import get_embedder_type + embedder_type = get_embedder_type() + + # Choose encoding based on embedder type + if embedder_type == 'ollama': + # Ollama typically uses cl100k_base encoding + encoding = tiktoken.get_encoding("cl100k_base") + elif embedder_type == 'google': + # Google uses similar tokenization to GPT models for rough estimation + encoding = tiktoken.get_encoding("cl100k_base") + else: # OpenAI or default + # Use OpenAI embedding model encoding + encoding = tiktoken.encoding_for_model("text-embedding-3-small") + + return len(encoding.encode(text)) + except Exception as e: + # Fallback to a simple approximation if tiktoken fails + logger.warning(f"Error counting tokens with tiktoken: {e}") + # Rough approximation: 4 characters per token + return len(text) // 4 + +def download_repo(repo_url: str, local_path: str, type: str = "github", access_token: str = None) -> str: + """ + Downloads a Git repository (GitHub, GitLab, or Bitbucket) to a specified local path. + + Args: + repo_url (str): The URL of the Git repository to clone. + local_path (str): The local directory where the repository will be cloned. + access_token (str, optional): Access token for private repositories. + + Returns: + str: The output message from the `git` command. + """ + try: + # Check if Git is installed + logger.info(f"Preparing to clone repository to {local_path}") + subprocess.run( + ["git", "--version"], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + # Check if repository already exists + if os.path.exists(local_path) and os.listdir(local_path): + # Directory exists and is not empty + logger.warning(f"Repository already exists at {local_path}. Using existing repository.") + return f"Using existing repository at {local_path}" + + # Ensure the local path exists + os.makedirs(local_path, exist_ok=True) + + # Prepare the clone URL with access token if provided + clone_url = repo_url + if access_token: + parsed = urlparse(repo_url) + # Determine the repository type and format the URL accordingly + if type == "github": + # Format: https://{token}@{domain}/owner/repo.git + # Works for both github.com and enterprise GitHub domains + clone_url = urlunparse((parsed.scheme, f"{access_token}@{parsed.netloc}", parsed.path, '', '', '')) + elif type == "gitlab": + # Format: https://oauth2:{token}@gitlab.com/owner/repo.git + clone_url = urlunparse((parsed.scheme, f"oauth2:{access_token}@{parsed.netloc}", parsed.path, '', '', '')) + elif type == "bitbucket": + # Format: https://x-token-auth:{token}@bitbucket.org/owner/repo.git + clone_url = urlunparse((parsed.scheme, f"x-token-auth:{access_token}@{parsed.netloc}", parsed.path, '', '', '')) + + logger.info("Using access token for authentication") + + # Clone the repository + logger.info(f"Cloning repository from {repo_url} to {local_path}") + # We use repo_url in the log to avoid exposing the token in logs + result = subprocess.run( + ["git", "clone", "--depth=1", "--single-branch", clone_url, local_path], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + logger.info("Repository cloned successfully") + return result.stdout.decode("utf-8") + + except subprocess.CalledProcessError as e: + error_msg = e.stderr.decode('utf-8') + # Sanitize error message to remove any tokens + if access_token and access_token in error_msg: + error_msg = error_msg.replace(access_token, "***TOKEN***") + raise ValueError(f"Error during cloning: {error_msg}") + except Exception as e: + raise ValueError(f"An unexpected error occurred: {str(e)}") + +# Alias for backward compatibility +download_github_repo = download_repo + +def read_all_documents(path: str, embedder_type: str = None, is_ollama_embedder: bool = None, + excluded_dirs: List[str] = None, excluded_files: List[str] = None, + included_dirs: List[str] = None, included_files: List[str] = None): + """ + Recursively reads all documents in a directory and its subdirectories. + + Args: + path (str): The root directory path. + embedder_type (str, optional): The embedder type ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + excluded_dirs (List[str], optional): List of directories to exclude from processing. + Overrides the default configuration if provided. + excluded_files (List[str], optional): List of file patterns to exclude from processing. + Overrides the default configuration if provided. + included_dirs (List[str], optional): List of directories to include exclusively. + When provided, only files in these directories will be processed. + included_files (List[str], optional): List of file patterns to include exclusively. + When provided, only files matching these patterns will be processed. + + Returns: + list: A list of Document objects with metadata. + """ + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + documents = [] + # File extensions to look for, prioritizing code files + code_extensions = [".py", ".js", ".ts", ".java", ".cpp", ".c", ".h", ".hpp", ".go", ".rs", + ".jsx", ".tsx", ".html", ".css", ".php", ".swift", ".cs"] + doc_extensions = [".md", ".txt", ".rst", ".json", ".yaml", ".yml"] + + # Determine filtering mode: inclusion or exclusion + use_inclusion_mode = (included_dirs is not None and len(included_dirs) > 0) or (included_files is not None and len(included_files) > 0) + + if use_inclusion_mode: + # Inclusion mode: only process specified directories and files + final_included_dirs = set(included_dirs) if included_dirs else set() + final_included_files = set(included_files) if included_files else set() + + logger.info(f"Using inclusion mode") + logger.info(f"Included directories: {list(final_included_dirs)}") + logger.info(f"Included files: {list(final_included_files)}") + + # Convert to lists for processing + included_dirs = list(final_included_dirs) + included_files = list(final_included_files) + excluded_dirs = [] + excluded_files = [] + else: + # Exclusion mode: use default exclusions plus any additional ones + final_excluded_dirs = set(DEFAULT_EXCLUDED_DIRS) + final_excluded_files = set(DEFAULT_EXCLUDED_FILES) + + # Add any additional excluded directories from config + if "file_filters" in configs and "excluded_dirs" in configs["file_filters"]: + final_excluded_dirs.update(configs["file_filters"]["excluded_dirs"]) + + # Add any additional excluded files from config + if "file_filters" in configs and "excluded_files" in configs["file_filters"]: + final_excluded_files.update(configs["file_filters"]["excluded_files"]) + + # Add any explicitly provided excluded directories and files + if excluded_dirs is not None: + final_excluded_dirs.update(excluded_dirs) + + if excluded_files is not None: + final_excluded_files.update(excluded_files) + + # Convert back to lists for compatibility + excluded_dirs = list(final_excluded_dirs) + excluded_files = list(final_excluded_files) + included_dirs = [] + included_files = [] + + logger.info(f"Using exclusion mode") + logger.info(f"Excluded directories: {excluded_dirs}") + logger.info(f"Excluded files: {excluded_files}") + + logger.info(f"Reading documents from {path}") + + def should_process_file(file_path: str, use_inclusion: bool, included_dirs: List[str], included_files: List[str], + excluded_dirs: List[str], excluded_files: List[str]) -> bool: + """ + Determine if a file should be processed based on inclusion/exclusion rules. + + Args: + file_path (str): The file path to check + use_inclusion (bool): Whether to use inclusion mode + included_dirs (List[str]): List of directories to include + included_files (List[str]): List of files to include + excluded_dirs (List[str]): List of directories to exclude + excluded_files (List[str]): List of files to exclude + + Returns: + bool: True if the file should be processed, False otherwise + """ + file_path_parts = os.path.normpath(file_path).split(os.sep) + file_name = os.path.basename(file_path) + + if use_inclusion: + # Inclusion mode: file must be in included directories or match included files + is_included = False + + # Check if file is in an included directory + if included_dirs: + for included in included_dirs: + clean_included = included.strip("./").rstrip("/") + if clean_included in file_path_parts: + is_included = True + break + + # Check if file matches included file patterns + if not is_included and included_files: + for included_file in included_files: + if file_name == included_file or file_name.endswith(included_file): + is_included = True + break + + # If no inclusion rules are specified for a category, allow all files from that category + if not included_dirs and not included_files: + is_included = True + elif not included_dirs and included_files: + # Only file patterns specified, allow all directories + pass # is_included is already set based on file patterns + elif included_dirs and not included_files: + # Only directory patterns specified, allow all files in included directories + pass # is_included is already set based on directory patterns + + return is_included + else: + # Exclusion mode: file must not be in excluded directories or match excluded files + is_excluded = False + + # Check if file is in an excluded directory + for excluded in excluded_dirs: + clean_excluded = excluded.strip("./").rstrip("/") + if clean_excluded in file_path_parts: + is_excluded = True + break + + # Check if file matches excluded file patterns + if not is_excluded: + for excluded_file in excluded_files: + if file_name == excluded_file: + is_excluded = True + break + + return not is_excluded + + # Process code files first + for ext in code_extensions: + files = glob.glob(f"{path}/**/*{ext}", recursive=True) + for file_path in files: + # Check if file should be processed based on inclusion/exclusion rules + if not should_process_file(file_path, use_inclusion_mode, included_dirs, included_files, excluded_dirs, excluded_files): + continue + + try: + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + relative_path = os.path.relpath(file_path, path) + + # Determine if this is an implementation file + is_implementation = ( + not relative_path.startswith("test_") + and not relative_path.startswith("app_") + and "test" not in relative_path.lower() + ) + + # Check token count + token_count = count_tokens(content, embedder_type) + if token_count > MAX_EMBEDDING_TOKENS * 10: + logger.warning(f"Skipping large file {relative_path}: Token count ({token_count}) exceeds limit") + continue + + doc = Document( + text=content, + meta_data={ + "file_path": relative_path, + "type": ext[1:], + "is_code": True, + "is_implementation": is_implementation, + "title": relative_path, + "token_count": token_count, + }, + ) + documents.append(doc) + except Exception as e: + logger.error(f"Error reading {file_path}: {e}") + + # Then process documentation files + for ext in doc_extensions: + files = glob.glob(f"{path}/**/*{ext}", recursive=True) + for file_path in files: + # Check if file should be processed based on inclusion/exclusion rules + if not should_process_file(file_path, use_inclusion_mode, included_dirs, included_files, excluded_dirs, excluded_files): + continue + + try: + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + relative_path = os.path.relpath(file_path, path) + + # Check token count + token_count = count_tokens(content, embedder_type) + if token_count > MAX_EMBEDDING_TOKENS: + logger.warning(f"Skipping large file {relative_path}: Token count ({token_count}) exceeds limit") + continue + + doc = Document( + text=content, + meta_data={ + "file_path": relative_path, + "type": ext[1:], + "is_code": False, + "is_implementation": False, + "title": relative_path, + "token_count": token_count, + }, + ) + documents.append(doc) + except Exception as e: + logger.error(f"Error reading {file_path}: {e}") + + logger.info(f"Found {len(documents)} documents") + return documents + +def prepare_data_pipeline(embedder_type: str = None, is_ollama_embedder: bool = None): + """ + Creates and returns the data transformation pipeline. + + Args: + embedder_type (str, optional): The embedder type ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + + Returns: + adal.Sequential: The data transformation pipeline + """ + from api.config import get_embedder_config, get_embedder_type + + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + + # Determine embedder type if not specified + if embedder_type is None: + embedder_type = get_embedder_type() + + splitter = TextSplitter(**configs["text_splitter"]) + embedder_config = get_embedder_config() + + embedder = get_embedder(embedder_type=embedder_type) + + # Choose appropriate processor based on embedder type + if embedder_type == 'ollama': + # Use Ollama document processor for single-document processing + embedder_transformer = OllamaDocumentProcessor(embedder=embedder) + else: + # Use batch processing for OpenAI and Google embedders + batch_size = embedder_config.get("batch_size", 500) + embedder_transformer = ToEmbeddings( + embedder=embedder, batch_size=batch_size + ) + + data_transformer = adal.Sequential( + splitter, embedder_transformer + ) # sequential will chain together splitter and embedder + return data_transformer + +def transform_documents_and_save_to_db( + documents: List[Document], db_path: str, embedder_type: str = None, is_ollama_embedder: bool = None +) -> LocalDB: + """ + Transforms a list of documents and saves them to a local database. + + Args: + documents (list): A list of `Document` objects. + db_path (str): The path to the local database file. + embedder_type (str, optional): The embedder type ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + """ + # Get the data transformer + data_transformer = prepare_data_pipeline(embedder_type, is_ollama_embedder) + + # Save the documents to a local database + db = LocalDB() + db.register_transformer(transformer=data_transformer, key="split_and_embed") + db.load(documents) + db.transform(key="split_and_embed") + os.makedirs(os.path.dirname(db_path), exist_ok=True) + db.save_state(filepath=db_path) + return db + +def get_github_file_content(repo_url: str, file_path: str, access_token: str = None) -> str: + """ + Retrieves the content of a file from a GitHub repository using the GitHub API. + Supports both public GitHub (github.com) and GitHub Enterprise (custom domains). + + Args: + repo_url (str): The URL of the GitHub repository + (e.g., "https://github.com/username/repo" or "https://github.company.com/username/repo") + file_path (str): The path to the file within the repository (e.g., "src/main.py") + access_token (str, optional): GitHub personal access token for private repositories + + Returns: + str: The content of the file as a string + + Raises: + ValueError: If the file cannot be fetched or if the URL is not a valid GitHub URL + """ + try: + # Parse the repository URL to support both github.com and enterprise GitHub + parsed_url = urlparse(repo_url) + if not parsed_url.scheme or not parsed_url.netloc: + raise ValueError("Not a valid GitHub repository URL") + + # Check if it's a GitHub-like URL structure + path_parts = parsed_url.path.strip('/').split('/') + if len(path_parts) < 2: + raise ValueError("Invalid GitHub URL format - expected format: https://domain/owner/repo") + + owner = path_parts[-2] + repo = path_parts[-1].replace(".git", "") + + # Determine the API base URL + if parsed_url.netloc == "github.com": + # Public GitHub + api_base = "https://api.github.com" + else: + # GitHub Enterprise - API is typically at https://domain/api/v3/ + api_base = f"{parsed_url.scheme}://{parsed_url.netloc}/api/v3" + + # Use GitHub API to get file content + # The API endpoint for getting file content is: /repos/{owner}/{repo}/contents/{path} + api_url = f"{api_base}/repos/{owner}/{repo}/contents/{file_path}" + + # Fetch file content from GitHub API + headers = {} + if access_token: + headers["Authorization"] = f"token {access_token}" + logger.info(f"Fetching file content from GitHub API: {api_url}") + try: + response = requests.get(api_url, headers=headers) + response.raise_for_status() + except RequestException as e: + raise ValueError(f"Error fetching file content: {e}") + try: + content_data = response.json() + except json.JSONDecodeError: + raise ValueError("Invalid response from GitHub API") + + # Check if we got an error response + if "message" in content_data and "documentation_url" in content_data: + raise ValueError(f"GitHub API error: {content_data['message']}") + + # GitHub API returns file content as base64 encoded string + if "content" in content_data and "encoding" in content_data: + if content_data["encoding"] == "base64": + # The content might be split into lines, so join them first + content_base64 = content_data["content"].replace("\n", "") + content = base64.b64decode(content_base64).decode("utf-8") + return content + else: + raise ValueError(f"Unexpected encoding: {content_data['encoding']}") + else: + raise ValueError("File content not found in GitHub API response") + + except Exception as e: + raise ValueError(f"Failed to get file content: {str(e)}") + +def get_gitlab_file_content(repo_url: str, file_path: str, access_token: str = None) -> str: + """ + Retrieves the content of a file from a GitLab repository (cloud or self-hosted). + + Args: + repo_url (str): The GitLab repo URL (e.g., "https://gitlab.com/username/repo" or "http://localhost/group/project") + file_path (str): File path within the repository (e.g., "src/main.py") + access_token (str, optional): GitLab personal access token + + Returns: + str: File content + + Raises: + ValueError: If anything fails + """ + try: + # Parse and validate the URL + parsed_url = urlparse(repo_url) + if not parsed_url.scheme or not parsed_url.netloc: + raise ValueError("Not a valid GitLab repository URL") + + gitlab_domain = f"{parsed_url.scheme}://{parsed_url.netloc}" + if parsed_url.port not in (None, 80, 443): + gitlab_domain += f":{parsed_url.port}" + path_parts = parsed_url.path.strip("/").split("/") + if len(path_parts) < 2: + raise ValueError("Invalid GitLab URL format — expected something like https://gitlab.domain.com/group/project") + + # Build project path and encode for API + project_path = "/".join(path_parts).replace(".git", "") + encoded_project_path = quote(project_path, safe='') + + # Encode file path + encoded_file_path = quote(file_path, safe='') + + # Try to get the default branch from the project info + default_branch = None + try: + project_info_url = f"{gitlab_domain}/api/v4/projects/{encoded_project_path}" + project_headers = {} + if access_token: + project_headers["PRIVATE-TOKEN"] = access_token + + project_response = requests.get(project_info_url, headers=project_headers) + if project_response.status_code == 200: + project_data = project_response.json() + default_branch = project_data.get('default_branch', 'main') + logger.info(f"Found default branch: {default_branch}") + else: + logger.warning(f"Could not fetch project info, using 'main' as default branch") + default_branch = 'main' + except Exception as e: + logger.warning(f"Error fetching project info: {e}, using 'main' as default branch") + default_branch = 'main' + + api_url = f"{gitlab_domain}/api/v4/projects/{encoded_project_path}/repository/files/{encoded_file_path}/raw?ref={default_branch}" + # Fetch file content from GitLab API + headers = {} + if access_token: + headers["PRIVATE-TOKEN"] = access_token + logger.info(f"Fetching file content from GitLab API: {api_url}") + try: + response = requests.get(api_url, headers=headers) + response.raise_for_status() + content = response.text + except RequestException as e: + raise ValueError(f"Error fetching file content: {e}") + + # Check for GitLab error response (JSON instead of raw file) + if content.startswith("{") and '"message":' in content: + try: + error_data = json.loads(content) + if "message" in error_data: + raise ValueError(f"GitLab API error: {error_data['message']}") + except json.JSONDecodeError: + pass + + return content + + except Exception as e: + raise ValueError(f"Failed to get file content: {str(e)}") + +def get_bitbucket_file_content(repo_url: str, file_path: str, access_token: str = None) -> str: + """ + Retrieves the content of a file from a Bitbucket repository using the Bitbucket API. + + Args: + repo_url (str): The URL of the Bitbucket repository (e.g., "https://bitbucket.org/username/repo") + file_path (str): The path to the file within the repository (e.g., "src/main.py") + access_token (str, optional): Bitbucket personal access token for private repositories + + Returns: + str: The content of the file as a string + """ + try: + # Extract owner and repo name from Bitbucket URL + if not (repo_url.startswith("https://bitbucket.org/") or repo_url.startswith("http://bitbucket.org/")): + raise ValueError("Not a valid Bitbucket repository URL") + + parts = repo_url.rstrip('/').split('/') + if len(parts) < 5: + raise ValueError("Invalid Bitbucket URL format") + + owner = parts[-2] + repo = parts[-1].replace(".git", "") + + # Try to get the default branch from the repository info + default_branch = None + try: + repo_info_url = f"https://api.bitbucket.org/2.0/repositories/{owner}/{repo}" + repo_headers = {} + if access_token: + repo_headers["Authorization"] = f"Bearer {access_token}" + + repo_response = requests.get(repo_info_url, headers=repo_headers) + if repo_response.status_code == 200: + repo_data = repo_response.json() + default_branch = repo_data.get('mainbranch', {}).get('name', 'main') + logger.info(f"Found default branch: {default_branch}") + else: + logger.warning(f"Could not fetch repository info, using 'main' as default branch") + default_branch = 'main' + except Exception as e: + logger.warning(f"Error fetching repository info: {e}, using 'main' as default branch") + default_branch = 'main' + + # Use Bitbucket API to get file content + # The API endpoint for getting file content is: /2.0/repositories/{owner}/{repo}/src/{branch}/{path} + api_url = f"https://api.bitbucket.org/2.0/repositories/{owner}/{repo}/src/{default_branch}/{file_path}" + + # Fetch file content from Bitbucket API + headers = {} + if access_token: + headers["Authorization"] = f"Bearer {access_token}" + logger.info(f"Fetching file content from Bitbucket API: {api_url}") + try: + response = requests.get(api_url, headers=headers) + if response.status_code == 200: + content = response.text + elif response.status_code == 404: + raise ValueError("File not found on Bitbucket. Please check the file path and repository.") + elif response.status_code == 401: + raise ValueError("Unauthorized access to Bitbucket. Please check your access token.") + elif response.status_code == 403: + raise ValueError("Forbidden access to Bitbucket. You might not have permission to access this file.") + elif response.status_code == 500: + raise ValueError("Internal server error on Bitbucket. Please try again later.") + else: + response.raise_for_status() + content = response.text + return content + except RequestException as e: + raise ValueError(f"Error fetching file content: {e}") + + except Exception as e: + raise ValueError(f"Failed to get file content: {str(e)}") + + +def get_file_content(repo_url: str, file_path: str, type: str = "github", access_token: str = None) -> str: + """ + Retrieves the content of a file from a Git repository (GitHub or GitLab). + + Args: + repo_url (str): The URL of the repository + file_path (str): The path to the file within the repository + access_token (str, optional): Access token for private repositories + + Returns: + str: The content of the file as a string + + Raises: + ValueError: If the file cannot be fetched or if the URL is not valid + """ + if type == "github": + return get_github_file_content(repo_url, file_path, access_token) + elif type == "gitlab": + return get_gitlab_file_content(repo_url, file_path, access_token) + elif type == "bitbucket": + return get_bitbucket_file_content(repo_url, file_path, access_token) + else: + raise ValueError("Unsupported repository URL. Only GitHub and GitLab are supported.") + +class DatabaseManager: + """ + Manages the creation, loading, transformation, and persistence of LocalDB instances. + """ + + def __init__(self): + self.db = None + self.repo_url_or_path = None + self.repo_paths = None + + def prepare_database(self, repo_url_or_path: str, type: str = "github", access_token: str = None, + embedder_type: str = None, is_ollama_embedder: bool = None, + excluded_dirs: List[str] = None, excluded_files: List[str] = None, + included_dirs: List[str] = None, included_files: List[str] = None) -> List[Document]: + """ + Create a new database from the repository. + + Args: + repo_url_or_path (str): The URL or local path of the repository + access_token (str, optional): Access token for private repositories + embedder_type (str, optional): Embedder type to use ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + excluded_dirs (List[str], optional): List of directories to exclude from processing + excluded_files (List[str], optional): List of file patterns to exclude from processing + included_dirs (List[str], optional): List of directories to include exclusively + included_files (List[str], optional): List of file patterns to include exclusively + + Returns: + List[Document]: List of Document objects + """ + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + + self.reset_database() + self._create_repo(repo_url_or_path, type, access_token) + return self.prepare_db_index(embedder_type=embedder_type, excluded_dirs=excluded_dirs, excluded_files=excluded_files, + included_dirs=included_dirs, included_files=included_files) + + def reset_database(self): + """ + Reset the database to its initial state. + """ + self.db = None + self.repo_url_or_path = None + self.repo_paths = None + + def _extract_repo_name_from_url(self, repo_url_or_path: str, repo_type: str) -> str: + # Extract owner and repo name to create unique identifier + url_parts = repo_url_or_path.rstrip('/').split('/') + + if repo_type in ["github", "gitlab", "bitbucket"] and len(url_parts) >= 5: + # GitHub URL format: https://github.com/owner/repo + # GitLab URL format: https://gitlab.com/owner/repo or https://gitlab.com/group/subgroup/repo + # Bitbucket URL format: https://bitbucket.org/owner/repo + owner = url_parts[-2] + repo = url_parts[-1].replace(".git", "") + repo_name = f"{owner}_{repo}" + else: + repo_name = url_parts[-1].replace(".git", "") + return repo_name + + def _create_repo(self, repo_url_or_path: str, repo_type: str = "github", access_token: str = None) -> None: + """ + Download and prepare all paths. + Paths: + ~/.adalflow/repos/{owner}_{repo_name} (for url, local path will be the same) + ~/.adalflow/databases/{owner}_{repo_name}.pkl + + Args: + repo_url_or_path (str): The URL or local path of the repository + access_token (str, optional): Access token for private repositories + """ + logger.info(f"Preparing repo storage for {repo_url_or_path}...") + + try: + root_path = get_adalflow_default_root_path() + + os.makedirs(root_path, exist_ok=True) + # url + if repo_url_or_path.startswith("https://") or repo_url_or_path.startswith("http://"): + # Extract the repository name from the URL + repo_name = self._extract_repo_name_from_url(repo_url_or_path, repo_type) + logger.info(f"Extracted repo name: {repo_name}") + + save_repo_dir = os.path.join(root_path, "repos", repo_name) + + # Check if the repository directory already exists and is not empty + if not (os.path.exists(save_repo_dir) and os.listdir(save_repo_dir)): + # Only download if the repository doesn't exist or is empty + download_repo(repo_url_or_path, save_repo_dir, repo_type, access_token) + else: + logger.info(f"Repository already exists at {save_repo_dir}. Using existing repository.") + else: # local path + repo_name = os.path.basename(repo_url_or_path) + save_repo_dir = repo_url_or_path + + save_db_file = os.path.join(root_path, "databases", f"{repo_name}.pkl") + os.makedirs(save_repo_dir, exist_ok=True) + os.makedirs(os.path.dirname(save_db_file), exist_ok=True) + + self.repo_paths = { + "save_repo_dir": save_repo_dir, + "save_db_file": save_db_file, + } + self.repo_url_or_path = repo_url_or_path + logger.info(f"Repo paths: {self.repo_paths}") + + except Exception as e: + logger.error(f"Failed to create repository structure: {e}") + raise + + def prepare_db_index(self, embedder_type: str = None, is_ollama_embedder: bool = None, + excluded_dirs: List[str] = None, excluded_files: List[str] = None, + included_dirs: List[str] = None, included_files: List[str] = None) -> List[Document]: + """ + Prepare the indexed database for the repository. + + Args: + embedder_type (str, optional): Embedder type to use ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + excluded_dirs (List[str], optional): List of directories to exclude from processing + excluded_files (List[str], optional): List of file patterns to exclude from processing + included_dirs (List[str], optional): List of directories to include exclusively + included_files (List[str], optional): List of file patterns to include exclusively + + Returns: + List[Document]: List of Document objects + """ + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + # check the database + if self.repo_paths and os.path.exists(self.repo_paths["save_db_file"]): + logger.info("Loading existing database...") + try: + self.db = LocalDB.load_state(self.repo_paths["save_db_file"]) + documents = self.db.get_transformed_data(key="split_and_embed") + if documents: + logger.info(f"Loaded {len(documents)} documents from existing database") + return documents + except Exception as e: + logger.error(f"Error loading existing database: {e}") + # Continue to create a new database + + # prepare the database + logger.info("Creating new database...") + documents = read_all_documents( + self.repo_paths["save_repo_dir"], + embedder_type=embedder_type, + excluded_dirs=excluded_dirs, + excluded_files=excluded_files, + included_dirs=included_dirs, + included_files=included_files + ) + self.db = transform_documents_and_save_to_db( + documents, self.repo_paths["save_db_file"], embedder_type=embedder_type + ) + logger.info(f"Total documents: {len(documents)}") + transformed_docs = self.db.get_transformed_data(key="split_and_embed") + logger.info(f"Total transformed documents: {len(transformed_docs)}") + return transformed_docs + + def prepare_retriever(self, repo_url_or_path: str, type: str = "github", access_token: str = None): + """ + Prepare the retriever for a repository. + This is a compatibility method for the isolated API. + + Args: + repo_url_or_path (str): The URL or local path of the repository + access_token (str, optional): Access token for private repositories + + Returns: + List[Document]: List of Document objects + """ + return self.prepare_database(repo_url_or_path, type, access_token) diff --git a/reference-deepwiki/api/google_embedder_client.py b/reference-deepwiki/api/google_embedder_client.py new file mode 100644 index 0000000..b604fd8 --- /dev/null +++ b/reference-deepwiki/api/google_embedder_client.py @@ -0,0 +1,231 @@ +"""Google AI Embeddings ModelClient integration.""" + +import os +import logging +import backoff +from typing import Dict, Any, Optional, List, Sequence + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ModelType, EmbedderOutput + +try: + import google.generativeai as genai + from google.generativeai.types.text_types import EmbeddingDict, BatchEmbeddingDict +except ImportError: + raise ImportError("google-generativeai is required. Install it with 'pip install google-generativeai'") + +log = logging.getLogger(__name__) + + +class GoogleEmbedderClient(ModelClient): + __doc__ = r"""A component wrapper for Google AI Embeddings API client. + + This client provides access to Google's embedding models through the Google AI API. + It supports text embeddings for various tasks including semantic similarity, + retrieval, and classification. + + Args: + api_key (Optional[str]): Google AI API key. Defaults to None. + If not provided, will use the GOOGLE_API_KEY environment variable. + env_api_key_name (str): Environment variable name for the API key. + Defaults to "GOOGLE_API_KEY". + + Example: + ```python + from api.google_embedder_client import GoogleEmbedderClient + import adalflow as adal + + client = GoogleEmbedderClient() + embedder = adal.Embedder( + model_client=client, + model_kwargs={ + "model": "text-embedding-004", + "task_type": "SEMANTIC_SIMILARITY" + } + ) + ``` + + References: + - Google AI Embeddings: https://ai.google.dev/gemini-api/docs/embeddings + - Available models: text-embedding-004, embedding-001 + """ + + def __init__( + self, + api_key: Optional[str] = None, + env_api_key_name: str = "GOOGLE_API_KEY", + ): + """Initialize Google AI Embeddings client. + + Args: + api_key: Google AI API key. If not provided, uses environment variable. + env_api_key_name: Name of environment variable containing API key. + """ + super().__init__() + self._api_key = api_key + self._env_api_key_name = env_api_key_name + self._initialize_client() + + def _initialize_client(self): + """Initialize the Google AI client with API key.""" + api_key = self._api_key or os.getenv(self._env_api_key_name) + if not api_key: + raise ValueError( + f"Environment variable {self._env_api_key_name} must be set" + ) + genai.configure(api_key=api_key) + + def parse_embedding_response(self, response) -> EmbedderOutput: + """Parse Google AI embedding response to EmbedderOutput format. + + Args: + response: Google AI embedding response (EmbeddingDict or BatchEmbeddingDict) + + Returns: + EmbedderOutput with parsed embeddings + """ + try: + from adalflow.core.types import Embedding + + embedding_data = [] + + if isinstance(response, dict): + if 'embedding' in response: + embedding_value = response['embedding'] + if isinstance(embedding_value, list) and len(embedding_value) > 0: + # Check if it's a single embedding (list of floats) or batch (list of lists) + if isinstance(embedding_value[0], (int, float)): + # Single embedding response: {'embedding': [float, ...]} + embedding_data = [Embedding(embedding=embedding_value, index=0)] + else: + # Batch embeddings response: {'embedding': [[float, ...], [float, ...], ...]} + embedding_data = [ + Embedding(embedding=emb_list, index=i) + for i, emb_list in enumerate(embedding_value) + ] + else: + log.warning(f"Empty or invalid embedding data: {embedding_value}") + embedding_data = [] + elif 'embeddings' in response: + # Alternative batch format: {'embeddings': [{'embedding': [float, ...]}, ...]} + embedding_data = [ + Embedding(embedding=item['embedding'], index=i) + for i, item in enumerate(response['embeddings']) + ] + else: + log.warning(f"Unexpected response structure: {response.keys()}") + embedding_data = [] + elif hasattr(response, 'embeddings'): + # Custom batch response object from our implementation + embedding_data = [ + Embedding(embedding=emb, index=i) + for i, emb in enumerate(response.embeddings) + ] + else: + log.warning(f"Unexpected response type: {type(response)}") + embedding_data = [] + + return EmbedderOutput( + data=embedding_data, + error=None, + raw_response=response + ) + except Exception as e: + log.error(f"Error parsing Google AI embedding response: {e}") + return EmbedderOutput( + data=[], + error=str(e), + raw_response=response + ) + + def convert_inputs_to_api_kwargs( + self, + input: Optional[Any] = None, + model_kwargs: Dict = {}, + model_type: ModelType = ModelType.UNDEFINED, + ) -> Dict: + """Convert inputs to Google AI API format. + + Args: + input: Text input(s) to embed + model_kwargs: Model parameters including model name and task_type + model_type: Should be ModelType.EMBEDDER for this client + + Returns: + Dict: API kwargs for Google AI embedding call + """ + if model_type != ModelType.EMBEDDER: + raise ValueError(f"GoogleEmbedderClient only supports EMBEDDER model type, got {model_type}") + + # Ensure input is a list + if isinstance(input, str): + content = [input] + elif isinstance(input, Sequence): + content = list(input) + else: + raise TypeError("input must be a string or sequence of strings") + + final_model_kwargs = model_kwargs.copy() + + # Handle single vs batch embedding + if len(content) == 1: + final_model_kwargs["content"] = content[0] + else: + final_model_kwargs["contents"] = content + + # Set default task type if not provided + if "task_type" not in final_model_kwargs: + final_model_kwargs["task_type"] = "SEMANTIC_SIMILARITY" + + # Set default model if not provided + if "model" not in final_model_kwargs: + final_model_kwargs["model"] = "text-embedding-004" + + return final_model_kwargs + + @backoff.on_exception( + backoff.expo, + (Exception,), # Google AI may raise various exceptions + max_time=5, + ) + def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """Call Google AI embedding API. + + Args: + api_kwargs: API parameters + model_type: Should be ModelType.EMBEDDER + + Returns: + Google AI embedding response + """ + if model_type != ModelType.EMBEDDER: + raise ValueError(f"GoogleEmbedderClient only supports EMBEDDER model type") + + log.info(f"Google AI Embeddings API kwargs: {api_kwargs}") + + try: + # Use embed_content for single text or batch embedding + if "content" in api_kwargs: + # Single embedding + response = genai.embed_content(**api_kwargs) + elif "contents" in api_kwargs: + # Batch embedding - Google AI supports batch natively + contents = api_kwargs.pop("contents") + response = genai.embed_content(content=contents, **api_kwargs) + else: + raise ValueError("Either 'content' or 'contents' must be provided") + + return response + + except Exception as e: + log.error(f"Error calling Google AI Embeddings API: {e}") + raise + + async def acall(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """Async call to Google AI embedding API. + + Note: Google AI Python client doesn't have async support yet, + so this falls back to synchronous call. + """ + # Google AI client doesn't have async support yet + return self.call(api_kwargs, model_type) \ No newline at end of file diff --git a/reference-deepwiki/api/logging_config.py b/reference-deepwiki/api/logging_config.py new file mode 100644 index 0000000..d2726c6 --- /dev/null +++ b/reference-deepwiki/api/logging_config.py @@ -0,0 +1,85 @@ +import logging +import os +from pathlib import Path +from logging.handlers import RotatingFileHandler + + +class IgnoreLogChangeDetectedFilter(logging.Filter): + def filter(self, record: logging.LogRecord): + return "Detected file change in" not in record.getMessage() + + +def setup_logging(format: str = None): + """ + Configure logging for the application with log rotation. + + Environment variables: + LOG_LEVEL: Log level (default: INFO) + LOG_FILE_PATH: Path to log file (default: logs/application.log) + LOG_MAX_SIZE: Max size in MB before rotating (default: 10MB) + LOG_BACKUP_COUNT: Number of backup files to keep (default: 5) + + Ensures log directory exists, prevents path traversal, and configures + both rotating file and console handlers. + """ + # Determine log directory and default file path + base_dir = Path(__file__).parent + log_dir = base_dir / "logs" + log_dir.mkdir(parents=True, exist_ok=True) + default_log_file = log_dir / "application.log" + + # Get log level from environment + log_level_str = os.environ.get("LOG_LEVEL", "INFO").upper() + log_level = getattr(logging, log_level_str, logging.INFO) + + # Get log file path + log_file_path = Path(os.environ.get("LOG_FILE_PATH", str(default_log_file))) + + # Secure path check: must be inside logs/ directory + log_dir_resolved = log_dir.resolve() + resolved_path = log_file_path.resolve() + if not str(resolved_path).startswith(str(log_dir_resolved) + os.sep): + raise ValueError(f"LOG_FILE_PATH '{log_file_path}' is outside the trusted log directory '{log_dir_resolved}'") + + # Ensure parent directories exist + resolved_path.parent.mkdir(parents=True, exist_ok=True) + + # Get max log file size (default: 10MB) + try: + max_mb = int(os.environ.get("LOG_MAX_SIZE", 10)) # 10MB default + max_bytes = max_mb * 1024 * 1024 + except (TypeError, ValueError): + max_bytes = 10 * 1024 * 1024 # fallback to 10MB on error + + # Get backup count (default: 5) + try: + backup_count = int(os.environ.get("LOG_BACKUP_COUNT", 5)) + except ValueError: + backup_count = 5 + + # Configure format + log_format = format or "%(asctime)s - %(levelname)s - %(name)s - %(filename)s:%(lineno)d - %(message)s" + + # Create handlers + file_handler = RotatingFileHandler(resolved_path, maxBytes=max_bytes, backupCount=backup_count, encoding="utf-8") + console_handler = logging.StreamHandler() + + # Set format for both handlers + formatter = logging.Formatter(log_format) + file_handler.setFormatter(formatter) + console_handler.setFormatter(formatter) + + # Add filter to suppress "Detected file change" messages + file_handler.addFilter(IgnoreLogChangeDetectedFilter()) + console_handler.addFilter(IgnoreLogChangeDetectedFilter()) + + # Apply logging configuration + logging.basicConfig(level=log_level, handlers=[file_handler, console_handler], force=True) + + # Log configuration info + logger = logging.getLogger(__name__) + logger.debug( + f"Logging configured: level={log_level_str}, " + f"file={resolved_path}, max_size={max_bytes} bytes, " + f"backup_count={backup_count}" + ) diff --git a/reference-deepwiki/api/main.py b/reference-deepwiki/api/main.py new file mode 100644 index 0000000..791e31b --- /dev/null +++ b/reference-deepwiki/api/main.py @@ -0,0 +1,79 @@ +import os +import sys +import logging +from dotenv import load_dotenv + +# Load environment variables from .env file +load_dotenv() + +from api.logging_config import setup_logging + +# Configure logging +setup_logging() +logger = logging.getLogger(__name__) + +# Configure watchfiles logger to show file paths +watchfiles_logger = logging.getLogger("watchfiles.main") +watchfiles_logger.setLevel(logging.DEBUG) # Enable DEBUG to see file paths + +# Add the current directory to the path so we can import the api package +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Apply watchfiles monkey patch BEFORE uvicorn import +is_development = os.environ.get("NODE_ENV") != "production" +if is_development: + import watchfiles + current_dir = os.path.dirname(os.path.abspath(__file__)) + logs_dir = os.path.join(current_dir, "logs") + + original_watch = watchfiles.watch + def patched_watch(*args, **kwargs): + # Only watch the api directory but exclude logs subdirectory + # Instead of watching the entire api directory, watch specific subdirectories + api_subdirs = [] + for item in os.listdir(current_dir): + item_path = os.path.join(current_dir, item) + if os.path.isdir(item_path) and item != "logs": + api_subdirs.append(item_path) + + # Also add Python files in the api root directory + api_subdirs.append(current_dir + "/*.py") + + return original_watch(*api_subdirs, **kwargs) + watchfiles.watch = patched_watch + +import uvicorn + +# Check for required environment variables +required_env_vars = ['GOOGLE_API_KEY', 'OPENAI_API_KEY'] +missing_vars = [var for var in required_env_vars if not os.environ.get(var)] +if missing_vars: + logger.warning(f"Missing environment variables: {', '.join(missing_vars)}") + logger.warning("Some functionality may not work correctly without these variables.") + +# Configure Google Generative AI +import google.generativeai as genai +from api.config import GOOGLE_API_KEY + +if GOOGLE_API_KEY: + genai.configure(api_key=GOOGLE_API_KEY) +else: + logger.warning("GOOGLE_API_KEY not configured") + +if __name__ == "__main__": + # Get port from environment variable or use default + port = int(os.environ.get("PORT", 8001)) + + # Import the app here to ensure environment variables are set first + from api.api import app + + logger.info(f"Starting Streaming API on port {port}") + + # Run the FastAPI app with uvicorn + uvicorn.run( + "api.api:app", + host="0.0.0.0", + port=port, + reload=is_development, + reload_excludes=["**/logs/*", "**/__pycache__/*", "**/*.pyc"] if is_development else None, + ) diff --git a/reference-deepwiki/api/ollama_patch.py b/reference-deepwiki/api/ollama_patch.py new file mode 100644 index 0000000..fb985df --- /dev/null +++ b/reference-deepwiki/api/ollama_patch.py @@ -0,0 +1,105 @@ +from typing import Sequence, List +from copy import deepcopy +from tqdm import tqdm +import logging +import adalflow as adal +from adalflow.core.types import Document +from adalflow.core.component import DataComponent +import requests +import os + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +logger = logging.getLogger(__name__) + +class OllamaModelNotFoundError(Exception): + """Custom exception for when Ollama model is not found""" + pass + +def check_ollama_model_exists(model_name: str, ollama_host: str = None) -> bool: + """ + Check if an Ollama model exists before attempting to use it. + + Args: + model_name: Name of the model to check + ollama_host: Ollama host URL, defaults to localhost:11434 + + Returns: + bool: True if model exists, False otherwise + """ + if ollama_host is None: + ollama_host = os.getenv("OLLAMA_HOST", "http://localhost:11434") + + try: + # Remove /api prefix if present and add it back + if ollama_host.endswith('/api'): + ollama_host = ollama_host[:-4] + + response = requests.get(f"{ollama_host}/api/tags", timeout=5) + if response.status_code == 200: + models_data = response.json() + available_models = [model.get('name', '').split(':')[0] for model in models_data.get('models', [])] + model_base_name = model_name.split(':')[0] # Remove tag if present + + is_available = model_base_name in available_models + if is_available: + logger.info(f"Ollama model '{model_name}' is available") + else: + logger.warning(f"Ollama model '{model_name}' is not available. Available models: {available_models}") + return is_available + else: + logger.warning(f"Could not check Ollama models, status code: {response.status_code}") + return False + except requests.exceptions.RequestException as e: + logger.warning(f"Could not connect to Ollama to check models: {e}") + return False + except Exception as e: + logger.warning(f"Error checking Ollama model availability: {e}") + return False + +class OllamaDocumentProcessor(DataComponent): + """ + Process documents for Ollama embeddings by processing one document at a time. + Adalflow Ollama Client does not support batch embedding, so we need to process each document individually. + """ + def __init__(self, embedder: adal.Embedder) -> None: + super().__init__() + self.embedder = embedder + + def __call__(self, documents: Sequence[Document]) -> Sequence[Document]: + output = deepcopy(documents) + logger.info(f"Processing {len(output)} documents individually for Ollama embeddings") + + successful_docs = [] + expected_embedding_size = None + + for i, doc in enumerate(tqdm(output, desc="Processing documents for Ollama embeddings")): + try: + # Get embedding for a single document + result = self.embedder(input=doc.text) + if result.data and len(result.data) > 0: + embedding = result.data[0].embedding + + # Validate embedding size consistency + if expected_embedding_size is None: + expected_embedding_size = len(embedding) + logger.info(f"Expected embedding size set to: {expected_embedding_size}") + elif len(embedding) != expected_embedding_size: + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.warning(f"Document '{file_path}' has inconsistent embedding size {len(embedding)} != {expected_embedding_size}, skipping") + continue + + # Assign the embedding to the document + output[i].vector = embedding + successful_docs.append(output[i]) + else: + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.warning(f"Failed to get embedding for document '{file_path}', skipping") + except Exception as e: + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.error(f"Error processing document '{file_path}': {e}, skipping") + + logger.info(f"Successfully processed {len(successful_docs)}/{len(output)} documents with consistent embeddings") + return successful_docs \ No newline at end of file diff --git a/reference-deepwiki/api/openai_client.py b/reference-deepwiki/api/openai_client.py new file mode 100644 index 0000000..bc75ed5 --- /dev/null +++ b/reference-deepwiki/api/openai_client.py @@ -0,0 +1,629 @@ +"""OpenAI ModelClient integration.""" + +import os +import base64 +from typing import ( + Dict, + Sequence, + Optional, + List, + Any, + TypeVar, + Callable, + Generator, + Union, + Literal, +) +import re + +import logging +import backoff + +# optional import +from adalflow.utils.lazy_import import safe_import, OptionalPackages +from openai.types.chat.chat_completion import Choice + +openai = safe_import(OptionalPackages.OPENAI.value[0], OptionalPackages.OPENAI.value[1]) + +from openai import OpenAI, AsyncOpenAI, Stream +from openai import ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, +) +from openai.types import ( + Completion, + CreateEmbeddingResponse, + Image, +) +from openai.types.chat import ChatCompletionChunk, ChatCompletion, ChatCompletionMessage + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ( + ModelType, + EmbedderOutput, + TokenLogProb, + CompletionUsage, + GeneratorOutput, +) +from adalflow.components.model_client.utils import parse_embedding_response + +log = logging.getLogger(__name__) +T = TypeVar("T") + + +# completion parsing functions and you can combine them into one singple chat completion parser +def get_first_message_content(completion: ChatCompletion) -> str: + r"""When we only need the content of the first message. + It is the default parser for chat completion.""" + log.debug(f"raw completion: {completion}") + return completion.choices[0].message.content + + +# def _get_chat_completion_usage(completion: ChatCompletion) -> OpenAICompletionUsage: +# return completion.usage + + +# A simple heuristic to estimate token count for estimating number of tokens in a Streaming response +def estimate_token_count(text: str) -> int: + """ + Estimate the token count of a given text. + + Args: + text (str): The text to estimate token count for. + + Returns: + int: Estimated token count. + """ + # Split the text into tokens using spaces as a simple heuristic + tokens = text.split() + + # Return the number of tokens + return len(tokens) + + +def parse_stream_response(completion: ChatCompletionChunk) -> str: + r"""Parse the response of the stream API.""" + return completion.choices[0].delta.content + + +def handle_streaming_response(generator: Stream[ChatCompletionChunk]): + r"""Handle the streaming response.""" + for completion in generator: + log.debug(f"Raw chunk completion: {completion}") + parsed_content = parse_stream_response(completion) + yield parsed_content + + +def get_all_messages_content(completion: ChatCompletion) -> List[str]: + r"""When the n > 1, get all the messages content.""" + return [c.message.content for c in completion.choices] + + +def get_probabilities(completion: ChatCompletion) -> List[List[TokenLogProb]]: + r"""Get the probabilities of each token in the completion.""" + log_probs = [] + for c in completion.choices: + content = c.logprobs.content + print(content) + log_probs_for_choice = [] + for openai_token_logprob in content: + token = openai_token_logprob.token + logprob = openai_token_logprob.logprob + log_probs_for_choice.append(TokenLogProb(token=token, logprob=logprob)) + log_probs.append(log_probs_for_choice) + return log_probs + + +class OpenAIClient(ModelClient): + __doc__ = r"""A component wrapper for the OpenAI API client. + + Supports both embedding and chat completion APIs, including multimodal capabilities. + + Users can: + 1. Simplify use of ``Embedder`` and ``Generator`` components by passing `OpenAIClient()` as the `model_client`. + 2. Use this as a reference to create their own API client or extend this class by copying and modifying the code. + + Note: + We recommend avoiding `response_format` to enforce output data type or `tools` and `tool_choice` in `model_kwargs` when calling the API. + OpenAI's internal formatting and added prompts are unknown. Instead: + - Use :ref:`OutputParser` for response parsing and formatting. + + For multimodal inputs, provide images in `model_kwargs["images"]` as a path, URL, or list of them. + The model must support vision capabilities (e.g., `gpt-4o`, `gpt-4o-mini`, `o1`, `o1-mini`). + + For image generation, use `model_type=ModelType.IMAGE_GENERATION` and provide: + - model: `"dall-e-3"` or `"dall-e-2"` + - prompt: Text description of the image to generate + - size: `"1024x1024"`, `"1024x1792"`, or `"1792x1024"` for DALL-E 3; `"256x256"`, `"512x512"`, or `"1024x1024"` for DALL-E 2 + - quality: `"standard"` or `"hd"` (DALL-E 3 only) + - n: Number of images to generate (1 for DALL-E 3, 1-10 for DALL-E 2) + - response_format: `"url"` or `"b64_json"` + + Args: + api_key (Optional[str], optional): OpenAI API key. Defaults to `None`. + chat_completion_parser (Callable[[Completion], Any], optional): A function to parse the chat completion into a `str`. Defaults to `None`. + The default parser is `get_first_message_content`. + base_url (str): The API base URL to use when initializing the client. + Defaults to `"https://api.openai.com"`, but can be customized for third-party API providers or self-hosted models. + env_api_key_name (str): The environment variable name for the API key. Defaults to `"OPENAI_API_KEY"`. + + References: + - OpenAI API Overview: https://platform.openai.com/docs/introduction + - Embeddings Guide: https://platform.openai.com/docs/guides/embeddings + - Chat Completion Models: https://platform.openai.com/docs/guides/text-generation + - Vision Models: https://platform.openai.com/docs/guides/vision + - Image Generation: https://platform.openai.com/docs/guides/images + """ + + def __init__( + self, + api_key: Optional[str] = None, + chat_completion_parser: Callable[[Completion], Any] = None, + input_type: Literal["text", "messages"] = "text", + base_url: Optional[str] = None, + env_base_url_name: str = "OPENAI_BASE_URL", + env_api_key_name: str = "OPENAI_API_KEY", + ): + r"""It is recommended to set the OPENAI_API_KEY environment variable instead of passing it as an argument. + + Args: + api_key (Optional[str], optional): OpenAI API key. Defaults to None. + base_url (str): The API base URL to use when initializing the client. + env_api_key_name (str): The environment variable name for the API key. Defaults to `"OPENAI_API_KEY"`. + """ + super().__init__() + self._api_key = api_key + self._env_api_key_name = env_api_key_name + self._env_base_url_name = env_base_url_name + self.base_url = base_url or os.getenv(self._env_base_url_name, "https://api.openai.com/v1") + self.sync_client = self.init_sync_client() + self.async_client = None # only initialize if the async call is called + self.chat_completion_parser = ( + chat_completion_parser or get_first_message_content + ) + self._input_type = input_type + self._api_kwargs = {} # add api kwargs when the OpenAI Client is called + + def init_sync_client(self): + api_key = self._api_key or os.getenv(self._env_api_key_name) + if not api_key: + raise ValueError( + f"Environment variable {self._env_api_key_name} must be set" + ) + return OpenAI(api_key=api_key, base_url=self.base_url) + + def init_async_client(self): + api_key = self._api_key or os.getenv(self._env_api_key_name) + if not api_key: + raise ValueError( + f"Environment variable {self._env_api_key_name} must be set" + ) + return AsyncOpenAI(api_key=api_key, base_url=self.base_url) + + # def _parse_chat_completion(self, completion: ChatCompletion) -> "GeneratorOutput": + # # TODO: raw output it is better to save the whole completion as a source of truth instead of just the message + # try: + # data = self.chat_completion_parser(completion) + # usage = self.track_completion_usage(completion) + # return GeneratorOutput( + # data=data, error=None, raw_response=str(data), usage=usage + # ) + # except Exception as e: + # log.error(f"Error parsing the completion: {e}") + # return GeneratorOutput(data=None, error=str(e), raw_response=completion) + + def parse_chat_completion( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> "GeneratorOutput": + """Parse the completion, and put it into the raw_response.""" + log.debug(f"completion: {completion}, parser: {self.chat_completion_parser}") + try: + data = self.chat_completion_parser(completion) + except Exception as e: + log.error(f"Error parsing the completion: {e}") + return GeneratorOutput(data=None, error=str(e), raw_response=completion) + + try: + usage = self.track_completion_usage(completion) + return GeneratorOutput( + data=None, error=None, raw_response=data, usage=usage + ) + except Exception as e: + log.error(f"Error tracking the completion usage: {e}") + return GeneratorOutput(data=None, error=str(e), raw_response=data) + + def track_completion_usage( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> CompletionUsage: + + try: + usage: CompletionUsage = CompletionUsage( + completion_tokens=completion.usage.completion_tokens, + prompt_tokens=completion.usage.prompt_tokens, + total_tokens=completion.usage.total_tokens, + ) + return usage + except Exception as e: + log.error(f"Error tracking the completion usage: {e}") + return CompletionUsage( + completion_tokens=None, prompt_tokens=None, total_tokens=None + ) + + def parse_embedding_response( + self, response: CreateEmbeddingResponse + ) -> EmbedderOutput: + r"""Parse the embedding response to a structure Adalflow components can understand. + + Should be called in ``Embedder``. + """ + try: + return parse_embedding_response(response) + except Exception as e: + log.error(f"Error parsing the embedding response: {e}") + return EmbedderOutput(data=[], error=str(e), raw_response=response) + + def convert_inputs_to_api_kwargs( + self, + input: Optional[Any] = None, + model_kwargs: Dict = {}, + model_type: ModelType = ModelType.UNDEFINED, + ) -> Dict: + r""" + Specify the API input type and output api_kwargs that will be used in _call and _acall methods. + Convert the Component's standard input, and system_input(chat model) and model_kwargs into API-specific format. + For multimodal inputs, images can be provided in model_kwargs["images"] as a string path, URL, or list of them. + The model specified in model_kwargs["model"] must support multimodal capabilities when using images. + + Args: + input: The input text or messages to process + model_kwargs: Additional parameters including: + - images: Optional image source(s) as path, URL, or list of them + - detail: Image detail level ('auto', 'low', or 'high'), defaults to 'auto' + - model: The model to use (must support multimodal inputs if images are provided) + model_type: The type of model (EMBEDDER or LLM) + + Returns: + Dict: API-specific kwargs for the model call + """ + + final_model_kwargs = model_kwargs.copy() + if model_type == ModelType.EMBEDDER: + if isinstance(input, str): + input = [input] + # convert input to input + if not isinstance(input, Sequence): + raise TypeError("input must be a sequence of text") + final_model_kwargs["input"] = input + elif model_type == ModelType.LLM: + # convert input to messages + messages: List[Dict[str, str]] = [] + images = final_model_kwargs.pop("images", None) + detail = final_model_kwargs.pop("detail", "auto") + + if self._input_type == "messages": + system_start_tag = "" + system_end_tag = "" + user_start_tag = "" + user_end_tag = "" + + # new regex pattern to ignore special characters such as \n + pattern = ( + rf"{system_start_tag}\s*(.*?)\s*{system_end_tag}\s*" + rf"{user_start_tag}\s*(.*?)\s*{user_end_tag}" + ) + + # Compile the regular expression + + # re.DOTALL is to allow . to match newline so that (.*?) does not match in a single line + regex = re.compile(pattern, re.DOTALL) + # Match the pattern + match = regex.match(input) + system_prompt, input_str = None, None + + if match: + system_prompt = match.group(1) + input_str = match.group(2) + else: + print("No match found.") + if system_prompt and input_str: + messages.append({"role": "system", "content": system_prompt}) + if images: + content = [{"type": "text", "text": input_str}] + if isinstance(images, (str, dict)): + images = [images] + for img in images: + content.append(self._prepare_image_content(img, detail)) + messages.append({"role": "user", "content": content}) + else: + messages.append({"role": "user", "content": input_str}) + if len(messages) == 0: + if images: + content = [{"type": "text", "text": input}] + if isinstance(images, (str, dict)): + images = [images] + for img in images: + content.append(self._prepare_image_content(img, detail)) + messages.append({"role": "user", "content": content}) + else: + messages.append({"role": "user", "content": input}) + final_model_kwargs["messages"] = messages + elif model_type == ModelType.IMAGE_GENERATION: + # For image generation, input is the prompt + final_model_kwargs["prompt"] = input + # Ensure model is specified + if "model" not in final_model_kwargs: + raise ValueError("model must be specified for image generation") + # Set defaults for DALL-E 3 if not specified + final_model_kwargs["size"] = final_model_kwargs.get("size", "1024x1024") + final_model_kwargs["quality"] = final_model_kwargs.get( + "quality", "standard" + ) + final_model_kwargs["n"] = final_model_kwargs.get("n", 1) + final_model_kwargs["response_format"] = final_model_kwargs.get( + "response_format", "url" + ) + + # Handle image edits and variations + image = final_model_kwargs.get("image") + if isinstance(image, str) and os.path.isfile(image): + final_model_kwargs["image"] = self._encode_image(image) + + mask = final_model_kwargs.get("mask") + if isinstance(mask, str) and os.path.isfile(mask): + final_model_kwargs["mask"] = self._encode_image(mask) + else: + raise ValueError(f"model_type {model_type} is not supported") + + return final_model_kwargs + + def parse_image_generation_response(self, response: List[Image]) -> GeneratorOutput: + """Parse the image generation response into a GeneratorOutput.""" + try: + # Extract URLs or base64 data from the response + data = [img.url or img.b64_json for img in response] + # For single image responses, unwrap from list + if len(data) == 1: + data = data[0] + return GeneratorOutput( + data=data, + raw_response=str(response), + ) + except Exception as e: + log.error(f"Error parsing image generation response: {e}") + return GeneratorOutput(data=None, error=str(e), raw_response=str(response)) + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """ + kwargs is the combined input and model_kwargs. Support streaming call. + """ + log.info(f"api_kwargs: {api_kwargs}") + self._api_kwargs = api_kwargs + if model_type == ModelType.EMBEDDER: + return self.sync_client.embeddings.create(**api_kwargs) + elif model_type == ModelType.LLM: + if "stream" in api_kwargs and api_kwargs.get("stream", False): + log.debug("streaming call") + self.chat_completion_parser = handle_streaming_response + return self.sync_client.chat.completions.create(**api_kwargs) + else: + log.debug("non-streaming call converted to streaming") + # Make a copy of api_kwargs to avoid modifying the original + streaming_kwargs = api_kwargs.copy() + streaming_kwargs["stream"] = True + + # Get streaming response + stream_response = self.sync_client.chat.completions.create(**streaming_kwargs) + + # Accumulate all content from the stream + accumulated_content = "" + id = "" + model = "" + created = 0 + for chunk in stream_response: + id = getattr(chunk, "id", None) or id + model = getattr(chunk, "model", None) or model + created = getattr(chunk, "created", 0) or created + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + accumulated_content += text or "" + # Return the mock completion object that will be processed by the chat_completion_parser + return ChatCompletion( + id = id, + model=model, + created=created, + object="chat.completion", + choices=[Choice( + index=0, + finish_reason="stop", + message=ChatCompletionMessage(content=accumulated_content, role="assistant") + )] + ) + elif model_type == ModelType.IMAGE_GENERATION: + # Determine which image API to call based on the presence of image/mask + if "image" in api_kwargs: + if "mask" in api_kwargs: + # Image edit + response = self.sync_client.images.edit(**api_kwargs) + else: + # Image variation + response = self.sync_client.images.create_variation(**api_kwargs) + else: + # Image generation + response = self.sync_client.images.generate(**api_kwargs) + return response.data + else: + raise ValueError(f"model_type {model_type} is not supported") + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + async def acall( + self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED + ): + """ + kwargs is the combined input and model_kwargs + """ + # store the api kwargs in the client + self._api_kwargs = api_kwargs + if self.async_client is None: + self.async_client = self.init_async_client() + if model_type == ModelType.EMBEDDER: + return await self.async_client.embeddings.create(**api_kwargs) + elif model_type == ModelType.LLM: + return await self.async_client.chat.completions.create(**api_kwargs) + elif model_type == ModelType.IMAGE_GENERATION: + # Determine which image API to call based on the presence of image/mask + if "image" in api_kwargs: + if "mask" in api_kwargs: + # Image edit + response = await self.async_client.images.edit(**api_kwargs) + else: + # Image variation + response = await self.async_client.images.create_variation( + **api_kwargs + ) + else: + # Image generation + response = await self.async_client.images.generate(**api_kwargs) + return response.data + else: + raise ValueError(f"model_type {model_type} is not supported") + + @classmethod + def from_dict(cls: type[T], data: Dict[str, Any]) -> T: + obj = super().from_dict(data) + # recreate the existing clients + obj.sync_client = obj.init_sync_client() + obj.async_client = obj.init_async_client() + return obj + + def to_dict(self) -> Dict[str, Any]: + r"""Convert the component to a dictionary.""" + # TODO: not exclude but save yes or no for recreating the clients + exclude = [ + "sync_client", + "async_client", + ] # unserializable object + output = super().to_dict(exclude=exclude) + return output + + def _encode_image(self, image_path: str) -> str: + """Encode image to base64 string. + + Args: + image_path: Path to image file. + + Returns: + Base64 encoded image string. + + Raises: + ValueError: If the file cannot be read or doesn't exist. + """ + try: + with open(image_path, "rb") as image_file: + return base64.b64encode(image_file.read()).decode("utf-8") + except FileNotFoundError: + raise ValueError(f"Image file not found: {image_path}") + except PermissionError: + raise ValueError(f"Permission denied when reading image file: {image_path}") + except Exception as e: + raise ValueError(f"Error encoding image {image_path}: {str(e)}") + + def _prepare_image_content( + self, image_source: Union[str, Dict[str, Any]], detail: str = "auto" + ) -> Dict[str, Any]: + """Prepare image content for API request. + + Args: + image_source: Either a path to local image or a URL. + detail: Image detail level ('auto', 'low', or 'high'). + + Returns: + Formatted image content for API request. + """ + if isinstance(image_source, str): + if image_source.startswith(("http://", "https://")): + return { + "type": "image_url", + "image_url": {"url": image_source, "detail": detail}, + } + else: + base64_image = self._encode_image(image_source) + return { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{base64_image}", + "detail": detail, + }, + } + return image_source + + +# Example usage: +if __name__ == "__main__": + from adalflow.core import Generator + from adalflow.utils import setup_env + + # log = get_logger(level="DEBUG") + + setup_env() + prompt_kwargs = {"input_str": "What is the meaning of life?"} + + gen = Generator( + model_client=OpenAIClient(), + model_kwargs={"model": "gpt-4o", "stream": False}, + ) + gen_response = gen(prompt_kwargs) + print(f"gen_response: {gen_response}") + + # for genout in gen_response.data: + # print(f"genout: {genout}") + + # test that to_dict and from_dict works + # model_client = OpenAIClient() + # model_client_dict = model_client.to_dict() + # from_dict_model_client = OpenAIClient.from_dict(model_client_dict) + # assert model_client_dict == from_dict_model_client.to_dict() + + +if __name__ == "__main__": + import adalflow as adal + + # setup env or pass the api_key + from adalflow.utils import setup_env + + setup_env() + + openai_llm = adal.Generator( + model_client=OpenAIClient(), model_kwargs={"model": "gpt-4o"} + ) + resopnse = openai_llm(prompt_kwargs={"input_str": "What is LLM?"}) + print(resopnse) diff --git a/reference-deepwiki/api/openrouter_client.py b/reference-deepwiki/api/openrouter_client.py new file mode 100644 index 0000000..b71c477 --- /dev/null +++ b/reference-deepwiki/api/openrouter_client.py @@ -0,0 +1,525 @@ +"""OpenRouter ModelClient integration.""" + +from typing import Dict, Sequence, Optional, Any, List +import logging +import json +import aiohttp +import requests +from requests.exceptions import RequestException, Timeout + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ( + CompletionUsage, + ModelType, + GeneratorOutput, +) + +log = logging.getLogger(__name__) + +class OpenRouterClient(ModelClient): + __doc__ = r"""A component wrapper for the OpenRouter API client. + + OpenRouter provides a unified API that gives access to hundreds of AI models through a single endpoint. + The API is compatible with OpenAI's API format with a few small differences. + + Visit https://openrouter.ai/docs for more details. + + Example: + ```python + from api.openrouter_client import OpenRouterClient + + client = OpenRouterClient() + generator = adal.Generator( + model_client=client, + model_kwargs={"model": "openai/gpt-4o"} + ) + ``` + """ + + def __init__(self, *args, **kwargs) -> None: + """Initialize the OpenRouter client.""" + super().__init__(*args, **kwargs) + self.sync_client = self.init_sync_client() + self.async_client = None # Initialize async client only when needed + + def init_sync_client(self): + """Initialize the synchronous OpenRouter client.""" + from api.config import OPENROUTER_API_KEY + api_key = OPENROUTER_API_KEY + if not api_key: + log.warning("OPENROUTER_API_KEY not configured") + + # OpenRouter doesn't have a dedicated client library, so we'll use requests directly + return { + "api_key": api_key, + "base_url": "https://openrouter.ai/api/v1" + } + + def init_async_client(self): + """Initialize the asynchronous OpenRouter client.""" + from api.config import OPENROUTER_API_KEY + api_key = OPENROUTER_API_KEY + if not api_key: + log.warning("OPENROUTER_API_KEY not configured") + + # For async, we'll use aiohttp + return { + "api_key": api_key, + "base_url": "https://openrouter.ai/api/v1" + } + + def convert_inputs_to_api_kwargs( + self, input: Any, model_kwargs: Dict = None, model_type: ModelType = None + ) -> Dict: + """Convert AdalFlow inputs to OpenRouter API format.""" + model_kwargs = model_kwargs or {} + + if model_type == ModelType.LLM: + # Handle LLM generation + messages = [] + + # Convert input to messages format if it's a string + if isinstance(input, str): + messages = [{"role": "user", "content": input}] + elif isinstance(input, list) and all(isinstance(msg, dict) for msg in input): + messages = input + else: + raise ValueError(f"Unsupported input format for OpenRouter: {type(input)}") + + # For debugging + log.info(f"Messages for OpenRouter: {messages}") + + api_kwargs = { + "messages": messages, + **model_kwargs + } + + # Ensure model is specified + if "model" not in api_kwargs: + api_kwargs["model"] = "openai/gpt-3.5-turbo" + + return api_kwargs + + elif model_type == ModelType.EMBEDDING: + # OpenRouter doesn't support embeddings directly + # We could potentially use a specific model through OpenRouter for embeddings + # but for now, we'll raise an error + raise NotImplementedError("OpenRouter client does not support embeddings yet") + + else: + raise ValueError(f"Unsupported model type: {model_type}") + + async def acall(self, api_kwargs: Dict = None, model_type: ModelType = None) -> Any: + """Make an asynchronous call to the OpenRouter API.""" + if not self.async_client: + self.async_client = self.init_async_client() + + # Check if API key is set + if not self.async_client.get("api_key"): + error_msg = "OPENROUTER_API_KEY not configured. Please set this environment variable to use OpenRouter." + log.error(error_msg) + # Instead of raising an exception, return a generator that yields the error message + # This allows the error to be displayed to the user in the streaming response + async def error_generator(): + yield error_msg + return error_generator() + + api_kwargs = api_kwargs or {} + + if model_type == ModelType.LLM: + # Prepare headers + headers = { + "Authorization": f"Bearer {self.async_client['api_key']}", + "Content-Type": "application/json", + "HTTP-Referer": "https://github.com/AsyncFuncAI/deepwiki-open", # Optional + "X-Title": "DeepWiki" # Optional + } + + # Always use non-streaming mode for OpenRouter + api_kwargs["stream"] = False + + # Make the API call + try: + log.info(f"Making async OpenRouter API call to {self.async_client['base_url']}/chat/completions") + log.info(f"Request headers: {headers}") + log.info(f"Request body: {api_kwargs}") + + async with aiohttp.ClientSession() as session: + try: + async with session.post( + f"{self.async_client['base_url']}/chat/completions", + headers=headers, + json=api_kwargs, + timeout=60 + ) as response: + if response.status != 200: + error_text = await response.text() + log.error(f"OpenRouter API error ({response.status}): {error_text}") + + # Return a generator that yields the error message + async def error_response_generator(): + yield f"OpenRouter API error ({response.status}): {error_text}" + return error_response_generator() + + # Get the full response + data = await response.json() + log.info(f"Received response from OpenRouter: {data}") + + # Create a generator that yields the content + async def content_generator(): + if "choices" in data and len(data["choices"]) > 0: + choice = data["choices"][0] + if "message" in choice and "content" in choice["message"]: + content = choice["message"]["content"] + log.info("Successfully retrieved response") + + # Check if the content is XML and ensure it's properly formatted + if content.strip().startswith("<") and ">" in content: + # It's likely XML, let's make sure it's properly formatted + try: + # Extract the XML content + xml_content = content + + # Check if it's a wiki_structure XML + if "" in xml_content: + log.info("Found wiki_structure XML, ensuring proper format") + + # Extract just the wiki_structure XML + import re + wiki_match = re.search(r'[\s\S]*?<\/wiki_structure>', xml_content) + if wiki_match: + # Get the raw XML + raw_xml = wiki_match.group(0) + + # Clean the XML by removing any leading/trailing whitespace + # and ensuring it's properly formatted + clean_xml = raw_xml.strip() + + # Try to fix common XML issues + try: + # Replace problematic characters in XML + fixed_xml = clean_xml + + # Replace & with & if not already part of an entity + fixed_xml = re.sub(r'&(?!amp;|lt;|gt;|apos;|quot;)', '&', fixed_xml) + + # Fix other common XML issues + fixed_xml = fixed_xml.replace('', '>') + + # Try to parse the fixed XML + from xml.dom.minidom import parseString + dom = parseString(fixed_xml) + + # Get the pretty-printed XML with proper indentation + pretty_xml = dom.toprettyxml() + + # Remove XML declaration + if pretty_xml.startswith('')+2:].strip() + + log.info(f"Extracted and validated XML: {pretty_xml[:100]}...") + yield pretty_xml + except Exception as xml_parse_error: + log.warning(f"XML validation failed: {str(xml_parse_error)}, using raw XML") + + # If XML validation fails, try a more aggressive approach + try: + # Use regex to extract just the structure without any problematic characters + import re + + # Extract the basic structure + structure_match = re.search(r'(.*?)', clean_xml, re.DOTALL) + if structure_match: + structure = structure_match.group(1).strip() + + # Rebuild a clean XML structure + clean_structure = "\n" + + # Extract title + title_match = re.search(r'(.*?)', structure, re.DOTALL) + if title_match: + title = title_match.group(1).strip() + clean_structure += f" {title}\n" + + # Extract description + desc_match = re.search(r'(.*?)', structure, re.DOTALL) + if desc_match: + desc = desc_match.group(1).strip() + clean_structure += f" {desc}\n" + + # Add pages section + clean_structure += " \n" + + # Extract pages + pages = re.findall(r'(.*?)', structure, re.DOTALL) + for page_id, page_content in pages: + clean_structure += f' \n' + + # Extract page title + page_title_match = re.search(r'(.*?)', page_content, re.DOTALL) + if page_title_match: + page_title = page_title_match.group(1).strip() + clean_structure += f" {page_title}\n" + + # Extract page description + page_desc_match = re.search(r'(.*?)', page_content, re.DOTALL) + if page_desc_match: + page_desc = page_desc_match.group(1).strip() + clean_structure += f" {page_desc}\n" + + # Extract importance + importance_match = re.search(r'(.*?)', page_content, re.DOTALL) + if importance_match: + importance = importance_match.group(1).strip() + clean_structure += f" {importance}\n" + + # Extract relevant files + clean_structure += " \n" + file_paths = re.findall(r'(.*?)', page_content, re.DOTALL) + for file_path in file_paths: + clean_structure += f" {file_path.strip()}\n" + clean_structure += " \n" + + # Extract related pages + clean_structure += " \n" + related_pages = re.findall(r'(.*?)', page_content, re.DOTALL) + for related in related_pages: + clean_structure += f" {related.strip()}\n" + clean_structure += " \n" + + clean_structure += " \n" + + clean_structure += " \n" + + log.info("Successfully rebuilt clean XML structure") + yield clean_structure + else: + log.warning("Could not extract wiki structure, using raw XML") + yield clean_xml + except Exception as rebuild_error: + log.warning(f"Failed to rebuild XML: {str(rebuild_error)}, using raw XML") + yield clean_xml + else: + # If we can't extract it, just yield the original content + log.warning("Could not extract wiki_structure XML, yielding original content") + yield xml_content + else: + # For other XML content, just yield it as is + yield content + except Exception as xml_error: + log.error(f"Error processing XML content: {str(xml_error)}") + yield content + else: + # Not XML, just yield the content + yield content + else: + log.error(f"Unexpected response format: {data}") + yield "Error: Unexpected response format from OpenRouter API" + else: + log.error(f"No choices in response: {data}") + yield "Error: No response content from OpenRouter API" + + return content_generator() + except aiohttp.ClientError as e: + e_client = e + log.error(f"Connection error with OpenRouter API: {str(e_client)}") + + # Return a generator that yields the error message + async def connection_error_generator(): + yield f"Connection error with OpenRouter API: {str(e_client)}. Please check your internet connection and that the OpenRouter API is accessible." + return connection_error_generator() + + except RequestException as e: + e_req = e + log.error(f"Error calling OpenRouter API asynchronously: {str(e_req)}") + + # Return a generator that yields the error message + async def request_error_generator(): + yield f"Error calling OpenRouter API: {str(e_req)}" + return request_error_generator() + + except Exception as e: + e_unexp = e + log.error(f"Unexpected error calling OpenRouter API asynchronously: {str(e_unexp)}") + + # Return a generator that yields the error message + async def unexpected_error_generator(): + yield f"Unexpected error calling OpenRouter API: {str(e_unexp)}" + return unexpected_error_generator() + + else: + error_msg = f"Unsupported model type: {model_type}" + log.error(error_msg) + + # Return a generator that yields the error message + async def model_type_error_generator(): + yield error_msg + return model_type_error_generator() + + def _process_completion_response(self, data: Dict) -> GeneratorOutput: + """Process a non-streaming completion response from OpenRouter.""" + try: + # Extract the completion text from the response + if not data.get("choices"): + raise ValueError(f"No choices in OpenRouter response: {data}") + + choice = data["choices"][0] + + if "message" in choice: + content = choice["message"].get("content", "") + elif "text" in choice: + content = choice.get("text", "") + else: + raise ValueError(f"Unexpected response format from OpenRouter: {choice}") + + # Extract usage information if available + usage = None + if "usage" in data: + usage = CompletionUsage( + prompt_tokens=data["usage"].get("prompt_tokens", 0), + completion_tokens=data["usage"].get("completion_tokens", 0), + total_tokens=data["usage"].get("total_tokens", 0) + ) + + # Create and return the GeneratorOutput + return GeneratorOutput( + data=content, + usage=usage, + raw_response=data + ) + + except Exception as e_proc: + log.error(f"Error processing OpenRouter completion response: {str(e_proc)}") + raise + + def _process_streaming_response(self, response): + """Process a streaming response from OpenRouter.""" + try: + log.info("Starting to process streaming response from OpenRouter") + buffer = "" + + for chunk in response.iter_content(chunk_size=1024, decode_unicode=True): + try: + # Add chunk to buffer + buffer += chunk + + # Process complete lines in the buffer + while '\n' in buffer: + line, buffer = buffer.split('\n', 1) + line = line.strip() + + if not line: + continue + + log.debug(f"Processing line: {line}") + + # Skip SSE comments (lines starting with :) + if line.startswith(':'): + log.debug(f"Skipping SSE comment: {line}") + continue + + if line.startswith("data: "): + data = line[6:] # Remove "data: " prefix + + # Check for stream end + if data == "[DONE]": + log.info("Received [DONE] marker") + break + + try: + data_obj = json.loads(data) + log.debug(f"Parsed JSON data: {data_obj}") + + # Extract content from delta + if "choices" in data_obj and len(data_obj["choices"]) > 0: + choice = data_obj["choices"][0] + + if "delta" in choice and "content" in choice["delta"] and choice["delta"]["content"]: + content = choice["delta"]["content"] + log.debug(f"Yielding delta content: {content}") + yield content + elif "text" in choice: + log.debug(f"Yielding text content: {choice['text']}") + yield choice["text"] + else: + log.debug(f"No content found in choice: {choice}") + else: + log.debug(f"No choices found in data: {data_obj}") + + except json.JSONDecodeError: + log.warning(f"Failed to parse SSE data: {data}") + continue + except Exception as e_chunk: + log.error(f"Error processing streaming chunk: {str(e_chunk)}") + yield f"Error processing response chunk: {str(e_chunk)}" + except Exception as e_stream: + log.error(f"Error in streaming response: {str(e_stream)}") + yield f"Error in streaming response: {str(e_stream)}" + + async def _process_async_streaming_response(self, response): + """Process an asynchronous streaming response from OpenRouter.""" + buffer = "" + try: + log.info("Starting to process async streaming response from OpenRouter") + async for chunk in response.content: + try: + # Convert bytes to string and add to buffer + if isinstance(chunk, bytes): + chunk_str = chunk.decode('utf-8') + else: + chunk_str = str(chunk) + + buffer += chunk_str + + # Process complete lines in the buffer + while '\n' in buffer: + line, buffer = buffer.split('\n', 1) + line = line.strip() + + if not line: + continue + + log.debug(f"Processing line: {line}") + + # Skip SSE comments (lines starting with :) + if line.startswith(':'): + log.debug(f"Skipping SSE comment: {line}") + continue + + if line.startswith("data: "): + data = line[6:] # Remove "data: " prefix + + # Check for stream end + if data == "[DONE]": + log.info("Received [DONE] marker") + break + + try: + data_obj = json.loads(data) + log.debug(f"Parsed JSON data: {data_obj}") + + # Extract content from delta + if "choices" in data_obj and len(data_obj["choices"]) > 0: + choice = data_obj["choices"][0] + + if "delta" in choice and "content" in choice["delta"] and choice["delta"]["content"]: + content = choice["delta"]["content"] + log.debug(f"Yielding delta content: {content}") + yield content + elif "text" in choice: + log.debug(f"Yielding text content: {choice['text']}") + yield choice["text"] + else: + log.debug(f"No content found in choice: {choice}") + else: + log.debug(f"No choices found in data: {data_obj}") + + except json.JSONDecodeError: + log.warning(f"Failed to parse SSE data: {data}") + continue + except Exception as e_chunk: + log.error(f"Error processing streaming chunk: {str(e_chunk)}") + yield f"Error processing response chunk: {str(e_chunk)}" + except Exception as e_stream: + log.error(f"Error in async streaming response: {str(e_stream)}") + yield f"Error in streaming response: {str(e_stream)}" diff --git a/reference-deepwiki/api/prompts.py b/reference-deepwiki/api/prompts.py new file mode 100644 index 0000000..61ef0a4 --- /dev/null +++ b/reference-deepwiki/api/prompts.py @@ -0,0 +1,191 @@ +"""Module containing all prompts used in the DeepWiki project.""" + +# System prompt for RAG +RAG_SYSTEM_PROMPT = r""" +You are a code assistant which answers user questions on a Github Repo. +You will receive user query, relevant context, and past conversation history. + +LANGUAGE DETECTION AND RESPONSE: +- Detect the language of the user's query +- Respond in the SAME language as the user's query +- IMPORTANT:If a specific language is requested in the prompt, prioritize that language over the query language + +FORMAT YOUR RESPONSE USING MARKDOWN: +- Use proper markdown syntax for all formatting +- For code blocks, use triple backticks with language specification (```python, ```javascript, etc.) +- Use ## headings for major sections +- Use bullet points or numbered lists where appropriate +- Format tables using markdown table syntax when presenting structured data +- Use **bold** and *italic* for emphasis +- When referencing file paths, use `inline code` formatting + +IMPORTANT FORMATTING RULES: +1. DO NOT include ```markdown fences at the beginning or end of your answer +2. Start your response directly with the content +3. The content will already be rendered as markdown, so just provide the raw markdown content + +Think step by step and ensure your answer is well-structured and visually organized. +""" + +# Template for RAG +RAG_TEMPLATE = r""" +{system_prompt} +{output_format_str} + +{# OrderedDict of DialogTurn #} +{% if conversation_history %} + +{% for key, dialog_turn in conversation_history.items() %} +{{key}}. +User: {{dialog_turn.user_query.query_str}} +You: {{dialog_turn.assistant_response.response_str}} +{% endfor %} + +{% endif %} +{% if contexts %} + +{% for context in contexts %} +{{loop.index}}. +File Path: {{context.meta_data.get('file_path', 'unknown')}} +Content: {{context.text}} +{% endfor %} + +{% endif %} + +{{input_str}} + +""" + +# System prompts for simple chat +DEEP_RESEARCH_FIRST_ITERATION_PROMPT = """ +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are conducting a multi-turn Deep Research process to thoroughly investigate the specific topic in the user's query. +Your goal is to provide detailed, focused information EXCLUSIVELY about this topic. +IMPORTANT:You MUST respond in {language_name} language. + + + +- This is the first iteration of a multi-turn research process focused EXCLUSIVELY on the user's query +- Start your response with "## Research Plan" +- Outline your approach to investigating this specific topic +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- Clearly state the specific topic you're researching to maintain focus throughout all iterations +- Identify the key aspects you'll need to research +- Provide initial findings based on the information available +- End with "## Next Steps" indicating what you'll investigate in the next iteration +- Do NOT provide a final conclusion yet - this is just the beginning of the research +- Do NOT include general repository information unless directly relevant to the query +- Focus EXCLUSIVELY on the specific topic being researched - do not drift to related topics +- Your research MUST directly address the original question +- NEVER respond with just "Continue the research" as an answer - always provide substantive research findings +- Remember that this topic will be maintained across all research iterations + + +""" + +DEEP_RESEARCH_FINAL_ITERATION_PROMPT = """ +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are in the final iteration of a Deep Research process focused EXCLUSIVELY on the latest user query. +Your goal is to synthesize all previous findings and provide a comprehensive conclusion that directly addresses this specific topic and ONLY this topic. +IMPORTANT:You MUST respond in {language_name} language. + + + +- This is the final iteration of the research process +- CAREFULLY review the entire conversation history to understand all previous findings +- Synthesize ALL findings from previous iterations into a comprehensive conclusion +- Start with "## Final Conclusion" +- Your conclusion MUST directly address the original question +- Stay STRICTLY focused on the specific topic - do not drift to related topics +- Include specific code references and implementation details related to the topic +- Highlight the most important discoveries and insights about this specific functionality +- Provide a complete and definitive answer to the original question +- Do NOT include general repository information unless directly relevant to the query +- Focus exclusively on the specific topic being researched +- NEVER respond with "Continue the research" as an answer - always provide a complete conclusion +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- Ensure your conclusion builds on and references key findings from previous iterations + + +""" + +DEEP_RESEARCH_INTERMEDIATE_ITERATION_PROMPT = """ +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are currently in iteration {research_iteration} of a Deep Research process focused EXCLUSIVELY on the latest user query. +Your goal is to build upon previous research iterations and go deeper into this specific topic without deviating from it. +IMPORTANT:You MUST respond in {language_name} language. + + + +- CAREFULLY review the conversation history to understand what has been researched so far +- Your response MUST build on previous research iterations - do not repeat information already covered +- Identify gaps or areas that need further exploration related to this specific topic +- Focus on one specific aspect that needs deeper investigation in this iteration +- Start your response with "## Research Update {{research_iteration}}" +- Clearly explain what you're investigating in this iteration +- Provide new insights that weren't covered in previous iterations +- If this is iteration 3, prepare for a final conclusion in the next iteration +- Do NOT include general repository information unless directly relevant to the query +- Focus EXCLUSIVELY on the specific topic being researched - do not drift to related topics +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- NEVER respond with just "Continue the research" as an answer - always provide substantive research findings +- Your research MUST directly address the original question +- Maintain continuity with previous research iterations - this is a continuous investigation + + +""" + +SIMPLE_CHAT_SYSTEM_PROMPT = """ +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You provide direct, concise, and accurate information about code repositories. +You NEVER start responses with markdown headers or code fences. +IMPORTANT:You MUST respond in {language_name} language. + + + +- Answer the user's question directly without ANY preamble or filler phrases +- DO NOT include any rationale, explanation, or extra comments. +- DO NOT start with preambles like "Okay, here's a breakdown" or "Here's an explanation" +- DO NOT start with markdown headers like "## Analysis of..." or any file path references +- DO NOT start with ```markdown code fences +- DO NOT end your response with ``` closing fences +- DO NOT start by repeating or acknowledging the question +- JUST START with the direct answer to the question + + +```markdown +## Analysis of `adalflow/adalflow/datasets/gsm8k.py` + +This file contains... +``` + + +- Format your response with proper markdown including headings, lists, and code blocks WITHIN your answer +- For code analysis, organize your response with clear sections +- Think step by step and structure your answer logically +- Start with the most relevant information that directly addresses the user's query +- Be precise and technical when discussing code +- Your response language should be in the same language as the user's query + + +""" diff --git a/reference-deepwiki/api/rag.py b/reference-deepwiki/api/rag.py new file mode 100644 index 0000000..6908a93 --- /dev/null +++ b/reference-deepwiki/api/rag.py @@ -0,0 +1,445 @@ +import logging +import weakref +import re +from dataclasses import dataclass +from typing import Any, List, Tuple, Dict +from uuid import uuid4 + +import adalflow as adal + +from api.tools.embedder import get_embedder +from api.prompts import RAG_SYSTEM_PROMPT as system_prompt, RAG_TEMPLATE + +# Create our own implementation of the conversation classes +@dataclass +class UserQuery: + query_str: str + +@dataclass +class AssistantResponse: + response_str: str + +@dataclass +class DialogTurn: + id: str + user_query: UserQuery + assistant_response: AssistantResponse + +class CustomConversation: + """Custom implementation of Conversation to fix the list assignment index out of range error""" + + def __init__(self): + self.dialog_turns = [] + + def append_dialog_turn(self, dialog_turn): + """Safely append a dialog turn to the conversation""" + if not hasattr(self, 'dialog_turns'): + self.dialog_turns = [] + self.dialog_turns.append(dialog_turn) + +# Import other adalflow components +from adalflow.components.retriever.faiss_retriever import FAISSRetriever +from api.config import configs +from api.data_pipeline import DatabaseManager + +# Configure logging +logger = logging.getLogger(__name__) + +# Maximum token limit for embedding models +MAX_INPUT_TOKENS = 7500 # Safe threshold below 8192 token limit + +class Memory(adal.core.component.DataComponent): + """Simple conversation management with a list of dialog turns.""" + + def __init__(self): + super().__init__() + # Use our custom implementation instead of the original Conversation class + self.current_conversation = CustomConversation() + + def call(self) -> Dict: + """Return the conversation history as a dictionary.""" + all_dialog_turns = {} + try: + # Check if dialog_turns exists and is a list + if hasattr(self.current_conversation, 'dialog_turns'): + if self.current_conversation.dialog_turns: + logger.info(f"Memory content: {len(self.current_conversation.dialog_turns)} turns") + for i, turn in enumerate(self.current_conversation.dialog_turns): + if hasattr(turn, 'id') and turn.id is not None: + all_dialog_turns[turn.id] = turn + logger.info(f"Added turn {i+1} with ID {turn.id} to memory") + else: + logger.warning(f"Skipping invalid turn object in memory: {turn}") + else: + logger.info("Dialog turns list exists but is empty") + else: + logger.info("No dialog_turns attribute in current_conversation") + # Try to initialize it + self.current_conversation.dialog_turns = [] + except Exception as e: + logger.error(f"Error accessing dialog turns: {str(e)}") + # Try to recover + try: + self.current_conversation = CustomConversation() + logger.info("Recovered by creating new conversation") + except Exception as e2: + logger.error(f"Failed to recover: {str(e2)}") + + logger.info(f"Returning {len(all_dialog_turns)} dialog turns from memory") + return all_dialog_turns + + def add_dialog_turn(self, user_query: str, assistant_response: str) -> bool: + """ + Add a dialog turn to the conversation history. + + Args: + user_query: The user's query + assistant_response: The assistant's response + + Returns: + bool: True if successful, False otherwise + """ + try: + # Create a new dialog turn using our custom implementation + dialog_turn = DialogTurn( + id=str(uuid4()), + user_query=UserQuery(query_str=user_query), + assistant_response=AssistantResponse(response_str=assistant_response), + ) + + # Make sure the current_conversation has the append_dialog_turn method + if not hasattr(self.current_conversation, 'append_dialog_turn'): + logger.warning("current_conversation does not have append_dialog_turn method, creating new one") + # Initialize a new conversation if needed + self.current_conversation = CustomConversation() + + # Ensure dialog_turns exists + if not hasattr(self.current_conversation, 'dialog_turns'): + logger.warning("dialog_turns not found, initializing empty list") + self.current_conversation.dialog_turns = [] + + # Safely append the dialog turn + self.current_conversation.dialog_turns.append(dialog_turn) + logger.info(f"Successfully added dialog turn, now have {len(self.current_conversation.dialog_turns)} turns") + return True + + except Exception as e: + logger.error(f"Error adding dialog turn: {str(e)}") + # Try to recover by creating a new conversation + try: + self.current_conversation = CustomConversation() + dialog_turn = DialogTurn( + id=str(uuid4()), + user_query=UserQuery(query_str=user_query), + assistant_response=AssistantResponse(response_str=assistant_response), + ) + self.current_conversation.dialog_turns.append(dialog_turn) + logger.info("Recovered from error by creating new conversation") + return True + except Exception as e2: + logger.error(f"Failed to recover from error: {str(e2)}") + return False + + +from dataclasses import dataclass, field + +@dataclass +class RAGAnswer(adal.DataClass): + rationale: str = field(default="", metadata={"desc": "Chain of thoughts for the answer."}) + answer: str = field(default="", metadata={"desc": "Answer to the user query, formatted in markdown for beautiful rendering with react-markdown. DO NOT include ``` triple backticks fences at the beginning or end of your answer."}) + + __output_fields__ = ["rationale", "answer"] + +class RAG(adal.Component): + """RAG with one repo. + If you want to load a new repos, call prepare_retriever(repo_url_or_path) first.""" + + def __init__(self, provider="google", model=None, use_s3: bool = False): # noqa: F841 - use_s3 is kept for compatibility + """ + Initialize the RAG component. + + Args: + provider: Model provider to use (google, openai, openrouter, ollama) + model: Model name to use with the provider + use_s3: Whether to use S3 for database storage (default: False) + """ + super().__init__() + + self.provider = provider + self.model = model + + # Import the helper functions + from api.config import get_embedder_config, get_embedder_type + + # Determine embedder type based on current configuration + self.embedder_type = get_embedder_type() + self.is_ollama_embedder = (self.embedder_type == 'ollama') # Backward compatibility + + # Check if Ollama model exists before proceeding + if self.is_ollama_embedder: + from api.ollama_patch import check_ollama_model_exists + from api.config import get_embedder_config + + embedder_config = get_embedder_config() + if embedder_config and embedder_config.get("model_kwargs", {}).get("model"): + model_name = embedder_config["model_kwargs"]["model"] + if not check_ollama_model_exists(model_name): + raise Exception(f"Ollama model '{model_name}' not found. Please run 'ollama pull {model_name}' to install it.") + + # Initialize components + self.memory = Memory() + self.embedder = get_embedder(embedder_type=self.embedder_type) + + self_weakref = weakref.ref(self) + # Patch: ensure query embedding is always single string for Ollama + def single_string_embedder(query): + # Accepts either a string or a list, always returns embedding for a single string + if isinstance(query, list): + if len(query) != 1: + raise ValueError("Ollama embedder only supports a single string") + query = query[0] + instance = self_weakref() + assert instance is not None, "RAG instance is no longer available, but the query embedder was called." + return instance.embedder(input=query) + + # Use single string embedder for Ollama, regular embedder for others + self.query_embedder = single_string_embedder if self.is_ollama_embedder else self.embedder + + self.initialize_db_manager() + + # Set up the output parser + data_parser = adal.DataClassParser(data_class=RAGAnswer, return_data_class=True) + + # Format instructions to ensure proper output structure + format_instructions = data_parser.get_output_format_str() + """ + +IMPORTANT FORMATTING RULES: +1. DO NOT include your thinking or reasoning process in the output +2. Provide only the final, polished answer +3. DO NOT include ```markdown fences at the beginning or end of your answer +4. DO NOT wrap your response in any kind of fences +5. Start your response directly with the content +6. The content will already be rendered as markdown +7. Do not use backslashes before special characters like [ ] { } in your answer +8. When listing tags or similar items, write them as plain text without escape characters +9. For pipe characters (|) in text, write them directly without escaping them""" + + # Get model configuration based on provider and model + from api.config import get_model_config + generator_config = get_model_config(self.provider, self.model) + + # Set up the main generator + self.generator = adal.Generator( + template=RAG_TEMPLATE, + prompt_kwargs={ + "output_format_str": format_instructions, + "conversation_history": self.memory(), + "system_prompt": system_prompt, + "contexts": None, + }, + model_client=generator_config["model_client"](), + model_kwargs=generator_config["model_kwargs"], + output_processors=data_parser, + ) + + + def initialize_db_manager(self): + """Initialize the database manager with local storage""" + self.db_manager = DatabaseManager() + self.transformed_docs = [] + + def _validate_and_filter_embeddings(self, documents: List) -> List: + """ + Validate embeddings and filter out documents with invalid or mismatched embedding sizes. + + Args: + documents: List of documents with embeddings + + Returns: + List of documents with valid embeddings of consistent size + """ + if not documents: + logger.warning("No documents provided for embedding validation") + return [] + + valid_documents = [] + embedding_sizes = {} + + # First pass: collect all embedding sizes and count occurrences + for i, doc in enumerate(documents): + if not hasattr(doc, 'vector') or doc.vector is None: + logger.warning(f"Document {i} has no embedding vector, skipping") + continue + + try: + if isinstance(doc.vector, list): + embedding_size = len(doc.vector) + elif hasattr(doc.vector, 'shape'): + embedding_size = doc.vector.shape[0] if len(doc.vector.shape) == 1 else doc.vector.shape[-1] + elif hasattr(doc.vector, '__len__'): + embedding_size = len(doc.vector) + else: + logger.warning(f"Document {i} has invalid embedding vector type: {type(doc.vector)}, skipping") + continue + + if embedding_size == 0: + logger.warning(f"Document {i} has empty embedding vector, skipping") + continue + + embedding_sizes[embedding_size] = embedding_sizes.get(embedding_size, 0) + 1 + + except Exception as e: + logger.warning(f"Error checking embedding size for document {i}: {str(e)}, skipping") + continue + + if not embedding_sizes: + logger.error("No valid embeddings found in any documents") + return [] + + # Find the most common embedding size (this should be the correct one) + target_size = max(embedding_sizes.keys(), key=lambda k: embedding_sizes[k]) + logger.info(f"Target embedding size: {target_size} (found in {embedding_sizes[target_size]} documents)") + + # Log all embedding sizes found + for size, count in embedding_sizes.items(): + if size != target_size: + logger.warning(f"Found {count} documents with incorrect embedding size {size}, will be filtered out") + + # Second pass: filter documents with the target embedding size + for i, doc in enumerate(documents): + if not hasattr(doc, 'vector') or doc.vector is None: + continue + + try: + if isinstance(doc.vector, list): + embedding_size = len(doc.vector) + elif hasattr(doc.vector, 'shape'): + embedding_size = doc.vector.shape[0] if len(doc.vector.shape) == 1 else doc.vector.shape[-1] + elif hasattr(doc.vector, '__len__'): + embedding_size = len(doc.vector) + else: + continue + + if embedding_size == target_size: + valid_documents.append(doc) + else: + # Log which document is being filtered out + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.warning(f"Filtering out document '{file_path}' due to embedding size mismatch: {embedding_size} != {target_size}") + + except Exception as e: + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.warning(f"Error validating embedding for document '{file_path}': {str(e)}, skipping") + continue + + logger.info(f"Embedding validation complete: {len(valid_documents)}/{len(documents)} documents have valid embeddings") + + if len(valid_documents) == 0: + logger.error("No documents with valid embeddings remain after filtering") + elif len(valid_documents) < len(documents): + filtered_count = len(documents) - len(valid_documents) + logger.warning(f"Filtered out {filtered_count} documents due to embedding issues") + + return valid_documents + + def prepare_retriever(self, repo_url_or_path: str, type: str = "github", access_token: str = None, + excluded_dirs: List[str] = None, excluded_files: List[str] = None, + included_dirs: List[str] = None, included_files: List[str] = None): + """ + Prepare the retriever for a repository. + Will load database from local storage if available. + + Args: + repo_url_or_path: URL or local path to the repository + access_token: Optional access token for private repositories + excluded_dirs: Optional list of directories to exclude from processing + excluded_files: Optional list of file patterns to exclude from processing + included_dirs: Optional list of directories to include exclusively + included_files: Optional list of file patterns to include exclusively + """ + self.initialize_db_manager() + self.repo_url_or_path = repo_url_or_path + self.transformed_docs = self.db_manager.prepare_database( + repo_url_or_path, + type, + access_token, + embedder_type=self.embedder_type, + excluded_dirs=excluded_dirs, + excluded_files=excluded_files, + included_dirs=included_dirs, + included_files=included_files + ) + logger.info(f"Loaded {len(self.transformed_docs)} documents for retrieval") + + # Validate and filter embeddings to ensure consistent sizes + self.transformed_docs = self._validate_and_filter_embeddings(self.transformed_docs) + + if not self.transformed_docs: + raise ValueError("No valid documents with embeddings found. Cannot create retriever.") + + logger.info(f"Using {len(self.transformed_docs)} documents with valid embeddings for retrieval") + + try: + # Use the appropriate embedder for retrieval + retrieve_embedder = self.query_embedder if self.is_ollama_embedder else self.embedder + self.retriever = FAISSRetriever( + **configs["retriever"], + embedder=retrieve_embedder, + documents=self.transformed_docs, + document_map_func=lambda doc: doc.vector, + ) + logger.info("FAISS retriever created successfully") + except Exception as e: + logger.error(f"Error creating FAISS retriever: {str(e)}") + # Try to provide more specific error information + if "All embeddings should be of the same size" in str(e): + logger.error("Embedding size validation failed. This suggests there are still inconsistent embedding sizes.") + # Log embedding sizes for debugging + sizes = [] + for i, doc in enumerate(self.transformed_docs[:10]): # Check first 10 docs + if hasattr(doc, 'vector') and doc.vector is not None: + try: + if isinstance(doc.vector, list): + size = len(doc.vector) + elif hasattr(doc.vector, 'shape'): + size = doc.vector.shape[0] if len(doc.vector.shape) == 1 else doc.vector.shape[-1] + elif hasattr(doc.vector, '__len__'): + size = len(doc.vector) + else: + size = "unknown" + sizes.append(f"doc_{i}: {size}") + except: + sizes.append(f"doc_{i}: error") + logger.error(f"Sample embedding sizes: {', '.join(sizes)}") + raise + + def call(self, query: str, language: str = "en") -> Tuple[List]: + """ + Process a query using RAG. + + Args: + query: The user's query + + Returns: + Tuple of (RAGAnswer, retrieved_documents) + """ + try: + retrieved_documents = self.retriever(query) + + # Fill in the documents + retrieved_documents[0].documents = [ + self.transformed_docs[doc_index] + for doc_index in retrieved_documents[0].doc_indices + ] + + return retrieved_documents + + except Exception as e: + logger.error(f"Error in RAG call: {str(e)}") + + # Create error response + error_response = RAGAnswer( + rationale="Error occurred while processing the query.", + answer=f"I apologize, but I encountered an error while processing your question. Please try again or rephrase your question." + ) + return error_response, [] diff --git a/reference-deepwiki/api/requirements.txt b/reference-deepwiki/api/requirements.txt new file mode 100644 index 0000000..2a06956 --- /dev/null +++ b/reference-deepwiki/api/requirements.txt @@ -0,0 +1,20 @@ +fastapi>=0.95.0 +uvicorn[standard]>=0.21.1 +pydantic>=2.0.0 +google-generativeai>=0.3.0 +tiktoken>=0.5.0 +adalflow>=0.1.0 +numpy>=1.24.0 +faiss-cpu>=1.7.4 +langid>=1.1.6 +requests>=2.28.0 +jinja2>=3.1.2 +python-dotenv>=1.0.0 +openai>=1.76.2 +ollama>=0.4.8 +aiohttp>=3.8.4 +boto3>=1.34.0 +websockets>=11.0.3 +azure-identity>=1.12.0 +azure-core>=1.24.0 + diff --git a/reference-deepwiki/api/simple_chat.py b/reference-deepwiki/api/simple_chat.py new file mode 100644 index 0000000..06d329a --- /dev/null +++ b/reference-deepwiki/api/simple_chat.py @@ -0,0 +1,689 @@ +import logging +import os +from typing import List, Optional +from urllib.parse import unquote + +import google.generativeai as genai +from adalflow.components.model_client.ollama_client import OllamaClient +from adalflow.core.types import ModelType +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import StreamingResponse +from pydantic import BaseModel, Field + +from api.config import get_model_config, configs, OPENROUTER_API_KEY, OPENAI_API_KEY, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY +from api.data_pipeline import count_tokens, get_file_content +from api.openai_client import OpenAIClient +from api.openrouter_client import OpenRouterClient +from api.bedrock_client import BedrockClient +from api.azureai_client import AzureAIClient +from api.rag import RAG +from api.prompts import ( + DEEP_RESEARCH_FIRST_ITERATION_PROMPT, + DEEP_RESEARCH_FINAL_ITERATION_PROMPT, + DEEP_RESEARCH_INTERMEDIATE_ITERATION_PROMPT, + SIMPLE_CHAT_SYSTEM_PROMPT +) + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +logger = logging.getLogger(__name__) + + +# Initialize FastAPI app +app = FastAPI( + title="Simple Chat API", + description="Simplified API for streaming chat completions" +) + +# Configure CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Allows all origins + allow_credentials=True, + allow_methods=["*"], # Allows all methods + allow_headers=["*"], # Allows all headers +) + +# Models for the API +class ChatMessage(BaseModel): + role: str # 'user' or 'assistant' + content: str + +class ChatCompletionRequest(BaseModel): + """ + Model for requesting a chat completion. + """ + repo_url: str = Field(..., description="URL of the repository to query") + messages: List[ChatMessage] = Field(..., description="List of chat messages") + filePath: Optional[str] = Field(None, description="Optional path to a file in the repository to include in the prompt") + token: Optional[str] = Field(None, description="Personal access token for private repositories") + type: Optional[str] = Field("github", description="Type of repository (e.g., 'github', 'gitlab', 'bitbucket')") + + # model parameters + provider: str = Field("google", description="Model provider (google, openai, openrouter, ollama, bedrock, azure)") + model: Optional[str] = Field(None, description="Model name for the specified provider") + + language: Optional[str] = Field("en", description="Language for content generation (e.g., 'en', 'ja', 'zh', 'es', 'kr', 'vi')") + excluded_dirs: Optional[str] = Field(None, description="Comma-separated list of directories to exclude from processing") + excluded_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to exclude from processing") + included_dirs: Optional[str] = Field(None, description="Comma-separated list of directories to include exclusively") + included_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to include exclusively") + +@app.post("/chat/completions/stream") +async def chat_completions_stream(request: ChatCompletionRequest): + """Stream a chat completion response directly using Google Generative AI""" + try: + # Check if request contains very large input + input_too_large = False + if request.messages and len(request.messages) > 0: + last_message = request.messages[-1] + if hasattr(last_message, 'content') and last_message.content: + tokens = count_tokens(last_message.content, request.provider == "ollama") + logger.info(f"Request size: {tokens} tokens") + if tokens > 8000: + logger.warning(f"Request exceeds recommended token limit ({tokens} > 7500)") + input_too_large = True + + # Create a new RAG instance for this request + try: + request_rag = RAG(provider=request.provider, model=request.model) + + # Extract custom file filter parameters if provided + excluded_dirs = None + excluded_files = None + included_dirs = None + included_files = None + + if request.excluded_dirs: + excluded_dirs = [unquote(dir_path) for dir_path in request.excluded_dirs.split('\n') if dir_path.strip()] + logger.info(f"Using custom excluded directories: {excluded_dirs}") + if request.excluded_files: + excluded_files = [unquote(file_pattern) for file_pattern in request.excluded_files.split('\n') if file_pattern.strip()] + logger.info(f"Using custom excluded files: {excluded_files}") + if request.included_dirs: + included_dirs = [unquote(dir_path) for dir_path in request.included_dirs.split('\n') if dir_path.strip()] + logger.info(f"Using custom included directories: {included_dirs}") + if request.included_files: + included_files = [unquote(file_pattern) for file_pattern in request.included_files.split('\n') if file_pattern.strip()] + logger.info(f"Using custom included files: {included_files}") + + request_rag.prepare_retriever(request.repo_url, request.type, request.token, excluded_dirs, excluded_files, included_dirs, included_files) + logger.info(f"Retriever prepared for {request.repo_url}") + except ValueError as e: + if "No valid documents with embeddings found" in str(e): + logger.error(f"No valid embeddings found: {str(e)}") + raise HTTPException(status_code=500, detail="No valid document embeddings found. This may be due to embedding size inconsistencies or API errors during document processing. Please try again or check your repository content.") + else: + logger.error(f"ValueError preparing retriever: {str(e)}") + raise HTTPException(status_code=500, detail=f"Error preparing retriever: {str(e)}") + except Exception as e: + logger.error(f"Error preparing retriever: {str(e)}") + # Check for specific embedding-related errors + if "All embeddings should be of the same size" in str(e): + raise HTTPException(status_code=500, detail="Inconsistent embedding sizes detected. Some documents may have failed to embed properly. Please try again.") + else: + raise HTTPException(status_code=500, detail=f"Error preparing retriever: {str(e)}") + + # Validate request + if not request.messages or len(request.messages) == 0: + raise HTTPException(status_code=400, detail="No messages provided") + + last_message = request.messages[-1] + if last_message.role != "user": + raise HTTPException(status_code=400, detail="Last message must be from the user") + + # Process previous messages to build conversation history + for i in range(0, len(request.messages) - 1, 2): + if i + 1 < len(request.messages): + user_msg = request.messages[i] + assistant_msg = request.messages[i + 1] + + if user_msg.role == "user" and assistant_msg.role == "assistant": + request_rag.memory.add_dialog_turn( + user_query=user_msg.content, + assistant_response=assistant_msg.content + ) + + # Check if this is a Deep Research request + is_deep_research = False + research_iteration = 1 + + # Process messages to detect Deep Research requests + for msg in request.messages: + if hasattr(msg, 'content') and msg.content and "[DEEP RESEARCH]" in msg.content: + is_deep_research = True + # Only remove the tag from the last message + if msg == request.messages[-1]: + # Remove the Deep Research tag + msg.content = msg.content.replace("[DEEP RESEARCH]", "").strip() + + # Count research iterations if this is a Deep Research request + if is_deep_research: + research_iteration = sum(1 for msg in request.messages if msg.role == 'assistant') + 1 + logger.info(f"Deep Research request detected - iteration {research_iteration}") + + # Check if this is a continuation request + if "continue" in last_message.content.lower() and "research" in last_message.content.lower(): + # Find the original topic from the first user message + original_topic = None + for msg in request.messages: + if msg.role == "user" and "continue" not in msg.content.lower(): + original_topic = msg.content.replace("[DEEP RESEARCH]", "").strip() + logger.info(f"Found original research topic: {original_topic}") + break + + if original_topic: + # Replace the continuation message with the original topic + last_message.content = original_topic + logger.info(f"Using original topic for research: {original_topic}") + + # Get the query from the last message + query = last_message.content + + # Only retrieve documents if input is not too large + context_text = "" + retrieved_documents = None + + if not input_too_large: + try: + # If filePath exists, modify the query for RAG to focus on the file + rag_query = query + if request.filePath: + # Use the file path to get relevant context about the file + rag_query = f"Contexts related to {request.filePath}" + logger.info(f"Modified RAG query to focus on file: {request.filePath}") + + # Try to perform RAG retrieval + try: + # This will use the actual RAG implementation + retrieved_documents = request_rag(rag_query, language=request.language) + + if retrieved_documents and retrieved_documents[0].documents: + # Format context for the prompt in a more structured way + documents = retrieved_documents[0].documents + logger.info(f"Retrieved {len(documents)} documents") + + # Group documents by file path + docs_by_file = {} + for doc in documents: + file_path = doc.meta_data.get('file_path', 'unknown') + if file_path not in docs_by_file: + docs_by_file[file_path] = [] + docs_by_file[file_path].append(doc) + + # Format context text with file path grouping + context_parts = [] + for file_path, docs in docs_by_file.items(): + # Add file header with metadata + header = f"## File Path: {file_path}\n\n" + # Add document content + content = "\n\n".join([doc.text for doc in docs]) + + context_parts.append(f"{header}{content}") + + # Join all parts with clear separation + context_text = "\n\n" + "-" * 10 + "\n\n".join(context_parts) + else: + logger.warning("No documents retrieved from RAG") + except Exception as e: + logger.error(f"Error in RAG retrieval: {str(e)}") + # Continue without RAG if there's an error + + except Exception as e: + logger.error(f"Error retrieving documents: {str(e)}") + context_text = "" + + # Get repository information + repo_url = request.repo_url + repo_name = repo_url.split("/")[-1] if "/" in repo_url else repo_url + + # Determine repository type + repo_type = request.type + + # Get language information + language_code = request.language or configs["lang_config"]["default"] + supported_langs = configs["lang_config"]["supported_languages"] + language_name = supported_langs.get(language_code, "English") + + # Create system prompt + if is_deep_research: + # Check if this is the first iteration + is_first_iteration = research_iteration == 1 + + # Check if this is the final iteration + is_final_iteration = research_iteration >= 5 + + if is_first_iteration: + system_prompt = DEEP_RESEARCH_FIRST_ITERATION_PROMPT.format( + repo_type=repo_type, + repo_url=repo_url, + repo_name=repo_name, + language_name=language_name + ) + elif is_final_iteration: + system_prompt = DEEP_RESEARCH_FINAL_ITERATION_PROMPT.format( + repo_type=repo_type, + repo_url=repo_url, + repo_name=repo_name, + research_iteration=research_iteration, + language_name=language_name + ) + else: + system_prompt = DEEP_RESEARCH_INTERMEDIATE_ITERATION_PROMPT.format( + repo_type=repo_type, + repo_url=repo_url, + repo_name=repo_name, + research_iteration=research_iteration, + language_name=language_name + ) + else: + system_prompt = SIMPLE_CHAT_SYSTEM_PROMPT.format( + repo_type=repo_type, + repo_url=repo_url, + repo_name=repo_name, + language_name=language_name + ) + + # Fetch file content if provided + file_content = "" + if request.filePath: + try: + file_content = get_file_content(request.repo_url, request.filePath, request.type, request.token) + logger.info(f"Successfully retrieved content for file: {request.filePath}") + except Exception as e: + logger.error(f"Error retrieving file content: {str(e)}") + # Continue without file content if there's an error + + # Format conversation history + conversation_history = "" + for turn_id, turn in request_rag.memory().items(): + if not isinstance(turn_id, int) and hasattr(turn, 'user_query') and hasattr(turn, 'assistant_response'): + conversation_history += f"\n{turn.user_query.query_str}\n{turn.assistant_response.response_str}\n\n" + + # Create the prompt with context + prompt = f"/no_think {system_prompt}\n\n" + + if conversation_history: + prompt += f"\n{conversation_history}\n\n" + + # Check if filePath is provided and fetch file content if it exists + if file_content: + # Add file content to the prompt after conversation history + prompt += f"\n{file_content}\n\n\n" + + # Only include context if it's not empty + CONTEXT_START = "" + CONTEXT_END = "" + if context_text.strip(): + prompt += f"{CONTEXT_START}\n{context_text}\n{CONTEXT_END}\n\n" + else: + # Add a note that we're skipping RAG due to size constraints or because it's the isolated API + logger.info("No context available from RAG") + prompt += "Answering without retrieval augmentation.\n\n" + + prompt += f"\n{query}\n\n\nAssistant: " + + model_config = get_model_config(request.provider, request.model)["model_kwargs"] + + if request.provider == "ollama": + prompt += " /no_think" + + model = OllamaClient() + model_kwargs = { + "model": model_config["model"], + "stream": True, + "options": { + "temperature": model_config["temperature"], + "top_p": model_config["top_p"], + "num_ctx": model_config["num_ctx"] + } + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "openrouter": + logger.info(f"Using OpenRouter with model: {request.model}") + + # Check if OpenRouter API key is set + if not OPENROUTER_API_KEY: + logger.warning("OPENROUTER_API_KEY not configured, but continuing with request") + # We'll let the OpenRouterClient handle this and return a friendly error message + + model = OpenRouterClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"] + } + # Only add top_p if it exists in the model config + if "top_p" in model_config: + model_kwargs["top_p"] = model_config["top_p"] + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "openai": + logger.info(f"Using Openai protocol with model: {request.model}") + + # Check if an API key is set for Openai + if not OPENAI_API_KEY: + logger.warning("OPENAI_API_KEY not configured, but continuing with request") + # We'll let the OpenAIClient handle this and return an error message + + # Initialize Openai client + model = OpenAIClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"] + } + # Only add top_p if it exists in the model config + if "top_p" in model_config: + model_kwargs["top_p"] = model_config["top_p"] + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "bedrock": + logger.info(f"Using AWS Bedrock with model: {request.model}") + + # Check if AWS credentials are set + if not AWS_ACCESS_KEY_ID or not AWS_SECRET_ACCESS_KEY: + logger.warning("AWS_ACCESS_KEY_ID or AWS_SECRET_ACCESS_KEY not configured, but continuing with request") + # We'll let the BedrockClient handle this and return an error message + + # Initialize Bedrock client + model = BedrockClient() + model_kwargs = { + "model": request.model, + "temperature": model_config["temperature"], + "top_p": model_config["top_p"] + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "azure": + logger.info(f"Using Azure AI with model: {request.model}") + + # Initialize Azure AI client + model = AzureAIClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"], + "top_p": model_config["top_p"] + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + else: + # Initialize Google Generative AI model + model = genai.GenerativeModel( + model_name=model_config["model"], + generation_config={ + "temperature": model_config["temperature"], + "top_p": model_config["top_p"], + "top_k": model_config["top_k"] + } + ) + + # Create a streaming response + async def response_stream(): + try: + if request.provider == "ollama": + # Get the response and handle it properly using the previously created api_kwargs + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Ollama + async for chunk in response: + text = getattr(chunk, 'response', None) or getattr(chunk, 'text', None) or str(chunk) + if text and not text.startswith('model=') and not text.startswith('created_at='): + text = text.replace('', '').replace('', '') + yield text + elif request.provider == "openrouter": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making OpenRouter API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from OpenRouter + async for chunk in response: + yield chunk + except Exception as e_openrouter: + logger.error(f"Error with OpenRouter API: {str(e_openrouter)}") + yield f"\nError with OpenRouter API: {str(e_openrouter)}\n\nPlease check that you have set the OPENROUTER_API_KEY environment variable with a valid API key." + elif request.provider == "openai": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making Openai API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Openai + async for chunk in response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + yield text + except Exception as e_openai: + logger.error(f"Error with Openai API: {str(e_openai)}") + yield f"\nError with Openai API: {str(e_openai)}\n\nPlease check that you have set the OPENAI_API_KEY environment variable with a valid API key." + elif request.provider == "bedrock": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making AWS Bedrock API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle response from Bedrock (not streaming yet) + if isinstance(response, str): + yield response + else: + # Try to extract text from the response + yield str(response) + except Exception as e_bedrock: + logger.error(f"Error with AWS Bedrock API: {str(e_bedrock)}") + yield f"\nError with AWS Bedrock API: {str(e_bedrock)}\n\nPlease check that you have set the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables with valid credentials." + elif request.provider == "azure": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making Azure AI API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Azure AI + async for chunk in response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + yield text + except Exception as e_azure: + logger.error(f"Error with Azure AI API: {str(e_azure)}") + yield f"\nError with Azure AI API: {str(e_azure)}\n\nPlease check that you have set the AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_VERSION environment variables with valid values." + else: + # Generate streaming response + response = model.generate_content(prompt, stream=True) + # Stream the response + for chunk in response: + if hasattr(chunk, 'text'): + yield chunk.text + + except Exception as e_outer: + logger.error(f"Error in streaming response: {str(e_outer)}") + error_message = str(e_outer) + + # Check for token limit errors + if "maximum context length" in error_message or "token limit" in error_message or "too many tokens" in error_message: + # If we hit a token limit error, try again without context + logger.warning("Token limit exceeded, retrying without context") + try: + # Create a simplified prompt without context + simplified_prompt = f"/no_think {system_prompt}\n\n" + if conversation_history: + simplified_prompt += f"\n{conversation_history}\n\n" + + # Include file content in the fallback prompt if it was retrieved + if request.filePath and file_content: + simplified_prompt += f"\n{file_content}\n\n\n" + + simplified_prompt += "Answering without retrieval augmentation due to input size constraints.\n\n" + simplified_prompt += f"\n{query}\n\n\nAssistant: " + + if request.provider == "ollama": + simplified_prompt += " /no_think" + + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from Ollama + async for chunk in fallback_response: + text = getattr(chunk, 'response', None) or getattr(chunk, 'text', None) or str(chunk) + if text and not text.startswith('model=') and not text.startswith('created_at='): + text = text.replace('', '').replace('', '') + yield text + elif request.provider == "openrouter": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback OpenRouter API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from OpenRouter + async for chunk in fallback_response: + yield chunk + except Exception as e_fallback: + logger.error(f"Error with OpenRouter API fallback: {str(e_fallback)}") + yield f"\nError with OpenRouter API fallback: {str(e_fallback)}\n\nPlease check that you have set the OPENROUTER_API_KEY environment variable with a valid API key." + elif request.provider == "openai": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback Openai API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from Openai + async for chunk in fallback_response: + text = chunk if isinstance(chunk, str) else getattr(chunk, 'text', str(chunk)) + yield text + except Exception as e_fallback: + logger.error(f"Error with Openai API fallback: {str(e_fallback)}") + yield f"\nError with Openai API fallback: {str(e_fallback)}\n\nPlease check that you have set the OPENAI_API_KEY environment variable with a valid API key." + elif request.provider == "bedrock": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback AWS Bedrock API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle response from Bedrock + if isinstance(fallback_response, str): + yield fallback_response + else: + # Try to extract text from the response + yield str(fallback_response) + except Exception as e_fallback: + logger.error(f"Error with AWS Bedrock API fallback: {str(e_fallback)}") + yield f"\nError with AWS Bedrock API fallback: {str(e_fallback)}\n\nPlease check that you have set the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables with valid credentials." + elif request.provider == "azure": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback Azure AI API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback response from Azure AI + async for chunk in fallback_response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + yield text + except Exception as e_fallback: + logger.error(f"Error with Azure AI API fallback: {str(e_fallback)}") + yield f"\nError with Azure AI API fallback: {str(e_fallback)}\n\nPlease check that you have set the AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_VERSION environment variables with valid values." + else: + # Initialize Google Generative AI model + model_config = get_model_config(request.provider, request.model) + fallback_model = genai.GenerativeModel( + model_name=model_config["model"], + generation_config={ + "temperature": model_config["model_kwargs"].get("temperature", 0.7), + "top_p": model_config["model_kwargs"].get("top_p", 0.8), + "top_k": model_config["model_kwargs"].get("top_k", 40) + } + ) + + # Get streaming response using simplified prompt + fallback_response = fallback_model.generate_content(simplified_prompt, stream=True) + # Stream the fallback response + for chunk in fallback_response: + if hasattr(chunk, 'text'): + yield chunk.text + except Exception as e2: + logger.error(f"Error in fallback streaming response: {str(e2)}") + yield f"\nI apologize, but your request is too large for me to process. Please try a shorter query or break it into smaller parts." + else: + # For other errors, return the error message + yield f"\nError: {error_message}" + + # Return streaming response + return StreamingResponse(response_stream(), media_type="text/event-stream") + + except HTTPException: + raise + except Exception as e_handler: + error_msg = f"Error in streaming chat completion: {str(e_handler)}" + logger.error(error_msg) + raise HTTPException(status_code=500, detail=error_msg) + +@app.get("/") +async def root(): + """Root endpoint to check if the API is running""" + return {"status": "API is running", "message": "Navigate to /docs for API documentation"} diff --git a/reference-deepwiki/api/tools/embedder.py b/reference-deepwiki/api/tools/embedder.py new file mode 100644 index 0000000..fcdab3d --- /dev/null +++ b/reference-deepwiki/api/tools/embedder.py @@ -0,0 +1,54 @@ +import adalflow as adal + +from api.config import configs, get_embedder_type + + +def get_embedder(is_local_ollama: bool = False, use_google_embedder: bool = False, embedder_type: str = None) -> adal.Embedder: + """Get embedder based on configuration or parameters. + + Args: + is_local_ollama: Legacy parameter for Ollama embedder + use_google_embedder: Legacy parameter for Google embedder + embedder_type: Direct specification of embedder type ('ollama', 'google', 'openai') + + Returns: + adal.Embedder: Configured embedder instance + """ + # Determine which embedder config to use + if embedder_type: + if embedder_type == 'ollama': + embedder_config = configs["embedder_ollama"] + elif embedder_type == 'google': + embedder_config = configs["embedder_google"] + else: # default to openai + embedder_config = configs["embedder"] + elif is_local_ollama: + embedder_config = configs["embedder_ollama"] + elif use_google_embedder: + embedder_config = configs["embedder_google"] + else: + # Auto-detect based on current configuration + current_type = get_embedder_type() + if current_type == 'ollama': + embedder_config = configs["embedder_ollama"] + elif current_type == 'google': + embedder_config = configs["embedder_google"] + else: + embedder_config = configs["embedder"] + + # --- Initialize Embedder --- + model_client_class = embedder_config["model_client"] + if "initialize_kwargs" in embedder_config: + model_client = model_client_class(**embedder_config["initialize_kwargs"]) + else: + model_client = model_client_class() + + # Create embedder with basic parameters + embedder_kwargs = {"model_client": model_client, "model_kwargs": embedder_config["model_kwargs"]} + + embedder = adal.Embedder(**embedder_kwargs) + + # Set batch_size as an attribute if available (not a constructor parameter) + if "batch_size" in embedder_config: + embedder.batch_size = embedder_config["batch_size"] + return embedder diff --git a/reference-deepwiki/api/websocket_wiki.py b/reference-deepwiki/api/websocket_wiki.py new file mode 100644 index 0000000..2a7cce9 --- /dev/null +++ b/reference-deepwiki/api/websocket_wiki.py @@ -0,0 +1,769 @@ +import logging +import os +from typing import List, Optional, Dict, Any +from urllib.parse import unquote + +import google.generativeai as genai +from adalflow.components.model_client.ollama_client import OllamaClient +from adalflow.core.types import ModelType +from fastapi import WebSocket, WebSocketDisconnect, HTTPException +from pydantic import BaseModel, Field + +from api.config import get_model_config, configs, OPENROUTER_API_KEY, OPENAI_API_KEY +from api.data_pipeline import count_tokens, get_file_content +from api.openai_client import OpenAIClient +from api.openrouter_client import OpenRouterClient +from api.azureai_client import AzureAIClient +from api.dashscope_client import DashscopeClient +from api.rag import RAG + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +logger = logging.getLogger(__name__) + + +# Models for the API +class ChatMessage(BaseModel): + role: str # 'user' or 'assistant' + content: str + +class ChatCompletionRequest(BaseModel): + """ + Model for requesting a chat completion. + """ + repo_url: str = Field(..., description="URL of the repository to query") + messages: List[ChatMessage] = Field(..., description="List of chat messages") + filePath: Optional[str] = Field(None, description="Optional path to a file in the repository to include in the prompt") + token: Optional[str] = Field(None, description="Personal access token for private repositories") + type: Optional[str] = Field("github", description="Type of repository (e.g., 'github', 'gitlab', 'bitbucket')") + + # model parameters + provider: str = Field("google", description="Model provider (google, openai, openrouter, ollama, azure)") + model: Optional[str] = Field(None, description="Model name for the specified provider") + + language: Optional[str] = Field("en", description="Language for content generation (e.g., 'en', 'ja', 'zh', 'es', 'kr', 'vi')") + excluded_dirs: Optional[str] = Field(None, description="Comma-separated list of directories to exclude from processing") + excluded_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to exclude from processing") + included_dirs: Optional[str] = Field(None, description="Comma-separated list of directories to include exclusively") + included_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to include exclusively") + +async def handle_websocket_chat(websocket: WebSocket): + """ + Handle WebSocket connection for chat completions. + This replaces the HTTP streaming endpoint with a WebSocket connection. + """ + await websocket.accept() + + try: + # Receive and parse the request data + request_data = await websocket.receive_json() + request = ChatCompletionRequest(**request_data) + + # Check if request contains very large input + input_too_large = False + if request.messages and len(request.messages) > 0: + last_message = request.messages[-1] + if hasattr(last_message, 'content') and last_message.content: + tokens = count_tokens(last_message.content, request.provider == "ollama") + logger.info(f"Request size: {tokens} tokens") + if tokens > 8000: + logger.warning(f"Request exceeds recommended token limit ({tokens} > 7500)") + input_too_large = True + + # Create a new RAG instance for this request + try: + request_rag = RAG(provider=request.provider, model=request.model) + + # Extract custom file filter parameters if provided + excluded_dirs = None + excluded_files = None + included_dirs = None + included_files = None + + if request.excluded_dirs: + excluded_dirs = [unquote(dir_path) for dir_path in request.excluded_dirs.split('\n') if dir_path.strip()] + logger.info(f"Using custom excluded directories: {excluded_dirs}") + if request.excluded_files: + excluded_files = [unquote(file_pattern) for file_pattern in request.excluded_files.split('\n') if file_pattern.strip()] + logger.info(f"Using custom excluded files: {excluded_files}") + if request.included_dirs: + included_dirs = [unquote(dir_path) for dir_path in request.included_dirs.split('\n') if dir_path.strip()] + logger.info(f"Using custom included directories: {included_dirs}") + if request.included_files: + included_files = [unquote(file_pattern) for file_pattern in request.included_files.split('\n') if file_pattern.strip()] + logger.info(f"Using custom included files: {included_files}") + + request_rag.prepare_retriever(request.repo_url, request.type, request.token, excluded_dirs, excluded_files, included_dirs, included_files) + logger.info(f"Retriever prepared for {request.repo_url}") + except ValueError as e: + if "No valid documents with embeddings found" in str(e): + logger.error(f"No valid embeddings found: {str(e)}") + await websocket.send_text("Error: No valid document embeddings found. This may be due to embedding size inconsistencies or API errors during document processing. Please try again or check your repository content.") + await websocket.close() + return + else: + logger.error(f"ValueError preparing retriever: {str(e)}") + await websocket.send_text(f"Error preparing retriever: {str(e)}") + await websocket.close() + return + except Exception as e: + logger.error(f"Error preparing retriever: {str(e)}") + # Check for specific embedding-related errors + if "All embeddings should be of the same size" in str(e): + await websocket.send_text("Error: Inconsistent embedding sizes detected. Some documents may have failed to embed properly. Please try again.") + else: + await websocket.send_text(f"Error preparing retriever: {str(e)}") + await websocket.close() + return + + # Validate request + if not request.messages or len(request.messages) == 0: + await websocket.send_text("Error: No messages provided") + await websocket.close() + return + + last_message = request.messages[-1] + if last_message.role != "user": + await websocket.send_text("Error: Last message must be from the user") + await websocket.close() + return + + # Process previous messages to build conversation history + for i in range(0, len(request.messages) - 1, 2): + if i + 1 < len(request.messages): + user_msg = request.messages[i] + assistant_msg = request.messages[i + 1] + + if user_msg.role == "user" and assistant_msg.role == "assistant": + request_rag.memory.add_dialog_turn( + user_query=user_msg.content, + assistant_response=assistant_msg.content + ) + + # Check if this is a Deep Research request + is_deep_research = False + research_iteration = 1 + + # Process messages to detect Deep Research requests + for msg in request.messages: + if hasattr(msg, 'content') and msg.content and "[DEEP RESEARCH]" in msg.content: + is_deep_research = True + # Only remove the tag from the last message + if msg == request.messages[-1]: + # Remove the Deep Research tag + msg.content = msg.content.replace("[DEEP RESEARCH]", "").strip() + + # Count research iterations if this is a Deep Research request + if is_deep_research: + research_iteration = sum(1 for msg in request.messages if msg.role == 'assistant') + 1 + logger.info(f"Deep Research request detected - iteration {research_iteration}") + + # Check if this is a continuation request + if "continue" in last_message.content.lower() and "research" in last_message.content.lower(): + # Find the original topic from the first user message + original_topic = None + for msg in request.messages: + if msg.role == "user" and "continue" not in msg.content.lower(): + original_topic = msg.content.replace("[DEEP RESEARCH]", "").strip() + logger.info(f"Found original research topic: {original_topic}") + break + + if original_topic: + # Replace the continuation message with the original topic + last_message.content = original_topic + logger.info(f"Using original topic for research: {original_topic}") + + # Get the query from the last message + query = last_message.content + + # Only retrieve documents if input is not too large + context_text = "" + retrieved_documents = None + + if not input_too_large: + try: + # If filePath exists, modify the query for RAG to focus on the file + rag_query = query + if request.filePath: + # Use the file path to get relevant context about the file + rag_query = f"Contexts related to {request.filePath}" + logger.info(f"Modified RAG query to focus on file: {request.filePath}") + + # Try to perform RAG retrieval + try: + # This will use the actual RAG implementation + retrieved_documents = request_rag(rag_query, language=request.language) + + if retrieved_documents and retrieved_documents[0].documents: + # Format context for the prompt in a more structured way + documents = retrieved_documents[0].documents + logger.info(f"Retrieved {len(documents)} documents") + + # Group documents by file path + docs_by_file = {} + for doc in documents: + file_path = doc.meta_data.get('file_path', 'unknown') + if file_path not in docs_by_file: + docs_by_file[file_path] = [] + docs_by_file[file_path].append(doc) + + # Format context text with file path grouping + context_parts = [] + for file_path, docs in docs_by_file.items(): + # Add file header with metadata + header = f"## File Path: {file_path}\n\n" + # Add document content + content = "\n\n".join([doc.text for doc in docs]) + + context_parts.append(f"{header}{content}") + + # Join all parts with clear separation + context_text = "\n\n" + "-" * 10 + "\n\n".join(context_parts) + else: + logger.warning("No documents retrieved from RAG") + except Exception as e: + logger.error(f"Error in RAG retrieval: {str(e)}") + # Continue without RAG if there's an error + + except Exception as e: + logger.error(f"Error retrieving documents: {str(e)}") + context_text = "" + + # Get repository information + repo_url = request.repo_url + repo_name = repo_url.split("/")[-1] if "/" in repo_url else repo_url + + # Determine repository type + repo_type = request.type + + # Get language information + language_code = request.language or configs["lang_config"]["default"] + supported_langs = configs["lang_config"]["supported_languages"] + language_name = supported_langs.get(language_code, "English") + + # Create system prompt + if is_deep_research: + # Check if this is the first iteration + is_first_iteration = research_iteration == 1 + + # Check if this is the final iteration + is_final_iteration = research_iteration >= 5 + + if is_first_iteration: + system_prompt = f""" +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are conducting a multi-turn Deep Research process to thoroughly investigate the specific topic in the user's query. +Your goal is to provide detailed, focused information EXCLUSIVELY about this topic. +IMPORTANT:You MUST respond in {language_name} language. + + + +- This is the first iteration of a multi-turn research process focused EXCLUSIVELY on the user's query +- Start your response with "## Research Plan" +- Outline your approach to investigating this specific topic +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- Clearly state the specific topic you're researching to maintain focus throughout all iterations +- Identify the key aspects you'll need to research +- Provide initial findings based on the information available +- End with "## Next Steps" indicating what you'll investigate in the next iteration +- Do NOT provide a final conclusion yet - this is just the beginning of the research +- Do NOT include general repository information unless directly relevant to the query +- Focus EXCLUSIVELY on the specific topic being researched - do not drift to related topics +- Your research MUST directly address the original question +- NEVER respond with just "Continue the research" as an answer - always provide substantive research findings +- Remember that this topic will be maintained across all research iterations + + +""" + elif is_final_iteration: + system_prompt = f""" +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are in the final iteration of a Deep Research process focused EXCLUSIVELY on the latest user query. +Your goal is to synthesize all previous findings and provide a comprehensive conclusion that directly addresses this specific topic and ONLY this topic. +IMPORTANT:You MUST respond in {language_name} language. + + + +- This is the final iteration of the research process +- CAREFULLY review the entire conversation history to understand all previous findings +- Synthesize ALL findings from previous iterations into a comprehensive conclusion +- Start with "## Final Conclusion" +- Your conclusion MUST directly address the original question +- Stay STRICTLY focused on the specific topic - do not drift to related topics +- Include specific code references and implementation details related to the topic +- Highlight the most important discoveries and insights about this specific functionality +- Provide a complete and definitive answer to the original question +- Do NOT include general repository information unless directly relevant to the query +- Focus exclusively on the specific topic being researched +- NEVER respond with "Continue the research" as an answer - always provide a complete conclusion +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- Ensure your conclusion builds on and references key findings from previous iterations + + +""" + else: + system_prompt = f""" +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are currently in iteration {research_iteration} of a Deep Research process focused EXCLUSIVELY on the latest user query. +Your goal is to build upon previous research iterations and go deeper into this specific topic without deviating from it. +IMPORTANT:You MUST respond in {language_name} language. + + + +- CAREFULLY review the conversation history to understand what has been researched so far +- Your response MUST build on previous research iterations - do not repeat information already covered +- Identify gaps or areas that need further exploration related to this specific topic +- Focus on one specific aspect that needs deeper investigation in this iteration +- Start your response with "## Research Update {research_iteration}" +- Clearly explain what you're investigating in this iteration +- Provide new insights that weren't covered in previous iterations +- If this is iteration 3, prepare for a final conclusion in the next iteration +- Do NOT include general repository information unless directly relevant to the query +- Focus EXCLUSIVELY on the specific topic being researched - do not drift to related topics +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- NEVER respond with just "Continue the research" as an answer - always provide substantive research findings +- Your research MUST directly address the original question +- Maintain continuity with previous research iterations - this is a continuous investigation + + +""" + else: + system_prompt = f""" +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You provide direct, concise, and accurate information about code repositories. +You NEVER start responses with markdown headers or code fences. +IMPORTANT:You MUST respond in {language_name} language. + + + +- Answer the user's question directly without ANY preamble or filler phrases +- DO NOT include any rationale, explanation, or extra comments. +- Strictly base answers ONLY on existing code or documents +- DO NOT speculate or invent citations. +- DO NOT start with preambles like "Okay, here's a breakdown" or "Here's an explanation" +- DO NOT start with markdown headers like "## Analysis of..." or any file path references +- DO NOT start with ```markdown code fences +- DO NOT end your response with ``` closing fences +- DO NOT start by repeating or acknowledging the question +- JUST START with the direct answer to the question + + +```markdown +## Analysis of `adalflow/adalflow/datasets/gsm8k.py` + +This file contains... +``` + + +- Format your response with proper markdown including headings, lists, and code blocks WITHIN your answer +- For code analysis, organize your response with clear sections +- Think step by step and structure your answer logically +- Start with the most relevant information that directly addresses the user's query +- Be precise and technical when discussing code +- Your response language should be in the same language as the user's query + + +""" + + # Fetch file content if provided + file_content = "" + if request.filePath: + try: + file_content = get_file_content(request.repo_url, request.filePath, request.type, request.token) + logger.info(f"Successfully retrieved content for file: {request.filePath}") + except Exception as e: + logger.error(f"Error retrieving file content: {str(e)}") + # Continue without file content if there's an error + + # Format conversation history + conversation_history = "" + for turn_id, turn in request_rag.memory().items(): + if not isinstance(turn_id, int) and hasattr(turn, 'user_query') and hasattr(turn, 'assistant_response'): + conversation_history += f"\n{turn.user_query.query_str}\n{turn.assistant_response.response_str}\n\n" + + # Create the prompt with context + prompt = f"/no_think {system_prompt}\n\n" + + if conversation_history: + prompt += f"\n{conversation_history}\n\n" + + # Check if filePath is provided and fetch file content if it exists + if file_content: + # Add file content to the prompt after conversation history + prompt += f"\n{file_content}\n\n\n" + + # Only include context if it's not empty + CONTEXT_START = "" + CONTEXT_END = "" + if context_text.strip(): + prompt += f"{CONTEXT_START}\n{context_text}\n{CONTEXT_END}\n\n" + else: + # Add a note that we're skipping RAG due to size constraints or because it's the isolated API + logger.info("No context available from RAG") + prompt += "Answering without retrieval augmentation.\n\n" + + prompt += f"\n{query}\n\n\nAssistant: " + + model_config = get_model_config(request.provider, request.model)["model_kwargs"] + + if request.provider == "ollama": + prompt += " /no_think" + + model = OllamaClient() + model_kwargs = { + "model": model_config["model"], + "stream": True, + "options": { + "temperature": model_config["temperature"], + "top_p": model_config["top_p"], + "num_ctx": model_config["num_ctx"] + } + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "openrouter": + logger.info(f"Using OpenRouter with model: {request.model}") + + # Check if OpenRouter API key is set + if not OPENROUTER_API_KEY: + logger.warning("OPENROUTER_API_KEY not configured, but continuing with request") + # We'll let the OpenRouterClient handle this and return a friendly error message + + model = OpenRouterClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"] + } + # Only add top_p if it exists in the model config + if "top_p" in model_config: + model_kwargs["top_p"] = model_config["top_p"] + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "openai": + logger.info(f"Using Openai protocol with model: {request.model}") + + # Check if an API key is set for Openai + if not OPENAI_API_KEY: + logger.warning("OPENAI_API_KEY not configured, but continuing with request") + # We'll let the OpenAIClient handle this and return an error message + + # Initialize Openai client + model = OpenAIClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"] + } + # Only add top_p if it exists in the model config + if "top_p" in model_config: + model_kwargs["top_p"] = model_config["top_p"] + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "azure": + logger.info(f"Using Azure AI with model: {request.model}") + + # Initialize Azure AI client + model = AzureAIClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"], + "top_p": model_config["top_p"] + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "dashscope": + logger.info(f"Using Dashscope with model: {request.model}") + + # Initialize Dashscope client + model = DashscopeClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"], + "top_p": model_config["top_p"] + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + else: + # Initialize Google Generative AI model + model = genai.GenerativeModel( + model_name=model_config["model"], + generation_config={ + "temperature": model_config["temperature"], + "top_p": model_config["top_p"], + "top_k": model_config["top_k"] + } + ) + + # Process the response based on the provider + try: + if request.provider == "ollama": + # Get the response and handle it properly using the previously created api_kwargs + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Ollama + async for chunk in response: + text = getattr(chunk, 'response', None) or getattr(chunk, 'text', None) or str(chunk) + if text and not text.startswith('model=') and not text.startswith('created_at='): + text = text.replace('', '').replace('', '') + await websocket.send_text(text) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + elif request.provider == "openrouter": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making OpenRouter API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from OpenRouter + async for chunk in response: + await websocket.send_text(chunk) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + except Exception as e_openrouter: + logger.error(f"Error with OpenRouter API: {str(e_openrouter)}") + error_msg = f"\nError with OpenRouter API: {str(e_openrouter)}\n\nPlease check that you have set the OPENROUTER_API_KEY environment variable with a valid API key." + await websocket.send_text(error_msg) + # Close the WebSocket connection after sending the error message + await websocket.close() + elif request.provider == "openai": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making Openai API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Openai + async for chunk in response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + await websocket.send_text(text) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + except Exception as e_openai: + logger.error(f"Error with Openai API: {str(e_openai)}") + error_msg = f"\nError with Openai API: {str(e_openai)}\n\nPlease check that you have set the OPENAI_API_KEY environment variable with a valid API key." + await websocket.send_text(error_msg) + # Close the WebSocket connection after sending the error message + await websocket.close() + elif request.provider == "azure": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making Azure AI API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Azure AI + async for chunk in response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + await websocket.send_text(text) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + except Exception as e_azure: + logger.error(f"Error with Azure AI API: {str(e_azure)}") + error_msg = f"\nError with Azure AI API: {str(e_azure)}\n\nPlease check that you have set the AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_VERSION environment variables with valid values." + await websocket.send_text(error_msg) + # Close the WebSocket connection after sending the error message + await websocket.close() + else: + # Generate streaming response + response = model.generate_content(prompt, stream=True) + # Stream the response + for chunk in response: + if hasattr(chunk, 'text'): + await websocket.send_text(chunk.text) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + + except Exception as e_outer: + logger.error(f"Error in streaming response: {str(e_outer)}") + error_message = str(e_outer) + + # Check for token limit errors + if "maximum context length" in error_message or "token limit" in error_message or "too many tokens" in error_message: + # If we hit a token limit error, try again without context + logger.warning("Token limit exceeded, retrying without context") + try: + # Create a simplified prompt without context + simplified_prompt = f"/no_think {system_prompt}\n\n" + if conversation_history: + simplified_prompt += f"\n{conversation_history}\n\n" + + # Include file content in the fallback prompt if it was retrieved + if request.filePath and file_content: + simplified_prompt += f"\n{file_content}\n\n\n" + + simplified_prompt += "Answering without retrieval augmentation due to input size constraints.\n\n" + simplified_prompt += f"\n{query}\n\n\nAssistant: " + + if request.provider == "ollama": + simplified_prompt += " /no_think" + + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from Ollama + async for chunk in fallback_response: + text = getattr(chunk, 'response', None) or getattr(chunk, 'text', None) or str(chunk) + if text and not text.startswith('model=') and not text.startswith('created_at='): + text = text.replace('', '').replace('', '') + await websocket.send_text(text) + elif request.provider == "openrouter": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback OpenRouter API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from OpenRouter + async for chunk in fallback_response: + await websocket.send_text(chunk) + except Exception as e_fallback: + logger.error(f"Error with OpenRouter API fallback: {str(e_fallback)}") + error_msg = f"\nError with OpenRouter API fallback: {str(e_fallback)}\n\nPlease check that you have set the OPENROUTER_API_KEY environment variable with a valid API key." + await websocket.send_text(error_msg) + elif request.provider == "openai": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback Openai API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from Openai + async for chunk in fallback_response: + text = chunk if isinstance(chunk, str) else getattr(chunk, 'text', str(chunk)) + await websocket.send_text(text) + except Exception as e_fallback: + logger.error(f"Error with Openai API fallback: {str(e_fallback)}") + error_msg = f"\nError with Openai API fallback: {str(e_fallback)}\n\nPlease check that you have set the OPENAI_API_KEY environment variable with a valid API key." + await websocket.send_text(error_msg) + elif request.provider == "azure": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback Azure AI API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback response from Azure AI + async for chunk in fallback_response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + await websocket.send_text(text) + except Exception as e_fallback: + logger.error(f"Error with Azure AI API fallback: {str(e_fallback)}") + error_msg = f"\nError with Azure AI API fallback: {str(e_fallback)}\n\nPlease check that you have set the AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_VERSION environment variables with valid values." + await websocket.send_text(error_msg) + else: + # Initialize Google Generative AI model + model_config = get_model_config(request.provider, request.model) + fallback_model = genai.GenerativeModel( + model_name=model_config["model"], + generation_config={ + "temperature": model_config["model_kwargs"].get("temperature", 0.7), + "top_p": model_config["model_kwargs"].get("top_p", 0.8), + "top_k": model_config["model_kwargs"].get("top_k", 40) + } + ) + + # Get streaming response using simplified prompt + fallback_response = fallback_model.generate_content(simplified_prompt, stream=True) + # Stream the fallback response + for chunk in fallback_response: + if hasattr(chunk, 'text'): + await websocket.send_text(chunk.text) + except Exception as e2: + logger.error(f"Error in fallback streaming response: {str(e2)}") + await websocket.send_text(f"\nI apologize, but your request is too large for me to process. Please try a shorter query or break it into smaller parts.") + # Close the WebSocket connection after sending the error message + await websocket.close() + else: + # For other errors, return the error message + await websocket.send_text(f"\nError: {error_message}") + # Close the WebSocket connection after sending the error message + await websocket.close() + + except WebSocketDisconnect: + logger.info("WebSocket disconnected") + except Exception as e: + logger.error(f"Error in WebSocket handler: {str(e)}") + try: + await websocket.send_text(f"Error: {str(e)}") + await websocket.close() + except: + pass diff --git a/reference-deepwiki/deepwiki-open-main/.dockerignore b/reference-deepwiki/deepwiki-open-main/.dockerignore new file mode 100644 index 0000000..a7787e7 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/.dockerignore @@ -0,0 +1,60 @@ +# Git +.git +.gitignore +.github + +# Node.js +node_modules +npm-debug.log +yarn-debug.log +yarn-error.log + +# Next.js +.next +out + +# Python cache files (but keep api/ directory) +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg +# Keep api/ directory but exclude cache +api/__pycache__/ +api/*.pyc + +# Environment variables +# .env is now allowed to be included in the build +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Docker +Dockerfile +docker-compose.yml +.dockerignore + +# Misc +.DS_Store +*.pem +README.md +LICENSE +screenshots/ +*.md +!api/README.md diff --git a/reference-deepwiki/deepwiki-open-main/.github/workflows/docker-build-push.yml b/reference-deepwiki/deepwiki-open-main/.github/workflows/docker-build-push.yml new file mode 100644 index 0000000..50b8ef2 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/.github/workflows/docker-build-push.yml @@ -0,0 +1,173 @@ +name: Build and Push Docker Image + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + # Allow manual trigger + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +concurrency: + # This concurrency group ensures that only one job in the group runs at a time. + # If a new job is triggered, the previous one will be canceled. + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-and-push: + strategy: + matrix: + include: + - os: ubuntu-latest + platform: linux/amd64 + - os: ubuntu-24.04-arm + platform: linux/arm64 + runs-on: ${{ matrix.os }} + permissions: + contents: read + packages: write + + steps: + - name: Prepare environment for current platform + id: prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + echo "GHCR_IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.GHCR_IMAGE }} + + - name: Create empty .env file for build + run: touch .env + + - name: Build and push Docker image + uses: docker/build-push-action@v6 + id: build + with: + context: . + platforms: ${{ matrix.platform }} + push: ${{ github.event_name != 'pull_request' }} + annotations: ${{ steps.meta.outputs.annotations }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,name=${{ env.GHCR_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }},oci-mediatypes=true + cache-from: type=gha,scope=${{ github.repository }}-${{ github.ref_name }}-${{ matrix.platform }} + cache-to: type=gha,mode=max,scope=${{ github.repository }}-${{ github.ref_name }}-${{ matrix.platform }} + + - name: Export digest + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + name: merge Docker manifests + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + permissions: + contents: read + packages: write + + needs: + - build-and-push + steps: + - name: Prepare environment + id: prepare + run: | + echo "GHCR_IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV + + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: /tmp/digests + pattern: digests-* + merge-multiple: true + + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.GHCR_IMAGE }} + annotations: | + type=org.opencontainers.image.description,value=${{ github.event.repository.description || 'No description provided' }} + tags: | + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha,format=short + type=ref,event=branch + type=ref,event=pr + latest + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + driver-opts: | + network=host + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get execution timestamp with RFC3339 format + id: timestamp + run: | + echo "timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_OUTPUT + + - name: Create manifest list and pushs + working-directory: /tmp/digests + id: manifest-annotate + continue-on-error: true + run: | + docker buildx imagetools create \ + $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + --annotation='index:org.opencontainers.image.description=${{ github.event.repository.description }}' \ + --annotation='index:org.opencontainers.image.created=${{ steps.timestamp.outputs.timestamp }}' \ + --annotation='index:org.opencontainers.image.url=${{ github.event.repository.url }}' \ + --annotation='index:org.opencontainers.image.source=${{ github.event.repository.url }}' \ + $(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *) + + - name: Create manifest list and push without annotations + if: steps.manifest-annotate.outcome == 'failure' + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *) + + - name: Inspect image + id: inspect + run: | + docker buildx imagetools inspect '${{ env.GHCR_IMAGE }}:${{ steps.meta.outputs.version }}' diff --git a/reference-deepwiki/deepwiki-open-main/.gitignore b/reference-deepwiki/deepwiki-open-main/.gitignore new file mode 100644 index 0000000..4570efd --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/.gitignore @@ -0,0 +1,69 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +api/logs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +*.venv +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +.idea/ + +# ignore adding self-signed certs +certs/ diff --git a/reference-deepwiki/deepwiki-open-main/.python-version b/reference-deepwiki/deepwiki-open-main/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/reference-deepwiki/deepwiki-open-main/Dockerfile b/reference-deepwiki/deepwiki-open-main/Dockerfile new file mode 100644 index 0000000..ab818ef --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/Dockerfile @@ -0,0 +1,107 @@ +# syntax=docker/dockerfile:1-labs + +# Build argument for custom certificates directory +ARG CUSTOM_CERT_DIR="certs" + +FROM node:20-alpine3.22 AS node_base + +FROM node_base AS node_deps +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci --legacy-peer-deps + +FROM node_base AS node_builder +WORKDIR /app +COPY --from=node_deps /app/node_modules ./node_modules +# Copy only necessary files for Next.js build +COPY package.json package-lock.json next.config.ts tsconfig.json tailwind.config.js postcss.config.mjs ./ +COPY src/ ./src/ +COPY public/ ./public/ +# Increase Node.js memory limit for build and disable telemetry +ENV NODE_OPTIONS="--max-old-space-size=4096" +ENV NEXT_TELEMETRY_DISABLED=1 +RUN NODE_ENV=production npm run build + +FROM python:3.11-slim AS py_deps +WORKDIR /app +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" +COPY api/requirements.txt ./api/ +RUN pip install --no-cache -r api/requirements.txt + +# Use Python 3.11 as final image +FROM python:3.11-slim + +# Set working directory +WORKDIR /app + +# Install Node.js and npm +RUN apt-get update && apt-get install -y \ + curl \ + gnupg \ + git \ + ca-certificates \ + && mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Update certificates if custom ones were provided and copied successfully +RUN if [ -n "${CUSTOM_CERT_DIR}" ]; then \ + mkdir -p /usr/local/share/ca-certificates && \ + if [ -d "${CUSTOM_CERT_DIR}" ]; then \ + cp -r ${CUSTOM_CERT_DIR}/* /usr/local/share/ca-certificates/ 2>/dev/null || true; \ + update-ca-certificates; \ + echo "Custom certificates installed successfully."; \ + else \ + echo "Warning: ${CUSTOM_CERT_DIR} not found. Skipping certificate installation."; \ + fi \ + fi + +ENV PATH="/opt/venv/bin:$PATH" + +# Copy Python dependencies +COPY --from=py_deps /opt/venv /opt/venv +COPY api/ ./api/ + +# Copy Node app +COPY --from=node_builder /app/public ./public +COPY --from=node_builder /app/.next/standalone ./ +COPY --from=node_builder /app/.next/static ./.next/static + +# Expose the port the app runs on +EXPOSE ${PORT:-8001} 3000 + +# Create a script to run both backend and frontend +RUN echo '#!/bin/bash\n\ +# Load environment variables from .env file if it exists\n\ +if [ -f .env ]; then\n\ + export $(grep -v "^#" .env | xargs -r)\n\ +fi\n\ +\n\ +# Check for required environment variables\n\ +if [ -z "$OPENAI_API_KEY" ] || [ -z "$GOOGLE_API_KEY" ]; then\n\ + echo "Warning: OPENAI_API_KEY and/or GOOGLE_API_KEY environment variables are not set."\n\ + echo "These are required for DeepWiki to function properly."\n\ + echo "You can provide them via a mounted .env file or as environment variables when running the container."\n\ +fi\n\ +\n\ +# Start the API server in the background with the configured port\n\ +python -m api.main --port ${PORT:-8001} &\n\ +PORT=3000 HOSTNAME=0.0.0.0 node server.js &\n\ +wait -n\n\ +exit $?' > /app/start.sh && chmod +x /app/start.sh + +# Set environment variables +ENV PORT=8001 +ENV NODE_ENV=production +ENV SERVER_BASE_URL=http://localhost:${PORT:-8001} + +# Create empty .env file (will be overridden if one exists at runtime) +RUN touch .env + +# Command to run the application +CMD ["/app/start.sh"] diff --git a/reference-deepwiki/deepwiki-open-main/Dockerfile-ollama-local b/reference-deepwiki/deepwiki-open-main/Dockerfile-ollama-local new file mode 100644 index 0000000..92a254f --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/Dockerfile-ollama-local @@ -0,0 +1,116 @@ +# syntax=docker/dockerfile:1-labs + +FROM node:20-alpine AS node_base + +FROM node_base AS node_deps +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci --legacy-peer-deps + +FROM node_base AS node_builder +WORKDIR /app +COPY --from=node_deps /app/node_modules ./node_modules +COPY --exclude=./api . . +RUN NODE_ENV=production npm run build + +FROM python:3.11-slim AS py_deps +WORKDIR /app +RUN python -m venv /opt/venv +ENV PATH="/opt/venv/bin:$PATH" +COPY api/requirements.txt ./api/ +RUN pip install --no-cache -r api/requirements.txt + +FROM python:3.11-slim AS ollama_base +RUN apt-get update && apt-get install -y \ + curl +# Detect architecture and download appropriate Ollama version +# ARG TARGETARCH can be set at build time with --build-arg TARGETARCH=arm64 or TARGETARCH=amd64 +ARG TARGETARCH=arm64 +RUN OLLAMA_ARCH="" && \ + if [ "$TARGETARCH" = "arm64" ]; then \ + echo "Building for ARM64 architecture." && \ + OLLAMA_ARCH="arm64"; \ + elif [ "$TARGETARCH" = "amd64" ]; then \ + echo "Building for AMD64 architecture." && \ + OLLAMA_ARCH="amd64"; \ + else \ + echo "Error: Unsupported architecture '$TARGETARCH'. Supported architectures are 'arm64' and 'amd64'." >&2 && \ + exit 1; \ + fi && \ + curl -L "https://ollama.com/download/ollama-linux-${OLLAMA_ARCH}.tgz" -o ollama.tgz && \ + tar -C /usr -xzf ollama.tgz && \ + rm ollama.tgz + +RUN ollama serve > /dev/null 2>&1 & \ + sleep 20 && \ + ollama pull nomic-embed-text && \ + ollama pull qwen3:1.7b + +# Use Python 3.11 as final image +FROM python:3.11-slim + +# Set working directory +WORKDIR /app + +# Install Node.js and npm +RUN apt-get update && apt-get install -y \ + curl \ + gnupg \ + git \ + && mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ENV PATH="/opt/venv/bin:$PATH" + +# Copy Python dependencies +COPY --from=py_deps /opt/venv /opt/venv +COPY api/ ./api/ + +# Copy Node app +COPY --from=node_builder /app/public ./public +COPY --from=node_builder /app/.next/standalone ./ +COPY --from=node_builder /app/.next/static ./.next/static +COPY --from=ollama_base /usr/bin/ollama /usr/local/bin/ +COPY --from=ollama_base /root/.ollama /root/.ollama + +# Expose the port the app runs on +EXPOSE ${PORT:-8001} 3000 + +# Create a script to run both backend and frontend +RUN echo '#!/bin/bash\n\ +# Start ollama serve in background\n\ +ollama serve > /dev/null 2>&1 &\n\ +\n\ +# Load environment variables from .env file if it exists\n\ +if [ -f .env ]; then\n\ + export $(grep -v "^#" .env | xargs -r)\n\ +fi\n\ +\n\ +# Check for required environment variables\n\ +if [ -z "$OPENAI_API_KEY" ] || [ -z "$GOOGLE_API_KEY" ]; then\n\ + echo "Warning: OPENAI_API_KEY and/or GOOGLE_API_KEY environment variables are not set."\n\ + echo "These are required for DeepWiki to function properly."\n\ + echo "You can provide them via a mounted .env file or as environment variables when running the container."\n\ +fi\n\ +\n\ +# Start the API server in the background with the configured port\n\ +python -m api.main --port ${PORT:-8001} &\n\ +PORT=3000 HOSTNAME=0.0.0.0 node server.js &\n\ +wait -n\n\ +exit $?' > /app/start.sh && chmod +x /app/start.sh + +# Set environment variables +ENV PORT=8001 +ENV NODE_ENV=production +ENV SERVER_BASE_URL=http://localhost:${PORT:-8001} + +# Create empty .env file (will be overridden if one exists at runtime) +RUN touch .env + +# Command to run the application +CMD ["/app/start.sh"] diff --git a/reference-deepwiki/deepwiki-open-main/LICENSE b/reference-deepwiki/deepwiki-open-main/LICENSE new file mode 100644 index 0000000..623b619 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Sheing Ng + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/reference-deepwiki/deepwiki-open-main/Ollama-instruction.md b/reference-deepwiki/deepwiki-open-main/Ollama-instruction.md new file mode 100644 index 0000000..f6e47e3 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/Ollama-instruction.md @@ -0,0 +1,189 @@ +# Using DeepWiki with Ollama: Beginner's Guide + +DeepWiki supports local AI models through Ollama, which is perfect if you want to: + +- Run everything locally without relying on cloud APIs +- Avoid API costs from OpenAI or Google +- Have more privacy with your code analysis + +## Step 1: Install Ollama + +### For Windows +- Download Ollama from the [official website](https://ollama.com/download) +- Run the installer and follow the on-screen instructions +- After installation, Ollama will run in the background (check your system tray) + +### For macOS +- Download Ollama from the [official website](https://ollama.com/download) +- Open the downloaded file and drag Ollama to your Applications folder +- Launch Ollama from your Applications folder + +### For Linux +- Run the following command: + ```bash + curl -fsSL https://ollama.com/install.sh | sh + ``` + +## Step 2: Download Required Models + +Open a terminal (Command Prompt or PowerShell on Windows) and run: + +```bash +ollama pull nomic-embed-text +ollama pull qwen3:1.7b +``` + +The first command downloads the embedding model that DeepWiki uses to understand your code. The second downloads a small but capable language model for generating documentation. + +## Step 3: Set Up DeepWiki + +Clone the DeepWiki repository: +```bash +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open +``` + +Create a `.env` file in the project root: +``` +# No need for API keys when using Ollama locally +PORT=8001 +# Optionally, provide OLLAMA_HOST if Ollama is not local +OLLAMA_HOST=your_ollama_host # (default: http://localhost:11434) +``` + +Configure the Local Embedder for Ollama: +``` +cp api/config/embedder.ollama.json.bak api/config/embedder.json +# overwrite api/config/embedder.json? (y/n [n]) y +``` + +Start the backend: +```bash +pip install -r api/requirements.txt +python -m api.main +``` + +Start the frontend: +```bash +npm install +npm run dev +``` + +## Step 4: Use DeepWiki with Ollama + +1. Open http://localhost:3000 in your browser +2. Enter a GitHub, GitLab, or Bitbucket repository URL +3. Check the use "Local Ollama Model" option +4. Click "Generate Wiki" + +![Ollama Option](screenshots/Ollama.png) + +## Alternative using Dockerfile + +1. Build the docker image `docker build -f Dockerfile-ollama-local -t deepwiki:ollama-local .` +2. Run the container: + ```bash + # For regular use + docker run -p 3000:3000 -p 8001:8001 --name deepwiki \ + -v ~/.adalflow:/root/.adalflow \ + -e OLLAMA_HOST=your_ollama_host \ + deepwiki:ollama-local + + # For local repository analysis + docker run -p 3000:3000 -p 8001:8001 --name deepwiki \ + -v ~/.adalflow:/root/.adalflow \ + -e OLLAMA_HOST=your_ollama_host \ + -v /path/to/your/repo:/app/local-repos/repo-name \ + deepwiki:ollama-local + ``` + +3. When using local repositories in the interface: use `/app/local-repos/repo-name` as the local repository path. + +4. Open http://localhost:3000 in your browser + +Note: For Apple Silicon Macs, the Dockerfile automatically uses ARM64 binaries for better performance. + +## How It Works + +When you select "Use Local Ollama", DeepWiki will: + +1. Use the `nomic-embed-text` model for creating embeddings of your code +2. Use the `qwen3:1.7b` model for generating documentation +3. Process everything locally on your machine + +## Troubleshooting + +### "Cannot connect to Ollama server" +- Make sure Ollama is running in the background. You can check by running `ollama list` in your terminal. +- Verify that Ollama is running on the default port (11434) +- Try restarting Ollama + +### Slow generation +- Local models are typically slower than cloud APIs. Consider using a smaller repository or a more powerful computer. +- The `qwen3:1.7b` model is optimized for speed and quality balance. Larger models will be slower but may produce better results. + +### Out of memory errors +- If you encounter memory issues, try using a smaller model like `phi3:mini` instead of larger models. +- Close other memory-intensive applications while running Ollama + +## Advanced: Using Different Models + +If you want to try different models, you can modify the `api/config/generator.json` file: + +```python +"generator_ollama": { + "model_client": OllamaClient, + "model_kwargs": { + "model": "qwen3:1.7b", # Change this to another model + "options": { + "temperature": 0.7, + "top_p": 0.8, + } + }, +}, +``` + +You can replace `"model": "qwen3:1.7b"` with any model you've pulled with Ollama. For a list of available models, visit [Ollama's model library](https://ollama.com/library) or run `ollama list` in your terminal. + +Similarly, you can change the embedding model: + +```python +"embedder_ollama": { + "model_client": OllamaClient, + "model_kwargs": { + "model": "nomic-embed-text" # Change this to another embedding model + }, +}, +``` + +## Performance Considerations + +### Hardware Requirements + +For optimal performance with Ollama: +- **CPU**: 4+ cores recommended +- **RAM**: 8GB minimum, 16GB+ recommended +- **Storage**: 10GB+ free space for models +- **GPU**: Optional but highly recommended for faster processing + +### Model Selection Guide + +| Model | Size | Speed | Quality | Use Case | +|-------|------|-------|---------|----------| +| phi3:mini | 1.3GB | Fast | Good | Small projects, quick testing | +| qwen3:1.7b | 3.8GB | Medium | Better | Default, good balance | +| llama3:8b | 8GB | Slow | Best | Complex projects, detailed analysis | + +## Limitations + +When using Ollama with DeepWiki: + +1. **No Internet Access**: The models run completely offline and cannot access external information +2. **Limited Context Window**: Local models typically have smaller context windows than cloud APIs +3. **Less Powerful**: Local models may not match the quality of the latest cloud models + +## Conclusion + +Using DeepWiki with Ollama gives you a completely local, private solution for code documentation. While it may not match the speed or quality of cloud-based solutions, it provides a free and privacy-focused alternative that works well for most projects. + +Enjoy using DeepWiki with your local Ollama models! diff --git a/reference-deepwiki/deepwiki-open-main/README.es.md b/reference-deepwiki/deepwiki-open-main/README.es.md new file mode 100644 index 0000000..8dde374 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.es.md @@ -0,0 +1,334 @@ +# DeepWiki-Open + +![Banner de DeepWiki](screenshots/Deepwiki.png) + +**DeepWiki** crea automáticamente wikis hermosas e interactivas para cualquier repositorio de GitHub, GitLab o BitBucket. ¡Solo ingresa el nombre de un repositorio y DeepWiki: + +1. Analizará la estructura del código +2. Generará documentación completa +3. Creará diagramas visuales para explicar cómo funciona todo +4. Organizará todo en una wiki fácil de navegar + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Características + +- **Documentación Instantánea**: Convierte cualquier repositorio de GitHub, GitLab o BitBucket en una wiki en segundos +- **Soporte para Repositorios Privados**: Accede de forma segura a repositorios privados con tokens de acceso personal +- **Análisis Inteligente**: Comprensión de la estructura y relaciones del código impulsada por IA +- **Diagramas Hermosos**: Diagramas Mermaid automáticos para visualizar la arquitectura y el flujo de datos +- **Navegación Sencilla**: Interfaz simple e intuitiva para explorar la wiki +- **Función de Preguntas**: Chatea con tu repositorio usando IA potenciada por RAG para obtener respuestas precisas +- **Investigación Profunda**: Proceso de investigación de múltiples turnos que examina a fondo temas complejos +- **Múltiples Proveedores de Modelos**: Soporte para Google Gemini, OpenAI, OpenRouter y modelos locales de Ollama + +## 🚀 Inicio Rápido (¡Súper Fácil!) + +### Opción 1: Usando Docker + +```bash +# Clonar el repositorio +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Crear un archivo .env con tus claves API +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# Opcional: Añadir clave API de OpenRouter si quieres usar modelos de OpenRouter +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Ejecutar con Docker Compose +docker-compose up +``` + +(Los comandos de Docker anteriores, así como la configuración de `docker-compose.yml`, montan el directorio `~/.adalflow` de tu host en `/root/.adalflow` dentro del contenedor. Esta ruta se utiliza para almacenar: +- Repositorios clonados (`~/.adalflow/repos/`) +- Sus embeddings e índices (`~/.adalflow/databases/`) +- Contenido de wiki generado y cacheado (`~/.adalflow/wikicache/`) + +Esto asegura que tus datos persistan incluso si el contenedor se detiene o se elimina.) + +> 💡 **Dónde obtener estas claves:** +> - Obtén una clave API de Google en [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Obtén una clave API de OpenAI en [OpenAI Platform](https://platform.openai.com/api-keys) + +### Opción 2: Configuración Manual (Recomendada) + +#### Paso 1: Configurar tus Claves API + +Crea un archivo `.env` en la raíz del proyecto con estas claves: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# Opcional: Añade esto si quieres usar modelos de OpenRouter +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### Paso 2: Iniciar el Backend + +```bash +# Instalar dependencias de Python +pip install -r api/requirements.txt + +# Iniciar el servidor API +python -m api.main +``` + +#### Paso 3: Iniciar el Frontend + +```bash +# Instalar dependencias de JavaScript +npm install +# o +yarn install + +# Iniciar la aplicación web +npm run dev +# o +yarn dev +``` + +#### Paso 4: ¡Usar DeepWiki! + +1. Abre [http://localhost:3000](http://localhost:3000) en tu navegador +2. Ingresa un repositorio de GitHub, GitLab o Bitbucket (como `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, o `https://bitbucket.org/redradish/atlassian_app_versions`) +3. Para repositorios privados, haz clic en "+ Agregar tokens de acceso" e ingresa tu token de acceso personal de GitHub o GitLab +4. ¡Haz clic en "Generar Wiki" y observa la magia suceder! + +## 🔍 Cómo Funciona + +DeepWiki usa IA para: + +1. Clonar y analizar el repositorio de GitHub, GitLab o Bitbucket (incluyendo repos privados con autenticación por token) +2. Crear embeddings del código para recuperación inteligente +3. Generar documentación con IA consciente del contexto (usando modelos de Google Gemini, OpenAI, OpenRouter o Ollama local) +4. Crear diagramas visuales para explicar las relaciones del código +5. Organizar todo en una wiki estructurada +6. Habilitar preguntas y respuestas inteligentes con el repositorio a través de la función de Preguntas +7. Proporcionar capacidades de investigación en profundidad con Investigación Profunda + +```mermaid +graph TD + A[Usuario ingresa repo GitHub/GitLab/Bitbucket] --> AA{¿Repo privado?} + AA -->|Sí| AB[Agregar token de acceso] + AA -->|No| B[Clonar Repositorio] + AB --> B + B --> C[Analizar Estructura del Código] + C --> D[Crear Embeddings del Código] + + D --> M{Seleccionar Proveedor de Modelo} + M -->|Google Gemini| E1[Generar con Gemini] + M -->|OpenAI| E2[Generar con OpenAI] + M -->|OpenRouter| E3[Generar con OpenRouter] + M -->|Ollama Local| E4[Generar con Ollama] + + E1 --> E[Generar Documentación] + E2 --> E + E3 --> E + E4 --> E + + D --> F[Crear Diagramas Visuales] + E --> G[Organizar como Wiki] + F --> G + G --> H[DeepWiki Interactiva] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ Estructura del Proyecto + +``` +deepwiki/ +├── api/ # Servidor API backend +│ ├── main.py # Punto de entrada de la API +│ ├── api.py # Implementación FastAPI +│ ├── rag.py # Generación Aumentada por Recuperación +│ ├── data_pipeline.py # Utilidades de procesamiento de datos +│ └── requirements.txt # Dependencias Python +│ +├── src/ # App frontend Next.js +│ ├── app/ # Directorio app de Next.js +│ │ └── page.tsx # Página principal de la aplicación +│ └── components/ # Componentes React +│ └── Mermaid.tsx # Renderizador de diagramas Mermaid +│ +├── public/ # Activos estáticos +├── package.json # Dependencias JavaScript +└── .env # Variables de entorno (crear este archivo) +``` + +## 🤖 Sistema de Selección de Modelos Basado en Proveedores + +DeepWiki ahora implementa un sistema flexible de selección de modelos basado en proveedores que soporta múltiples proveedores de LLM: + +### Proveedores y Modelos Soportados + +- **Google**: Predeterminado `gemini-2.5-flash`, también soporta `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc. +- **OpenAI**: Predeterminado `gpt-5-nano`, también soporta `gpt-5`, `4o`, etc. +- **OpenRouter**: Acceso a múltiples modelos a través de una API unificada, incluyendo Claude, Llama, Mistral, etc. +- **Ollama**: Soporte para modelos de código abierto ejecutados localmente como `llama3` + +### Variables de Entorno + +Cada proveedor requiere sus correspondientes variables de entorno para las claves API: + +``` +# Claves API +GOOGLE_API_KEY=tu_clave_api_google # Requerida para modelos Google Gemini +OPENAI_API_KEY=tu_clave_api_openai # Requerida para modelos OpenAI +OPENROUTER_API_KEY=tu_clave_api_openrouter # Requerida para modelos OpenRouter + +# Configuración de URL Base de OpenAI API +OPENAI_BASE_URL=https://punto-final-personalizado.com/v1 # Opcional, para endpoints personalizados de OpenAI API + +# Directorio de Configuración +DEEPWIKI_CONFIG_DIR=/ruta/a/directorio/config/personalizado # Opcional, para ubicación personalizada de archivos de configuración +``` + +### Archivos de Configuración + +DeepWiki utiliza archivos de configuración JSON para gestionar varios aspectos del sistema: + +1. **`generator.json`**: Configuración para modelos de generación de texto + - Define los proveedores de modelos disponibles (Google, OpenAI, OpenRouter, Ollama) + - Especifica los modelos predeterminados y disponibles para cada proveedor + - Contiene parámetros específicos de los modelos como temperatura y top_p + +2. **`embedder.json`**: Configuración para modelos de embeddings y procesamiento de texto + - Define modelos de embeddings para almacenamiento vectorial + - Contiene configuración del recuperador para RAG + - Especifica ajustes del divisor de texto para fragmentación de documentos + +3. **`repo.json`**: Configuración para manejo de repositorios + - Contiene filtros de archivos para excluir ciertos archivos y directorios + - Define límites de tamaño de repositorio y reglas de procesamiento + +Por defecto, estos archivos se encuentran en el directorio `api/config/`. Puedes personalizar su ubicación usando la variable de entorno `DEEPWIKI_CONFIG_DIR`. + +### Selección de Modelos Personalizados para Proveedores de Servicios + +La función de selección de modelos personalizados está diseñada específicamente para proveedores de servicios que necesitan: + +- Puede ofrecer a los usuarios dentro de su organización una selección de diferentes modelos de IA +- Puede adaptarse rápidamente al panorama de LLM en rápida evolución sin cambios de código +- Puede soportar modelos especializados o ajustados que no están en la lista predefinida + +Usted puede implementar sus ofertas de modelos seleccionando entre las opciones predefinidas o ingresando identificadores de modelos personalizados en la interfaz frontend. + +### Configuración de URL Base para Canales Privados Empresariales + +La configuración de base_url del Cliente OpenAI está diseñada principalmente para usuarios empresariales con canales API privados. Esta función: + +- Permite la conexión a endpoints API privados o específicos de la empresa +- Permite a las organizaciones usar sus propios servicios LLM auto-alojados o desplegados a medida +- Soporta integración con servicios de terceros compatibles con la API de OpenAI + +**Próximamente**: En futuras actualizaciones, DeepWiki soportará un modo donde los usuarios deberán proporcionar sus propias claves API en las solicitudes. Esto permitirá a los clientes empresariales con canales privados utilizar sus disposiciones API existentes sin compartir credenciales con el despliegue de DeepWiki. + +## 🧩 Uso de modelos de embedding compatibles con OpenAI (por ejemplo, Alibaba Qwen) + +Si deseas usar modelos de embedding compatibles con la API de OpenAI (como Alibaba Qwen), sigue estos pasos: + +1. Sustituye el contenido de `api/config/embedder.json` por el de `api/config/embedder_openai_compatible.json`. +2. En el archivo `.env` de la raíz del proyecto, configura las variables de entorno necesarias, por ejemplo: + ``` + OPENAI_API_KEY=tu_api_key + OPENAI_BASE_URL=tu_endpoint_compatible_openai + ``` +3. El programa sustituirá automáticamente los placeholders de embedder.json por los valores de tus variables de entorno. + +Así puedes cambiar fácilmente a cualquier servicio de embedding compatible con OpenAI sin modificar el código. + +## 🤖 Funciones de Preguntas e Investigación Profunda + +### Función de Preguntas + +La función de Preguntas te permite chatear con tu repositorio usando Generación Aumentada por Recuperación (RAG): + +- **Respuestas Conscientes del Contexto**: Obtén respuestas precisas basadas en el código real de tu repositorio +- **Potenciada por RAG**: El sistema recupera fragmentos de código relevantes para proporcionar respuestas fundamentadas +- **Transmisión en Tiempo Real**: Ve las respuestas mientras se generan para una experiencia más interactiva +- **Historial de Conversación**: El sistema mantiene el contexto entre preguntas para interacciones más coherentes + +### Función de Investigación Profunda + +Investigación Profunda lleva el análisis de repositorios al siguiente nivel con un proceso de investigación de múltiples turnos: + +- **Investigación en Profundidad**: Explora a fondo temas complejos a través de múltiples iteraciones de investigación +- **Proceso Estructurado**: Sigue un plan de investigación claro con actualizaciones y una conclusión completa +- **Continuación Automática**: La IA continúa automáticamente la investigación hasta llegar a una conclusión (hasta 5 iteraciones) +- **Etapas de Investigación**: + 1. **Plan de Investigación**: Describe el enfoque y los hallazgos iniciales + 2. **Actualizaciones de Investigación**: Desarrolla las iteraciones anteriores con nuevas perspectivas + 3. **Conclusión Final**: Proporciona una respuesta completa basada en todas las iteraciones + +Para usar Investigación Profunda, simplemente activa el interruptor "Investigación Profunda" en la interfaz de Preguntas antes de enviar tu pregunta. + +## 📱 Capturas de Pantalla + +![Interfaz Principal de DeepWiki](screenshots/Interface.png) +*La interfaz principal de DeepWiki* + +![Soporte para Repositorios Privados](screenshots/privaterepo.png) +*Acceso a repositorios privados con tokens de acceso personal* + +![Función de Investigación Profunda](screenshots/DeepResearch.png) +*Investigación Profunda realiza investigaciones de múltiples turnos para temas complejos* + +### Video de Demostración + +[![Video de Demostración de DeepWiki](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*¡Mira DeepWiki en acción!* + +## ❓ Solución de Problemas + +### Problemas con Claves API +- **"Faltan variables de entorno"**: Asegúrate de que tu archivo `.env` esté en la raíz del proyecto y contenga las claves API requeridas +- **"Clave API no válida"**: Verifica que hayas copiado la clave completa correctamente sin espacios adicionales +- **"Error de API OpenRouter"**: Verifica que tu clave API de OpenRouter sea válida y tenga créditos suficientes + +### Problemas de Conexión +- **"No se puede conectar al servidor API"**: Asegúrate de que el servidor API esté ejecutándose en el puerto 8001 +- **"Error CORS"**: La API está configurada para permitir todos los orígenes, pero si tienes problemas, intenta ejecutar tanto el frontend como el backend en la misma máquina + +### Problemas de Generación +- **"Error al generar wiki"**: Para repositorios muy grandes, prueba primero con uno más pequeño +- **"Formato de repositorio no válido"**: Asegúrate de usar un formato de URL válido para GitHub, GitLab o Bitbucket +- **"No se pudo obtener la estructura del repositorio"**: Para repositorios privados, asegúrate de haber ingresado un token de acceso personal válido con los permisos apropiados +- **"Error de renderizado de diagrama"**: La aplicación intentará automáticamente arreglar los diagramas rotos + +### Soluciones Comunes +1. **Reiniciar ambos servidores**: A veces un simple reinicio soluciona la mayoría de los problemas +2. **Revisar los registros de la consola**: Abre las herramientas de desarrollo del navegador para ver cualquier error de JavaScript +3. **Revisar los registros de la API**: Mira la terminal donde se ejecuta la API para ver errores de Python + +## 🤝 Contribuir + +¡Las contribuciones son bienvenidas! Siéntete libre de: +- Abrir issues para bugs o solicitudes de funciones +- Enviar pull requests para mejorar el código +- Compartir tus comentarios e ideas + +## 📄 Licencia + +Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo [LICENSE](LICENSE) para más detalles. + +## ⭐ Historial de Estrellas + +[![Gráfico de Historial de Estrellas](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + diff --git a/reference-deepwiki/deepwiki-open-main/README.fr.md b/reference-deepwiki/deepwiki-open-main/README.fr.md new file mode 100644 index 0000000..f75bd86 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.fr.md @@ -0,0 +1,564 @@ + +# DeepWiki-Open + +![Bannière DeepWiki](screenshots/Deepwiki.png) + +**DeepWiki** est ma propre tentative d’implémentation de DeepWiki, un outil qui crée automatiquement des wikis magnifiques et interactifs pour n’importe quel dépôt GitHub, GitLab ou Bitbucket ! Il suffit d’entrer un nom de dépôt, et DeepWiki : + +1. Analyse la structure du code +2. Génère une documentation complète +3. Crée des diagrammes visuels pour expliquer le fonctionnement +4. Organise le tout dans un wiki facile à naviguer + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Tip in Crypto](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Fonctionnalités + +- **Documentation instantanée** : Transforme un dépôt GitHub, GitLab ou Bitbucket en wiki en quelques secondes +- **Support des dépôts privés** : Accès sécurisé avec jetons d’accès personnels +- **Analyse intelligente** : Compréhension de la structure et des relations du code via l’IA +- **Diagrammes élégants** : Diagrammes Mermaid automatiques pour visualiser l’architecture et les flux de données +- **Navigation facile** : Interface simple et intuitive +- **Fonction “Ask”** : Posez des questions à votre dépôt avec une IA alimentée par RAG +- **DeepResearch** : Processus de recherche multi-étapes pour explorer des sujets complexes +- **Multiples fournisseurs de modèles IA** : Prise en charge de Google Gemini, OpenAI, OpenRouter, et Ollama local + +## 🚀 Démarrage rapide (super facile !) + +### Option 1 : Avec Docker + +```bash +# Cloner le dépôt +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Créer un fichier .env avec vos clés API +echo "GOOGLE_API_KEY=votre_clé_google" > .env +echo "OPENAI_API_KEY=votre_clé_openai" >> .env +# Facultatif : clé OpenRouter +echo "OPENROUTER_API_KEY=votre_clé_openrouter" >> .env +# Facultatif : hôte personnalisé Ollama +echo "OLLAMA_HOST=votre_hote_ollama" >> .env +# Facultatif : Azure OpenAI +echo "AZURE_OPENAI_API_KEY=votre_clé_azure" >> .env +echo "AZURE_OPENAI_ENDPOINT=votre_endpoint" >> .env +echo "AZURE_OPENAI_VERSION=version_api" >> .env + +# Lancer avec Docker Compose +docker-compose up +``` + +Pour des instructions détaillées sur l’utilisation de DeepWiki avec Ollama et Docker, consultez [Ollama Instructions](Ollama-instruction.md). + +> 💡 **Où obtenir ces clés :** +> - Obtenez une clé API Google depuis [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Obtenez une clé API OpenAI depuis [OpenAI Platform](https://platform.openai.com/api-keys) +> - Obtenez les identifiants Azure OpenAI depuis [Azure Portal](https://portal.azure.com/) – créez une ressource Azure OpenAI et récupérez la clé API, l’endpoint et la version de l’API + +### Option 2 : Installation manuelle (Recommandée) + +#### Étape 1 : Configurez vos clés API + +Créez un fichier `.env` à la racine du projet avec ces clés : +``` +GOOGLE_API_KEY=votre_clé_google +OPENAI_API_KEY=votre_clé_openai +# Optionnel : Ajoutez ceci pour utiliser des modèles OpenRouter +OPENROUTER_API_KEY=votre_clé_openrouter +# Optionnel : Ajoutez ceci pour utiliser des modèles Azure OpenAI +AZURE_OPENAI_API_KEY=votre_clé_azure_openai +AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai +AZURE_OPENAI_VERSION=votre_version_azure_openai +# Optionnel :Ajouter un hôte distant Ollama si il n'est pas local. défaut : http://localhost:11434 +OLLAMA_HOST=votre_hote_ollama +``` + +#### Étape 2 : Démarrer le Backend + +```bash +# Installer dépendances Python +pip install -r api/requirements.txt + +# Démarrer le serveur API +python -m api.main +``` + +#### Étape 3 : Démarrer le Frontend + +```bash +# Installer les dépendances JavaScript +npm install +# ou +yarn install + +# Démarrer le serveur web +npm run dev +# ou +yarn dev +``` + +#### Étape 4 : Utiliser DeepWiki! + +1. Ouvrir [http://localhost:3000](http://localhost:3000) dans votre navigateur +2. Entrer l'adresse d'un dépôt GitHub, GitLab ou Bitbucket (comme `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, or `https://bitbucket.org/redradish/atlassian_app_versions`) +3. Pour les dépôts privés, cliquez sur "+ Ajouter un jeton d'accès" et entrez votre jeton d’accès personnel GitHub ou GitLab. +4. Cliquez sur "Générer le Wiki" et regardez la magie opérer ! + +## 🔍 Comment ça marche + +DeepWiki utilise l'IA pour : + +1. Cloner et analyser le dépôt GitHub, GitLab ou Bitbucket (y compris les dépôts privés avec authentification par jeton d'accès) +2. Créer des embeddings du code pour une récupération intelligente +3. Générer de la documentation avec une IA sensible au contexte (en utilisant les modèles Google Gemini, OpenAI, OpenRouter, Azure OpenAI ou Ollama local) +4. Créer des diagrammes visuels pour expliquer les relations du code +5. Organiser le tout dans un wiki structuré +6. Permettre des questions-réponses intelligentes avec le dépôt grâce à la fonctionnalité Ask +7. Fournir des capacités de recherche approfondie avec DeepResearch + +```mermaid +graph TD + A[Utilisateur entre un dépôt GitHub/GitLab/Bitbucket] --> AA{Dépôt privé?} + AA -->|Oui| AB[Ajouter un jeton d'accès] + AA -->|Non| B[Cloner le dépôt] + AB --> B + B --> C[Analyser la structure du code] + C --> D[Créer des Embeddings] + + D --> M{Sélectionner le modèle} + M -->|Google Gemini| E1[Générer avec Gemini] + M -->|OpenAI| E2[Générer avec OpenAI] + M -->|OpenRouter| E3[Générer avec OpenRouter] + M -->|Local Ollama| E4[Générer avec Ollama] + M -->|Azure| E5[Générer avec Azure] + + E1 --> E[Générer la documentation] + E2 --> E + E3 --> E + E4 --> E + E5 --> E + + D --> F[Créer des diagrammes] + E --> G[Organiser en Wiki] + F --> G + G --> H[DeepWiki interactif] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process; + class H result; +``` + +## 🛠️ Structure du Projet + +``` +deepwiki/ +├── api/ # Serveur API Backend +│ ├── main.py # Point d'entrée de l'API +│ ├── api.py # Implémentation FastAPI +│ ├── rag.py # Génération Augmentée par Récupération (RAG) +│ ├── data_pipeline.py # Utilitaires de traitement des données +│ └── requirements.txt # Dépendances Python +│ +├── src/ # Application Frontend Next.js +│ ├── app/ # Répertoire de l'application Next.js +│ │ └── page.tsx # Page principale de l'application +│ └── components/ # Composants React +│ └── Mermaid.tsx # Rendu des diagrammes Mermaid +│ +├── public/ # Ressources statiques +├── package.json # Dépendances JavaScript +└── .env # Variables d'environnement (à créer) +``` + +## 🤖 Système de sélection de modèles + +DeepWiki implémente désormais un système de sélection de modèles flexible, qui prend en charge plusieurs fournisseurs de LLM : + +### Fournisseurs et modèles pris en charge + +- **Google** : Par défaut `gemini-2.5-flash`, prend également en charge `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc. +- **OpenAI** : Par défaut `gpt-5-nano`, prend également en charge `gpt-5`, `4o`, etc. +- **OpenRouter** : Accès à plusieurs modèles via une API unifiée, notamment Claude, Llama, Mistral, etc. +- **Azure OpenAI** : Par défaut `gpt-4o`, prend également en charge `o4-mini`, etc. +- **Ollama** : Prise en charge des modèles open source exécutés localement, tels que `llama3`. + +### Variables d'environnement + +Chaque fournisseur requiert les variables d'environnement de clé API correspondantes : + +``` +# API Keys +GOOGLE_API_KEY=votre_clé_google # Requis pour les modèles Google Gemini +OPENAI_API_KEY=votre_clé_openai # Requis pour les modèles OpenAI +OPENROUTER_API_KEY=votre_clé_openrouter # Requis pour les modèles OpenRouter +AZURE_OPENAI_API_KEY=votre_clé_azure_openai #Requis pour les modèles Azure OpenAI +AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai #Requis pour les modèles Azure OpenAI +AZURE_OPENAI_VERSION=votre_version_azure_openai #Requis pour les modèles Azure OpenAI + +# Configuration d'un endpoint OpenAI API personnalisé +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # Optionnel, pour les endpoints API OpenAI personnalisés + +# Hôte Ollama personnalisé +OLLAMA_HOST=votre_hôte_ollama # Optionnel, si Ollama n'est pas local. défaut: http://localhost:11434 + +# Répertoire de configuration +DEEPWIKI_CONFIG_DIR=/chemin/vers/dossier/de/configuration # Optionnel, pour personaliser le répertoire de stockage de la configuration +``` + +### Fichiers de Configuration + +DeepWiki utilise des fichiers de configuration JSON pour gérer différents aspects du système : + +1. **`generator.json`** : Configuration des modèles de génération de texte + - Définit les fournisseurs de modèles disponibles (Google, OpenAI, OpenRouter, Azure, Ollama) + - Spécifie les modèles par défaut et disponibles pour chaque fournisseur + - Contient des paramètres spécifiques aux modèles tels que la température et top_p + +2. **`embedder.json`** : Configuration des modèles d'embedding et du traitement de texte + - Définit les modèles d'embedding pour le stockage vectoriel + - Contient la configuration du retriever pour RAG + - Spécifie les paramètres du séparateur de texte pour le chunking de documents + +3. **`repo.json`** : Configuration de la gestion des dépôts + - Contient des filtres de fichiers pour exclure certains fichiers et répertoires + - Définit les limites de taille des dépôts et les règles de traitement + +Par défaut, ces fichiers sont situés dans le répertoire `api/config/`. Vous pouvez personnaliser leur emplacement à l'aide de la variable d'environnement `DEEPWIKI_CONFIG_DIR`. + +### Sélection de Modèles Personnalisés pour les Fournisseurs de Services + +La fonctionnalité de sélection de modèles personnalisés est spécialement conçue pour les fournisseurs de services qui ont besoin de : + +- Offrir plusieurs choix de modèles d'IA aux utilisateurs au sein de leur organisation +- S'adapter rapidement à l'évolution rapide du paysage des LLM sans modifications de code +- Prendre en charge des modèles spécialisés ou affinés qui ne figurent pas dans la liste prédéfinie + +Les fournisseurs de services peuvent implémenter leurs offres de modèles en sélectionnant parmi les options prédéfinies ou en entrant des identifiants de modèles personnalisés dans l'interface utilisateur. + +### Configuration de l'URL de base pour les canaux privés d'entreprise + +La configuration `base_url` du client OpenAI est principalement conçue pour les utilisateurs d'entreprise disposant de canaux API privés. Cette fonctionnalité : + +- Permet la connexion à des points de terminaison API privés ou spécifiques à l'entreprise. +- Permet aux organisations d'utiliser leurs propres services LLM auto-hébergés ou déployés sur mesure. +- Prend en charge l'intégration avec des services tiers compatibles avec l'API OpenAI. + +**Bientôt disponible** : Dans les prochaines mises à jour, DeepWiki prendra en charge un mode où les utilisateurs devront fournir leurs propres clés API dans les requêtes. Cela permettra aux entreprises clientes disposant de canaux privés d'utiliser leurs accords API existants sans partager leurs informations d'identification avec le déploiement DeepWiki. + +## 🧩 Utilisation de modèles d'embedding compatibles avec OpenAI (par exemple, Alibaba Qwen) + +Si vous souhaitez utiliser des modèles d'embedding compatibles avec l'API OpenAI (comme Alibaba Qwen), suivez ces étapes : + +1. Remplacez le contenu de `api/config/embedder.json` par celui de `api/config/embedder_openai_compatible.json`. +2. Dans votre fichier `.env` à la racine du projet, définissez les variables d'environnement appropriées, par exemple : + ``` + OPENAI_API_KEY=votre_clé_api + OPENAI_BASE_URL=votre_endpoint_compatible_openai + ``` +3. Le programme substituera automatiquement les espaces réservés dans `embedder.json` avec les valeurs de vos variables d'environnement. + +Cela vous permet de passer facilement à n'importe quel service d'embedding compatible avec OpenAI sans modifications de code. + +### Journalisation (Logging) + +DeepWiki utilise le module `logging` intégré de Python pour la sortie de diagnostics. Vous pouvez configurer la verbosité et la destination du fichier journal via des variables d'environnement : + +| Variable | Description | Valeur par défaut | +|-----------------|---------------------------------------------------------------------------|------------------------------| +| `LOG_LEVEL` | Niveau de journalisation (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO | +| `LOG_FILE_PATH` | Chemin vers le fichier journal. Si défini, les journaux y seront écrits. | `api/logs/application.log` | + +Pour activer la journalisation de débogage et diriger les journaux vers un fichier personnalisé : +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` +Ou avec Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +Lors de l'exécution avec Docker Compose, le répertoire `api/logs` du conteneur est lié à `./api/logs` sur votre hôte (voir la section `volumes` dans `docker-compose.yml`), ce qui garantit que les fichiers journaux persistent lors des redémarrages. + +Vous pouvez également stocker ces paramètres dans votre fichier `.env` : + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` +Puis exécutez simplement : + +```bash +docker-compose up +``` + +**Considérations de sécurité concernant le chemin des journaux :** Dans les environnements de production, assurez-vous que le répertoire `api/logs` et tout chemin de fichier journal personnalisé sont sécurisés avec des permissions de système de fichiers et des contrôles d'accès appropriés. L'application s'assure que `LOG_FILE_PATH` se trouve dans le répertoire `api/logs` du projet afin d'empêcher le parcours de chemin ou les écritures non autorisées. + +## 🛠️ Configuration Avancée + +### Variables d'environnement + +| Variable | Description | Requis | Note | +|-------------------------|-----------------------------------------------------------------|------------|----------------------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Clé API Google Gemini pour la génération | Non | Requis uniquement si vous souhaitez utiliser les modèles Google Gemini | +| `OPENAI_API_KEY` | Clé API OpenAI pour les embeddings et la génération | Oui | Remarque : Ceci est requis même si vous n'utilisez pas les modèles OpenAI, car elle est utilisée pour les embeddings. | +| `OPENROUTER_API_KEY` | Clé API OpenRouter pour les modèles alternatifs | Non | Requis uniquement si vous souhaitez utiliser les modèles OpenRouter | +| `AZURE_OPENAI_API_KEY` | Clé API Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI | +| `AZURE_OPENAI_ENDPOINT` | Point de terminaison Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI | +| `AZURE_OPENAI_VERSION` | Version Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI | +| `OLLAMA_HOST` | Hôte Ollama (par défaut : http://localhost:11434) | Non | Requis uniquement si vous souhaitez utiliser un serveur Ollama externe | +| `PORT` | Port du serveur API (par défaut : 8001) | Non | Si vous hébergez l'API et le frontend sur la même machine, assurez-vous de modifier le port de `SERVER_BASE_URL` en conséquence | +| `SERVER_BASE_URL` | URL de base du serveur API (par défaut : http://localhost:8001) | Non | | +| `DEEPWIKI_AUTH_MODE` | Définir sur `true` ou `1` pour activer le mode verrouillé | Non | La valeur par défaut est `false`. Si activé, `DEEPWIKI_AUTH_CODE` est requis. | +| `DEEPWIKI_AUTH_CODE` | Le code requis pour la génération de wiki lorsque `DEEPWIKI_AUTH_MODE` est activé. | Non | Utilisé uniquement si `DEEPWIKI_AUTH_MODE` est `true` ou `1`. | + +Si vous n'utilisez pas le mode Ollama, vous devez configurer une clé API OpenAI pour les embeddings. Les autres clés API ne sont requises que si vous configurez et utilisez des modèles des fournisseurs correspondants. + +## Mode vérouillé + +DeepWiki peut être configuré pour fonctionner en mode vérouillé, où la génération de wiki nécessite un code d'autorisation valide. Ceci est utile si vous souhaitez contrôler qui peut utiliser la fonctionnalité de génération. +Restreint l'initialisation du frontend et protège la suppression du cache, mais n'empêche pas complètement la génération backend si les points de terminaison de l'API sont atteints directement. + +Pour activer le mode vérouillé, définissez les variables d'environnement suivantes : + +- `DEEPWIKI_AUTH_MODE` : définissez cette variable sur `true` ou `1`. Une fois activée, l'interface affichera un champ de saisie pour le code d'autorisation. +- `DEEPWIKI_AUTH_CODE` : définissez cette variable sur le code secret souhaité. Restreint l'initialisation du frontend et protège la suppression du cache, mais n'empêche pas complètement la génération backend si les points de terminaison de l'API sont atteints directement. + +Si `DEEPWIKI_AUTH_MODE` n'est pas défini ou est défini sur `false` (ou toute autre valeur que `true`/`1`), la fonctionnalité d'autorisation sera désactivée et aucun code ne sera requis. + +### Configuration Docker + +Vous pouvez utiliser Docker pour exécuter DeepWiki : + +#### Exécution du conteneur + +```bash +# Récupérer l'image depuis GitHub Container Registry +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# Exécuter le conteneur avec les variables d'environnement +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=votre_clé_google \ + -e OPENAI_API_KEY=votre_clé_openai \ + -e OPENROUTER_API_KEY=votre_clé_openrouter \ + -e OLLAMA_HOST=votre_hôte_ollama \ + -e AZURE_OPENAI_API_KEY=votre_clé_azure_openai \ + -e AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai \ + -e AZURE_OPENAI_VERSION=votre_version_azure_openai \ + + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Cette commande monte également `~/.adalflow` de votre hôte vers `/root/.adalflow` dans le conteneur. Ce chemin est utilisé pour stocker : +- Les dépôts clonés (`~/.adalflow/repos/`) +- Leurs embeddings et index (`~/.adalflow/databases/`) +- Le contenu wiki généré mis en cache (`~/.adalflow/wikicache/`) + +Cela garantit que vos données persistent même si le conteneur est arrêté ou supprimé. + +Vous pouvez également utiliser le fichier `docker-compose.yml` fourni : + +```bash +# Modifiez d'abord le fichier .env avec vos clés API +docker-compose up +``` + +(Le fichier `docker-compose.yml` est préconfiguré pour monter `~/.adalflow` pour la persistance des données, de manière similaire à la commande `docker run` ci-dessus.) + +#### Utilisation d'un fichier .env avec Docker + +Vous pouvez également monter un fichier `.env` dans le conteneur : + +```bash +# Créer un fichier .env avec vos clés API +echo "GOOGLE_API_KEY=votre_clé_google" > .env +echo "OPENAI_API_KEY=votre_clé_openai" >> .env +echo "OPENROUTER_API_KEY=votre_clé_openrouter" >> .env +echo "AZURE_OPENAI_API_KEY=votre_clé_azure_openai" >> .env +echo "AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai" >> .env +echo "AZURE_OPENAI_VERSION=votre_version_azure_openai" >> .env +echo "OLLAMA_HOST=votre_hôte_ollama" >> .env + +# Run the container with the .env file mounted +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Cette commande monte également `~/.adalflow` de votre hôte vers `/root/.adalflow` dans le conteneur. Ce chemin est utilisé pour stocker : +- Les dépôts clonés (`~/.adalflow/repos/`) +- Leurs embeddings et index (`~/.adalflow/databases/`) +- Le contenu wiki généré mis en cache (`~/.adalflow/wikicache/`) + +Cela garantit que vos données persistent même si le conteneur est arrêté ou supprimé. + +#### Construction de l'image Docker localement + +If you want to build the Docker image locally: + +```bash +# Clone the repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Build the Docker image +docker build -t deepwiki-open . + +# Run the container +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=votre_clé_google \ + -e OPENAI_API_KEY=votre_clé_openai \ + -e OPENROUTER_API_KEY=votre_clé_openrouter \ + -e AZURE_OPENAI_API_KEY=votre_clé_azure_openai \ + -e AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai \ + -e AZURE_OPENAI_VERSION=votre_version_azure_openai \ + -e OLLAMA_HOST=votre_hôte_ollama \ + deepwiki-open +``` + +#### Utilisation de certificats auto-signés dans Docker + +Si vous êtes dans un environnement qui utilise des certificats auto-signés, vous pouvez les inclure dans la construction de l'image Docker : + +1. Créez un répertoire pour vos certificats (le répertoire par défaut est `certs` à la racine de votre projet) +2. Copiez vos fichiers de certificats `.crt` ou `.pem` dans ce répertoire +3. Construisez l'image Docker : + +```bash +# Construire avec le répertoire de certificats par défaut (certs) +docker build . + +# Ou construire avec un répertoire de certificats personnalisé +docker build --build-arg CUSTOM_CERT_DIR=my-custom-certs . +``` + +### Détails du serveur API + +Le serveur API fournit : +- Clonage et indexation des dépôts +- RAG (Retrieval Augmented Generation - Génération augmentée par récupération) +- Complétion de chat en streaming + +Pour plus de détails, consultez le [README de l’API](./api/README.md). + +## 🔌 Intégration OpenRouter + +DeepWiki prend désormais en charge [OpenRouter](https://openrouter.ai/) en tant que fournisseur de modèles, vous donnant accès à des centaines de modèles d'IA via une seule API : + +- **Options de modèles multiples** : accédez aux modèles d'OpenAI, Anthropic, Google, Meta, Mistral, et plus encore +- **Configuration simple** : ajoutez simplement votre clé API OpenRouter et sélectionnez le modèle que vous souhaitez utiliser +- **Rentabilité** : choisissez des modèles qui correspondent à votre budget et à vos besoins en termes de performances +- **Commutation facile** : basculez entre différents modèles sans modifier votre code + +### Comment utiliser OpenRouter avec DeepWiki + +1. **Obtenez une clé API** : inscrivez-vous sur [OpenRouter](https://openrouter.ai/) et obtenez votre clé API +2. **Ajouter à l'environnement** : ajoutez `OPENROUTER_API_KEY=votre_clé` à votre fichier `.env` +3. **Activer dans l'interface utilisateur** : cochez l'option "Utiliser l'API OpenRouter" sur la page d'accueil +4. **Sélectionnez le modèle** : choisissez parmi les modèles populaires tels que GPT-4o, Claude 3.5 Sonnet, Gemini 2.0, et plus encore + +OpenRouter est particulièrement utile si vous souhaitez : + +- Essayer différents modèles sans vous inscrire à plusieurs services +- Accéder à des modèles qui pourraient être restreints dans votre région +- Comparer les performances entre différents fournisseurs de modèles +- Optimiser le rapport coût/performance en fonction de vos besoins + +## 🤖 Fonctionnalités Ask & DeepResearch + +### Fonctionnalité Ask + +La fonctionnalité Ask vous permet de discuter avec votre dépôt en utilisant la génération augmentée par récupération (RAG) : + +- **Réponses sensibles au contexte** : obtenez des réponses précises basées sur le code réel de votre dépôt +- **Alimenté par RAG** : le système récupère des extraits de code pertinents pour fournir des réponses fondées +- **Streaming en temps réel** : visualisez les réponses au fur et à mesure de leur génération pour une expérience plus interactive +- **Historique des conversations** : le système conserve le contexte entre les questions pour des interactions plus cohérentes + +### Fonctionnalité DeepResearch + +DeepResearch fait passer l'analyse de référentiel au niveau supérieur avec un processus de recherche en plusieurs étapes : + +- **Enquête approfondie** : explore en profondeur des sujets complexes grâce à de multiples itérations de recherche +- **Processus structuré** : suit un plan de recherche clair avec des mises à jour et une conclusion complète +- **Continuation automatique** : l'IA poursuit automatiquement la recherche jusqu'à ce qu'elle atteigne une conclusion (jusqu'à 5 itérations) +- **Étapes de la recherche** : + 1. **Plan de recherche** : décrit l'approche et les premières conclusions + 2. **Mises à jour de la recherche** : s'appuie sur les itérations précédentes avec de nouvelles informations + 3. **Conclusion finale** : fournit une réponse complète basée sur toutes les itérations + +Pour utiliser DeepResearch, activez simplement le commutateur "Deep Research" dans l'interface Ask avant de soumettre votre question. + +## 📱 Captures d'écran + +![Interface principale de DeepWiki](screenshots/Interface.png) +*L'interface principale de DeepWiki* + +![Prise en charge des dépôts privés](screenshots/privaterepo.png) +*Accédez aux dépôts privés avec des jetons d'accès personnels* + +![Fonctionnalité DeepResearch](screenshots/DeepResearch.png) +*DeepResearch effectue des recherches en plusieurs étapes pour des sujets complexes* + +### Vidéo de démonstration + +[![Vidéo de démo DeepWiki](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*Regardez DeepWiki en action !* +## ❓ Dépannage + +### Problèmes de clé API + +- **"Variables d'environnement manquantes"** : assurez-vous que votre fichier `.env` se trouve à la racine du projet et qu'il contient les clés API requises. +- **"Clé API non valide"** : vérifiez que vous avez correctement copié la clé complète, sans espaces supplémentaires. +- **"Erreur d'API OpenRouter"** : vérifiez que votre clé API OpenRouter est valide et qu'elle dispose de crédits suffisants. +- **"Erreur d'API Azure OpenAI"** : vérifiez que vos informations d'identification Azure OpenAI (clé API, point de terminaison et version) sont correctes et que le service est correctement déployé. + +### Problèmes de connexion + +- **"Impossible de se connecter au serveur API"** : assurez-vous que le serveur API est en cours d'exécution sur le port 8001. +- **"Erreur CORS"** : l'API est configurée pour autoriser toutes les origines, mais si vous rencontrez des problèmes, essayez d'exécuter le frontend et le backend sur la même machine. + +### Problèmes de génération + +- **"Erreur lors de la génération du wiki"** : pour les très grands référentiels, essayez d'abord un référentiel plus petit. +- **"Format de référentiel non valide"** : assurez-vous que vous utilisez un format d'URL GitHub, GitLab ou Bitbucket valide. +- **"Impossible de récupérer la structure du référentiel"** : pour les référentiels privés, assurez-vous d'avoir saisi un jeton d'accès personnel valide avec les autorisations appropriées. +- **"Erreur de rendu du diagramme"** : l'application essaiera automatiquement de corriger les diagrammes cassés. + +### Solutions courantes + +1. **Redémarrez les deux serveurs** : parfois, un simple redémarrage résout la plupart des problèmes. +2. **Vérifiez les journaux de la console** : ouvrez les outils de développement du navigateur pour voir les erreurs JavaScript. +3. **Vérifiez les journaux de l'API** : consultez le terminal où l'API est en cours d'exécution pour les erreurs Python. + +## 🤝 Contribution + +Les contributions sont les bienvenues ! N'hésitez pas à : +- Ouvrir des issues pour les bugs ou les demandes de fonctionnalités +- Soumettre des pull requests pour améliorer le code +- Partager vos commentaires et vos idées + +## 📄 Licence + +Projet sous licence MIT – Voir le fichier [LICENSE](LICENSE). + +## ⭐ Historique des stars + +[![Historique des stars](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + + diff --git a/reference-deepwiki/deepwiki-open-main/README.ja.md b/reference-deepwiki/deepwiki-open-main/README.ja.md new file mode 100644 index 0000000..1819c0f --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.ja.md @@ -0,0 +1,447 @@ +# DeepWiki-Open + +![DeepWiki バナー](screenshots/Deepwiki.png) + +**DeepWiki**は、GitHub、GitLab、または Bitbucket リポジトリのための美しくインタラクティブな Wiki を自動的に作成します!リポジトリ名を入力するだけで、DeepWiki は以下を行います: + +1. コード構造を分析 +2. 包括的なドキュメントを生成 +3. すべての仕組みを説明する視覚的な図を作成 +4. すべてを簡単に閲覧できる Wiki に整理 + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ 特徴 + +- **即時ドキュメント生成**: あらゆる GitHub、GitLab、または Bitbucket リポジトリを数秒で Wiki に変換 +- **プライベートリポジトリ対応**: 個人アクセストークンを使用してプライベートリポジトリに安全にアクセス +- **スマート分析**: AI を活用したコード構造と関係の理解 +- **美しい図表**: アーキテクチャとデータフローを視覚化する自動 Mermaid 図 +- **簡単なナビゲーション**: Wiki を探索するためのシンプルで直感的なインターフェース +- **質問機能**: RAG 搭載 AI を使用してリポジトリとチャットし、正確な回答を得る +- **詳細調査**: 複雑なトピックを徹底的に調査する多段階研究プロセス +- **複数のモデルプロバイダー**: Google Gemini、OpenAI、OpenRouter、およびローカル Ollama モデルのサポート + +## 🚀 クイックスタート(超簡単!) + +### オプション 1: Docker を使用 + +```bash +# リポジトリをクローン +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# APIキーを含む.envファイルを作成 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# オプション: OpenRouterモデルを使用する場合はOpenRouter APIキーを追加 +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Docker Composeで実行 +docker-compose up +``` + +(上記の Docker コマンドおよび`docker-compose.yml`の設定では、ホスト上の`~/.adalflow`ディレクトリをコンテナ内の`/root/.adalflow`にマウントします。このパスは以下のものを保存するために使用されます: + +- クローンされたリポジトリ (`~/.adalflow/repos/`) +- それらのエンベディングとインデックス (`~/.adalflow/databases/`) +- 生成された Wiki のキャッシュ (`~/.adalflow/wikicache/`) + +これにより、コンテナが停止または削除されてもデータが永続化されます。) + +> 💡 **これらのキーの入手先:** +> +> - Google API キーは[Google AI Studio](https://makersuite.google.com/app/apikey)から取得 +> - OpenAI API キーは[OpenAI Platform](https://platform.openai.com/api-keys)から取得 + +### オプション 2: 手動セットアップ(推奨) + +#### ステップ 1: API キーの設定 + +プロジェクトのルートに`.env`ファイルを作成し、以下のキーを追加します: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# オプション: OpenRouterモデルを使用する場合は追加 +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### ステップ 2: バックエンドの起動 + +```bash +# Pythonの依存関係をインストール +pip install -r api/requirements.txt + +# APIサーバーを起動 +python -m api.main +``` + +#### ステップ 3: フロントエンドの起動 + +```bash +# JavaScript依存関係をインストール +npm install +# または +yarn install + +# Webアプリを起動 +npm run dev +# または +yarn dev +``` + +#### ステップ 4: DeepWiki を使用! + +1. ブラウザで[http://localhost:3000](http://localhost:3000)を開く +2. GitHub、GitLab、または Bitbucket リポジトリを入力(例:`https://github.com/openai/codex`、`https://github.com/microsoft/autogen`、`https://gitlab.com/gitlab-org/gitlab`、または`https://bitbucket.org/redradish/atlassian_app_versions`) +3. プライベートリポジトリの場合は、「+ アクセストークンを追加」をクリックして GitHub または GitLab の個人アクセストークンを入力 +4. 「Wiki を生成」をクリックして、魔法が起こるのを見守りましょう! + +## 🔍 仕組み + +DeepWiki は AI を使用して: + +1. GitHub、GitLab、または Bitbucket リポジトリをクローンして分析(トークン認証によるプライベートリポジトリを含む) +2. スマート検索のためのコードの埋め込みを作成 +3. コンテキスト対応 AI でドキュメントを生成(Google Gemini、OpenAI、OpenRouter、またはローカル Ollama モデルを使用) +4. コードの関係を説明する視覚的な図を作成 +5. すべてを構造化された Wiki に整理 +6. 質問機能を通じてリポジトリとのインテリジェントな Q&A を可能に +7. 詳細調査機能で深い研究能力を提供 + +```mermaid +graph TD + A[ユーザーがGitHub/GitLab/Bitbucketリポジトリを入力] --> AA{プライベートリポジトリ?} + AA -->|はい| AB[アクセストークンを追加] + AA -->|いいえ| B[リポジトリをクローン] + AB --> B + B --> C[コード構造を分析] + C --> D[コード埋め込みを作成] + + D --> M{モデルプロバイダーを選択} + M -->|Google Gemini| E1[Geminiで生成] + M -->|OpenAI| E2[OpenAIで生成] + M -->|OpenRouter| E3[OpenRouterで生成] + M -->|ローカルOllama| E4[Ollamaで生成] + + E1 --> E[ドキュメントを生成] + E2 --> E + E3 --> E + E4 --> E + + D --> F[視覚的な図を作成] + E --> G[Wikiとして整理] + F --> G + G --> H[インタラクティブなDeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ プロジェクト構造 + +``` +deepwiki/ +├── api/ # バックエンドAPIサーバー +│ ├── main.py # APIエントリーポイント +│ ├── api.py # FastAPI実装 +│ ├── rag.py # 検索拡張生成 +│ ├── data_pipeline.py # データ処理ユーティリティ +│ └── requirements.txt # Python依存関係 +│ +├── src/ # フロントエンドNext.jsアプリ +│ ├── app/ # Next.jsアプリディレクトリ +│ │ └── page.tsx # メインアプリケーションページ +│ └── components/ # Reactコンポーネント +│ └── Mermaid.tsx # Mermaid図レンダラー +│ +├── public/ # 静的アセット +├── package.json # JavaScript依存関係 +└── .env # 環境変数(作成する必要あり) +``` + +## 🛠️ 高度な設定 + +### 環境変数 + +| 変数 | 説明 | 必須 | 注意 | +| ----------------------------- | --------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------- | +| `GOOGLE_API_KEY` | AI 生成のための Google Gemini API キー | ◯ | | +| `OPENAI_API_KEY` | 埋め込みのための OpenAI API キー | ◯ | | +| `OPENROUTER_API_KEY` | 代替モデルのための OpenRouter API キー | ✗ | OpenRouter モデルを使用する場合にのみ必須です | +| `PORT` | API サーバーのポート(デフォルト:8001) | ✗ | API とフロントエンドを同じマシンでホストする場合、`NEXT_PUBLIC_SERVER_BASE_URL`のポートを適宜変更してください | +| `SERVER_BASE_URL` | API サーバーのベース URL(デフォルト:`http://localhost:8001`) | ✗ | | + +### 設定ファイル + +DeepWikiはシステムの様々な側面を管理するためにJSON設定ファイルを使用しています: + +1. **`generator.json`**: テキスト生成モデルの設定 + - 利用可能なモデルプロバイダー(Google、OpenAI、OpenRouter、Ollama)を定義 + - 各プロバイダーのデフォルトおよび利用可能なモデルを指定 + - temperatureやtop_pなどのモデル固有のパラメータを含む + +2. **`embedder.json`**: 埋め込みモデルとテキスト処理の設定 + - ベクトルストレージ用の埋め込みモデルを定義 + - RAG用の検索設定を含む + - ドキュメントチャンク分割のためのテキスト分割設定を指定 + +3. **`repo.json`**: リポジトリ処理の設定 + - 特定のファイルやディレクトリを除外するファイルフィルターを含む + - リポジトリサイズ制限と処理ルールを定義 + +デフォルトでは、これらのファイルは`api/config/`ディレクトリにあります。`DEEPWIKI_CONFIG_DIR`環境変数を使用して、その場所をカスタマイズできます。 + +### Docker セットアップ + +Docker を使用して DeepWiki を実行できます: + +```bash +# GitHub Container Registryからイメージをプル +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# 環境変数を設定してコンテナを実行 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +このコマンドは、ホスト上の ⁠~/.adalflow をコンテナ内の ⁠/root/.adalflow にマウントします。このパスは以下のものを保存するために使用されます: + +- クローンされたリポジトリ (⁠~/.adalflow/repos/) +- それらのエンベディングとインデックス (⁠~/.adalflow/databases/) +- 生成された Wiki のキャッシュ (⁠~/.adalflow/wikicache/) + +これにより、コンテナが停止または削除されてもデータが永続化されます。 +または、提供されている ⁠docker-compose.yml ファイルを使用します。 + +```bash +# まず.envファイルをAPIキーで編集 +docker-compose up +``` + +(⁠docker-compose.yml ファイルは、上記の ⁠docker run コマンドと同様に、データ永続化のために ⁠~/.adalflow をマウントするように事前設定されています。) + +#### Docker で.env ファイルを使用する + +.env ファイルをコンテナにマウントすることもできます: + +```bash +# APIキーを含む.envファイルを作成 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# .envファイルをマウントしてコンテナを実行 +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +このコマンドは、ホスト上の ⁠~/.adalflow をコンテナ内の ⁠/root/.adalflow にマウントします。このパスは以下のものを保存するために使用されます: + +- クローンされたリポジトリ (⁠~/.adalflow/repos/) +- それらのエンベディングとインデックス (⁠~/.adalflow/databases/) +- 生成された Wiki のキャッシュ (⁠~/.adalflow/wikicache/) + +これにより、コンテナが停止または削除されてもデータが永続化されます。 + +#### Docker イメージをローカルでビルドする + +Docker イメージをローカルでビルドしたい場合: + +```bash +# リポジトリをクローン +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Dockerイメージをビルド +docker build -t deepwiki-open . + +# コンテナを実行 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + deepwiki-open +``` + +# API サーバー詳細 + +API サーバーは以下を提供します: + +- リポジトリのクローンとインデックス作成 +- RAG(Retrieval Augmented Generation:検索拡張生成) +- ストリーミングチャット補完 + +詳細については、API README を参照してください。 + +## 🤖 プロバイダーベースのモデル選択システム + +DeepWikiでは、複数のLLMプロバイダーをサポートする柔軟なプロバイダーベースのモデル選択システムを実装しています: + +### サポートされているプロバイダーとモデル + +- **Google**: デフォルトは `gemini-2.5-flash`、また `gemini-2.5-flash-lite`、`gemini-2.5-pro` などもサポート +- **OpenAI**: デフォルトは `gpt-5-nano`、また `gpt-5`、 `4o` などもサポート +- **OpenRouter**: Claude、Llama、Mistralなど、統一APIを通じて複数のモデルにアクセス +- **Ollama**: `llama3` などのローカルで実行するオープンソースモデルをサポート + +### 環境変数 + +各プロバイダーには、対応するAPI鍵の環境変数が必要です: + +``` +# API鍵 +GOOGLE_API_KEY=あなたのGoogle API鍵 # Google Geminiモデルに必要 +OPENAI_API_KEY=あなたのOpenAI鍵 # OpenAIモデルに必要 +OPENROUTER_API_KEY=あなたのOpenRouter鍵 # OpenRouterモデルに必要 + +# OpenAI APIベースURL設定 +OPENAI_BASE_URL=https://カスタムAPIエンドポイント.com/v1 # オプション、カスタムOpenAI APIエンドポイント用 +``` + +### サービスプロバイダー向けのカスタムモデル選択 + +カスタムモデル選択機能は、あなたの組織のユーザーに様々なAIモデルの選択肢を提供するために特別に設計されています: + +- あなたは組織内のユーザーに様々なAIモデルの選択肢を提供できます +- あなたはコード変更なしで急速に進化するLLM環境に迅速に適応できます +- あなたは事前定義リストにない専門的またはファインチューニングされたモデルをサポートできます + +サービスプロバイダーは、事前定義されたオプションから選択するか、フロントエンドインターフェースでカスタムモデル識別子を入力することで、モデル提供を実装できます。 + +### エンタープライズプライベートチャネル向けのベースURL設定 + +OpenAIクライアントのbase_url設定は、主にプライベートAPIチャネルを持つエンタープライズユーザー向けに設計されています。この機能は: + +- プライベートまたは企業固有のAPIエンドポイントへの接続を可能に +- 組織が自己ホスト型または独自にデプロイされたLLMサービスを使用可能に +- サードパーティのOpenAI API互換サービスとの統合をサポート + +**近日公開**: 将来のアップデートでは、ユーザーがリクエストで自分のAPI鍵を提供する必要があるモードをDeepWikiがサポートする予定です。これにより、プライベートチャネルを持つエンタープライズ顧客は、DeepWikiデプロイメントと認証情報を共有することなく、既存のAPI設定を使用できるようになります。 + +## 🔌 OpenRouter 連携 + +DeepWiki は、モデルプロバイダーとして OpenRouter をサポートするようになり、単一の API を通じて数百の AI モデルにアクセスできるようになりました。 + +- 複数のモデルオプション: OpenAI、Anthropic、Google、Meta、Mistralなど、統一APIを通じて複数のモデルにアクセス +- 簡単な設定: OpenRouter API キーを追加し、使用したいモデルを選択するだけ +- コスト効率: 予算とパフォーマンスのニーズに合ったモデルを選択 +- 簡単な切り替え: コードを変更することなく、異なるモデル間を切り替え可能 + +### DeepWiki で OpenRouter を使用する方法 + +1. API キーを取得: OpenRouter でサインアップし、API キーを取得します +2. 環境に追加: ⁠.env ファイルに ⁠OPENROUTER_API_KEY=your_key を追加します +3. UI で有効化: ホームページの「OpenRouter API を使用」オプションをチェックします +4. モデルを選択: GPT-4o、Claude 3.5 Sonnet、Gemini 2.0 などの人気モデルから選択します + +OpenRouter は特に以下のような場合に便利です: + +- 複数のサービスにサインアップせずに異なるモデルを試したい +- お住まいの地域で制限されている可能性のあるモデルにアクセスしたい +- 異なるモデルプロバイダー間でパフォーマンスを比較したい +- ニーズに基づいてコストとパフォーマンスを最適化したい + +## 🤖 質問と詳細調査機能 + +### 質問機能 + +質問機能を使用すると、検索拡張生成(RAG)を使用してリポジトリとチャットできます: + +- **コンテキスト対応の回答**: リポジトリの実際のコードに基づいた正確な回答を取得 +- **RAG 搭載**: システムは関連するコードスニペットを取得して根拠のある回答を提供 +- **リアルタイムストリーミング**: よりインタラクティブな体験のために、生成されるレスポンスをリアルタイムで確認 +- **会話履歴**: システムは質問間のコンテキストを維持し、より一貫性のあるインタラクションを実現 + +### 詳細調査機能 + +詳細調査は、複数ターンの研究プロセスでリポジトリ分析を次のレベルに引き上げます: + +- **詳細な調査**: 複数の研究反復を通じて複雑なトピックを徹底的に探索 +- **構造化されたプロセス**: 明確な研究計画、更新、包括的な結論を含む +- **自動継続**: AI は結論に達するまで自動的に研究を継続(最大 5 回の反復) +- **研究段階**: + 1. **研究計画**: アプローチと初期調査結果の概要 + 2. **研究更新**: 新しい洞察を加えて前の反復を発展 + 3. **最終結論**: すべての反復に基づく包括的な回答を提供 + +詳細調査を使用するには、質問を送信する前に質問インターフェースの「詳細調査」スイッチをオンにするだけです。 + +## 📱 スクリーンショット + +![DeepWikiメインインターフェース](screenshots/Interface.png) +_DeepWiki のメインインターフェース_ + +![プライベートリポジトリサポート](screenshots/privaterepo.png) +_個人アクセストークンを使用したプライベートリポジトリへのアクセス_ + +![詳細調査機能](screenshots/DeepResearch.png) +_詳細調査は複雑なトピックに対して多段階の調査を実施_ + +### デモビデオ + +[![DeepWikiデモビデオ](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +_DeepWiki の動作を見る!_ + +## ❓ トラブルシューティング + +### API キーの問題 + +- **「環境変数が見つかりません」**: `.env`ファイルがプロジェクトのルートにあり、必要な API キーが含まれていることを確認 +- **「API キーが無効です」**: キー全体が余分なスペースなしで正しくコピーされていることを確認 +- **「OpenRouter API エラー」**: OpenRouter API キーが有効で、十分なクレジットがあることを確認 + +### 接続の問題 + +- **「API サーバーに接続できません」**: API サーバーがポート 8001 で実行されていることを確認 +- **「CORS エラー」**: API はすべてのオリジンを許可するように設定されていますが、問題がある場合は、フロントエンドとバックエンドを同じマシンで実行してみてください + +### 生成の問題 + +- **「Wiki の生成中にエラーが発生しました」**: 非常に大きなリポジトリの場合は、まず小さいものから試してみてください +- **「無効なリポジトリ形式」**: 有効な GitHub、GitLab、または Bitbucket URL の形式を使用していることを確認 +- **「リポジトリ構造を取得できませんでした」**: プライベートリポジトリの場合、適切な権限を持つ有効な個人アクセストークンを入力したことを確認 +- **「図のレンダリングエラー」**: アプリは自動的に壊れた図を修正しようとします + +### 一般的な解決策 + +1. **両方のサーバーを再起動**: 単純な再起動でほとんどの問題が解決することがあります +2. **コンソールログを確認**: ブラウザの開発者ツールを開いて JavaScript エラーを確認 +3. **API ログを確認**: API が実行されているターミナルで Python エラーを確認 + +## 🤝 貢献 + +貢献は歓迎します!以下のことを自由に行ってください: + +- バグや機能リクエストの問題を開く +- コードを改善するためのプルリクエストを提出 +- フィードバックやアイデアを共有 + +## 📄 ライセンス + +このプロジェクトは MIT ライセンスの下でライセンスされています - 詳細は[LICENSE](LICENSE)ファイルを参照してください。 + +## ⭐ スター履歴 + +[![スター履歴チャート](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + diff --git a/reference-deepwiki/deepwiki-open-main/README.kr.md b/reference-deepwiki/deepwiki-open-main/README.kr.md new file mode 100644 index 0000000..d22edef --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.kr.md @@ -0,0 +1,430 @@ +# DeepWiki-Open + +![DeepWiki Banner](screenshots/Deepwiki.png) + +**DeepWiki**는 제가 직접 구현한 프로젝트로, GitHub, GitLab 또는 BitBucket 저장소에 대해 아름답고 대화형 위키를 자동 생성합니다! 저장소 이름만 입력하면 DeepWiki가 다음을 수행합니다: + +1. 코드 구조 분석 +2. 포괄적인 문서 생성 +3. 모든 작동 방식을 설명하는 시각적 다이어그램 생성 +4. 이를 쉽게 탐색할 수 있는 위키로 정리 + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ 주요 기능 + +- **즉시 문서화**: 어떤 GitHub, GitLab 또는 BitBucket 저장소든 몇 초 만에 위키로 변환 +- **비공개 저장소 지원**: 개인 액세스 토큰으로 비공개 저장소 안전하게 접근 +- **스마트 분석**: AI 기반 코드 구조 및 관계 이해 +- **아름다운 다이어그램**: 아키텍처와 데이터 흐름을 시각화하는 자동 Mermaid 다이어그램 +- **쉬운 탐색**: 간단하고 직관적인 인터페이스로 위키 탐색 가능 +- **Ask 기능**: RAG 기반 AI와 저장소에 대해 대화하며 정확한 답변 얻기 +- **DeepResearch**: 복잡한 주제를 철저히 조사하는 다중 턴 연구 프로세스 +- **다양한 모델 제공자 지원**: Google Gemini, OpenAI, OpenRouter, 로컬 Ollama 모델 지원 + +## 🚀 빠른 시작 (초간단!) + +### 옵션 1: Docker 사용 + +```bash +# 저장소 클론 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# API 키를 포함한 .env 파일 생성 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# 선택 사항: OpenRouter 모델 사용 시 API 키 추가 +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Docker Compose로 실행 +docker-compose up +``` + +> 💡 **API 키는 어디서 얻나요:** +> - [Google AI Studio](https://makersuite.google.com/app/apikey)에서 Google API 키 받기 +> - [OpenAI 플랫폼](https://platform.openai.com/api-keys)에서 OpenAI API 키 받기 + +### 옵션 2: 수동 설정 (권장) + +#### 1단계: API 키 설정 + +프로젝트 루트에 `.env` 파일을 만들고 다음 키들을 추가하세요: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# 선택 사항: OpenRouter 모델 사용 시 추가 +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### 2단계: 백엔드 시작 + +```bash +# Python 의존성 설치 +pip install -r api/requirements.txt + +# API 서버 실행 +python -m api.main +``` + +#### 3단계: 프론트엔드 시작 + +```bash +# JavaScript 의존성 설치 +npm install +# 또는 +yarn install + +# 웹 앱 실행 +npm run dev +# 또는 +yarn dev +``` + +#### 4단계: DeepWiki 사용하기! + +1. 브라우저에서 [http://localhost:3000](http://localhost:3000) 열기 +2. GitHub, GitLab 또는 Bitbucket 저장소 입력 (예: `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, `https://bitbucket.org/redradish/atlassian_app_versions`) +3. 비공개 저장소인 경우 "+ 액세스 토큰 추가" 클릭 후 GitHub 또는 GitLab 개인 액세스 토큰 입력 +4. "Generate Wiki" 클릭 후 마법을 지켜보기! + +## 🔍 작동 방식 + +DeepWiki는 AI를 사용하여 다음을 수행합니다: + +1. GitHub, GitLab 또는 Bitbucket 저장소 복제 및 분석 (토큰 인증이 필요한 비공개 저장소 포함) +2. 스마트 검색을 위한 코드 임베딩 생성 +3. 문맥 인지 AI로 문서 생성 (Google Gemini, OpenAI, OpenRouter 또는 로컬 Ollama 모델 사용) +4. 코드 관계를 설명하는 시각적 다이어그램 생성 +5. 모든 것을 구조화된 위키로 정리 +6. Ask 기능을 통한 저장소와의 지능형 Q&A 지원 +7. DeepResearch로 심층 연구 기능 제공 + +```mermaid +graph TD + A[사용자가 GitHub/GitLab/Bitbucket 저장소 입력] --> AA{비공개 저장소인가?} + AA -->|예| AB[액세스 토큰 추가] + AA -->|아니오| B[저장소 복제] + AB --> B + B --> C[코드 구조 분석] + C --> D[코드 임베딩 생성] + + D --> M{모델 제공자 선택} + M -->|Google Gemini| E1[Gemini로 생성] + M -->|OpenAI| E2[OpenAI로 생성] + M -->|OpenRouter| E3[OpenRouter로 생성] + M -->|로컬 Ollama| E4[Ollama로 생성] + + E1 --> E[문서 생성] + E2 --> E + E3 --> E + E4 --> E + + D --> F[시각적 다이어그램 생성] + E --> G[위키로 정리] + F --> G + G --> H[대화형 DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ 프로젝트 구조 + +``` +deepwiki/ +├── api/ # 백엔드 API 서버 +│ ├── main.py # API 진입점 +│ ├── api.py # FastAPI 구현 +│ ├── rag.py # Retrieval Augmented Generation +│ ├── data_pipeline.py # 데이터 처리 유틸리티 +│ └── requirements.txt # Python 의존성 +│ +├── src/ # 프론트엔드 Next.js 앱 +│ ├── app/ # Next.js 앱 디렉토리 +│ │ └── page.tsx # 메인 애플리케이션 페이지 +│ └── components/ # React 컴포넌트 +│ └── Mermaid.tsx # Mermaid 다이어그램 렌더러 +│ +├── public/ # 정적 자산 +├── package.json # JavaScript 의존성 +└── .env # 환경 변수 (직접 생성) +``` + +## 🛠️ 고급 설정 + +### 환경 변수 + +| 변수명 | 설명 | 필수 | 비고 | +|----------|-------------|----------|------| +| `GOOGLE_API_KEY` | AI 생성용 Google Gemini API 키 | 예 | +| `OPENAI_API_KEY` | 임베딩용 OpenAI API 키 | 예 | +| `OPENROUTER_API_KEY` | 대체 모델용 OpenRouter API 키 | 아니오 | OpenRouter 모델 사용 시 필요 | +| `PORT` | API 서버 포트 (기본값: 8001) | 아니오 | API와 프론트엔드를 같은 머신에서 호스팅 시 `SERVER_BASE_URL`의 포트도 변경 필요 | +| `SERVER_BASE_URL` | API 서버 기본 URL (기본값: http://localhost:8001) | 아니오 | + +### 설정 파일 + +DeepWiki는 시스템의 다양한 측면을 관리하기 위해 JSON 설정 파일을 사용합니다: + +1. **`generator.json`**: 텍스트 생성 모델 설정 + - 사용 가능한 모델 제공자(Google, OpenAI, OpenRouter, Ollama) 정의 + - 각 제공자의 기본 및 사용 가능한 모델 지정 + - temperature와 top_p 같은 모델별 매개변수 포함 + +2. **`embedder.json`**: 임베딩 모델 및 텍스트 처리 설정 + - 벡터 저장소용 임베딩 모델 정의 + - RAG를 위한 검색기 설정 포함 + - 문서 청킹을 위한 텍스트 분할기 설정 지정 + +3. **`repo.json`**: 저장소 처리 설정 + - 특정 파일 및 디렉토리를 제외하는 파일 필터 포함 + - 저장소 크기 제한 및 처리 규칙 정의 + +기본적으로 이러한 파일은 `api/config/` 디렉토리에 위치합니다. `DEEPWIKI_CONFIG_DIR` 환경 변수를 사용하여 위치를 사용자 정의할 수 있습니다. + +### Docker 설정 + +Docker를 사용하여 DeepWiki를 실행할 수 있습니다: + +```bash +# GitHub 컨테이너 레지스트리에서 이미지 가져오기 +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# 환경 변수와 함께 컨테이너 실행 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +이 명령어는 또한 호스트의 `~/.adalflow`를 컨테이너의 `/root/.adalflow`에 마운트합니다. 이 경로는 다음을 저장하는 데 사용됩니다: +- 복제된 저장소 (`~/.adalflow/repos/`) +- 해당 저장소의 임베딩 및 인덱스 (`~/.adalflow/databases/`) +- 생성된 위키의 캐시 (`~/.adalflow/wikicache/`) + +이를 통해 컨테이너가 중지되거나 제거되어도 데이터가 유지됩니다. + +또는 제공된 `docker-compose.yml` 파일을 사용하세요: + +```bash +# API 키가 포함된 .env 파일을 먼저 편집 +docker-compose up +``` + +(`docker-compose.yml` 파일은 위의 `docker run` 명령어와 유사하게 데이터 지속성을 위해 `~/.adalflow`를 마운트하도록 미리 구성되어 있습니다.) + +#### Docker에서 .env 파일 사용하기 + +.env 파일을 컨테이너에 마운트할 수도 있습니다: + +```bash +# API 키가 포함된 .env 파일 생성 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# .env 파일을 마운트하여 컨테이너 실행 +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +이 명령어는 또한 호스트의 `~/.adalflow`를 컨테이너의 `/root/.adalflow`에 마운트합니다. 이 경로는 다음을 저장하는 데 사용됩니다: +- 복제된 저장소 (`~/.adalflow/repos/`) +- 해당 저장소의 임베딩 및 인덱스 (`~/.adalflow/databases/`) +- 생성된 위키의 캐시 (`~/.adalflow/wikicache/`) + +이를 통해 컨테이너가 중지되거나 제거되어도 데이터가 유지됩니다. + +#### 로컬에서 Docker 이미지 빌드하기 + +로컬에서 Docker 이미지를 빌드하려면: + +```bash +# 저장소 클론 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Docker 이미지 빌드 +docker build -t deepwiki-open . + +# 컨테이너 실행 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + deepwiki-open +``` + +### API 서버 상세 정보 + +API 서버는 다음을 제공합니다: +- 저장소 복제 및 인덱싱 +- RAG (Retrieval Augmented Generation) +- 스트리밍 채팅 완성 + +자세한 내용은 [API README](./api/README.md)를 참조하세요. + +## 🤖 제공자 기반 모델 선택 시스템 + +DeepWiki는 이제 여러 LLM 제공자를 지원하는 유연한 제공자 기반 모델 선택 시스템을 구현했습니다: + +### 지원되는 제공자 및 모델 + +- **Google**: 기본값 `gemini-2.5-flash`, 또한 `gemini-2.5-flash-lite`, `gemini-2.5-pro` 등도 지원 +- **OpenAI**: 기본값 `gpt-5-nano`, 또한 `gpt-5`, `4o` 등도 지원 +- **OpenRouter**: Claude, Llama, Mistral 등 통합 API를 통해 다양한 모델 접근 가능 +- **Ollama**: `llama3`와 같은 로컬에서 실행되는 오픈소스 모델 지원 + +### 환경 변수 + +각 제공자는 해당 API 키 환경 변수가 필요합니다: + +``` +# API 키 +GOOGLE_API_KEY=귀하의_구글_API_키 # Google Gemini 모델에 필요 +OPENAI_API_KEY=귀하의_OpenAI_키 # OpenAI 모델에 필요 +OPENROUTER_API_KEY=귀하의_OpenRouter_키 # OpenRouter 모델에 필요 + +# OpenAI API 기본 URL 구성 +OPENAI_BASE_URL=https://사용자정의_API_엔드포인트.com/v1 # 선택 사항, 사용자 정의 OpenAI API 엔드포인트용 +``` + +### 서비스 제공자를 위한 사용자 정의 모델 선택 + +사용자 정의 모델 선택 기능은 다음이 필요한 서비스 제공자를 위해 특별히 설계되었습니다: + +- 귀하는 조직 내 사용자에게 다양한 AI 모델 선택 옵션을 제공할 수 있습니다 +- 귀하는 코드 변경 없이 빠르게 진화하는 LLM 환경에 신속하게 적응할 수 있습니다 +- 귀하는 사전 정의된 목록에 없는 특수하거나 미세 조정된 모델을 지원할 수 있습니다 + +서비스 제공자는 사전 정의된 옵션에서 선택하거나 프론트엔드 인터페이스에서 사용자 정의 모델 식별자를 입력하여 모델 제공을 구현할 수 있습니다. + +### 기업 전용 채널을 위한 기본 URL 구성 + +OpenAI 클라이언트의 base_url 구성은 주로 비공개 API 채널이 있는 기업 사용자를 위해 설계되었습니다. 이 기능은: + +- 비공개 또는 기업 전용 API 엔드포인트 연결 가능 +- 조직이 자체 호스팅되거나 사용자 정의 배포된 LLM 서비스 사용 가능 +- 서드파티 OpenAI API 호환 서비스와의 통합 지원 + +**출시 예정**: 향후 업데이트에서 DeepWiki는 사용자가 요청에서 자신의 API 키를 제공해야 하는 모드를 지원할 예정입니다. 이를 통해 비공개 채널이 있는 기업 고객은 DeepWiki 배포와 자격 증명을 공유하지 않고도 기존 API 구성을 사용할 수 있습니다. + +## 🔌 OpenRouter 통합 + +DeepWiki는 이제 [OpenRouter](https://openrouter.ai/)를 모델 제공자로 지원하여, 단일 API를 통해 수백 개의 AI 모델에 접근할 수 있습니다: + +- **다양한 모델 옵션**: OpenAI, Anthropic, Google, Meta, Mistral 등 다양한 모델 이용 가능 +- **간편한 설정**: OpenRouter API 키만 추가하고 원하는 모델 선택 +- **비용 효율성**: 예산과 성능에 맞는 모델 선택 가능 +- **손쉬운 전환**: 코드 변경 없이 다양한 모델 간 전환 가능 + +### DeepWiki에서 OpenRouter 사용법 + +1. **API 키 받기**: [OpenRouter](https://openrouter.ai/) 가입 후 API 키 획득 +2. **환경 변수 추가**: `.env` 파일에 `OPENROUTER_API_KEY=your_key` 추가 +3. **UI에서 활성화**: 홈페이지에서 "Use OpenRouter API" 옵션 체크 +4. **모델 선택**: GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 등 인기 모델 선택 + +OpenRouter는 특히 다음과 같은 경우 유용합니다: +- 여러 서비스에 가입하지 않고 다양한 모델 시도 +- 지역 제한이 있는 모델 접근 +- 모델 제공자별 성능 비교 +- 비용과 성능 최적화 + +## 🤖 Ask 및 DeepResearch 기능 + +### Ask 기능 + +Ask 기능은 Retrieval Augmented Generation (RAG)을 사용해 저장소와 대화할 수 있습니다: + +- **문맥 인지 답변**: 저장소 내 실제 코드 기반으로 정확한 답변 제공 +- **RAG 기반**: 관련 코드 조각을 검색해 근거 있는 답변 생성 +- **실시간 스트리밍**: 답변 생성 과정을 실시간으로 확인 가능 +- **대화 기록 유지**: 질문 간 문맥을 유지해 더 일관된 대화 가능 + +### DeepResearch 기능 + +DeepResearch는 다중 턴 연구 프로세스를 통해 저장소 분석을 한층 심화합니다: + +- **심층 조사**: 여러 연구 반복을 통해 복잡한 주제 철저히 탐구 +- **구조화된 프로세스**: 연구 계획, 업데이트, 최종 결론 단계로 진행 +- **자동 연속 진행**: AI가 최대 5회 반복해 연구를 계속 진행 +- **연구 단계**: + 1. **연구 계획**: 접근법과 초기 발견 사항 개요 작성 + 2. **연구 업데이트**: 이전 반복 내용을 바탕으로 새로운 통찰 추가 + 3. **최종 결론**: 모든 반복을 종합한 포괄적 답변 제공 + +DeepResearch를 사용하려면 질문 제출 전 Ask 인터페이스에서 "Deep Research" 스위치를 켜세요. + +## 📱 스크린샷 + +![DeepWiki Main Interface](screenshots/Interface.png) +*DeepWiki의 메인 인터페이스* + +![Private Repository Support](screenshots/privaterepo.png) +*개인 액세스 토큰으로 비공개 저장소 접근* + +![DeepResearch Feature](screenshots/DeepResearch.png) +*DeepResearch는 복잡한 주제에 대해 다중 턴 조사를 수행* + +### 데모 영상 + +[![DeepWiki Demo Video](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*DeepWiki 작동 영상 보기!* + +## ❓ 문제 해결 + +### API 키 문제 +- **"환경 변수 누락"**: `.env` 파일이 프로젝트 루트에 있고 필요한 API 키가 포함되어 있는지 확인 +- **"API 키가 유효하지 않음"**: 키를 정확히 복사했는지, 공백이 없는지 확인 +- **"OpenRouter API 오류"**: OpenRouter API 키가 유효하고 충분한 크레딧이 있는지 확인 + +### 연결 문제 +- **"API 서버에 연결할 수 없음"**: API 서버가 포트 8001에서 실행 중인지 확인 +- **"CORS 오류"**: API가 모든 출처를 허용하도록 설정되어 있지만 문제가 있으면 프론트엔드와 백엔드를 같은 머신에서 실행해 보세요 + +### 생성 문제 +- **"위키 생성 오류"**: 아주 큰 저장소는 먼저 작은 저장소로 시도해 보세요 +- **"잘못된 저장소 형식"**: 유효한 GitHub, GitLab 또는 Bitbucket URL 형식인지 확인 +- **"저장소 구조를 가져올 수 없음"**: 비공개 저장소라면 적절한 권한의 개인 액세스 토큰을 입력했는지 확인 +- **"다이어그램 렌더링 오류"**: 앱이 자동으로 다이어그램 오류를 수정하려 시도합니다 + +### 일반적인 해결법 +1. **서버 둘 다 재시작**: 간단한 재시작으로 대부분 문제 해결 +2. **콘솔 로그 확인**: 브라우저 개발자 도구에서 자바스크립트 오류 확인 +3. **API 로그 확인**: API 실행 터미널에서 Python 오류 확인 + +## 🤝 기여 + +기여를 환영합니다! 다음을 자유롭게 해주세요: +- 버그나 기능 요청을 위한 이슈 열기 +- 코드 개선을 위한 풀 리퀘스트 제출 +- 피드백과 아이디어 공유 + +## 📄 라이선스 + +이 프로젝트는 MIT 라이선스 하에 있습니다 - 자세한 내용은 [LICENSE](LICENSE) 파일 참고. + +## ⭐ 스타 히스토리 + +[![Star History Chart](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + diff --git a/reference-deepwiki/deepwiki-open-main/README.md b/reference-deepwiki/deepwiki-open-main/README.md new file mode 100644 index 0000000..6ad6f5a --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.md @@ -0,0 +1,651 @@ +# DeepWiki-Open + +![DeepWiki Banner](screenshots/Deepwiki.png) + +**DeepWiki** is my own implementation attempt of DeepWiki, automatically creates beautiful, interactive wikis for any GitHub, GitLab, or BitBucket repository! Just enter a repo name, and DeepWiki will: + +1. Analyze the code structure +2. Generate comprehensive documentation +3. Create visual diagrams to explain how everything works +4. Organize it all into an easy-to-navigate wiki + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Tip in Crypto](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Features + +- **Instant Documentation**: Turn any GitHub, GitLab or BitBucket repo into a wiki in seconds +- **Private Repository Support**: Securely access private repositories with personal access tokens +- **Smart Analysis**: AI-powered understanding of code structure and relationships +- **Beautiful Diagrams**: Automatic Mermaid diagrams to visualize architecture and data flow +- **Easy Navigation**: Simple, intuitive interface to explore the wiki +- **Ask Feature**: Chat with your repository using RAG-powered AI to get accurate answers +- **DeepResearch**: Multi-turn research process that thoroughly investigates complex topics +- **Multiple Model Providers**: Support for Google Gemini, OpenAI, OpenRouter, and local Ollama models +- **Flexible Embeddings**: Choose between OpenAI, Google AI, or local Ollama embeddings for optimal performance + +## 🚀 Quick Start (Super Easy!) + +### Option 1: Using Docker + +```bash +# Clone the repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Create a .env file with your API keys +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# Optional: Use Google AI embeddings instead of OpenAI (recommended if using Google models) +echo "DEEPWIKI_EMBEDDER_TYPE=google" >> .env +# Optional: Add OpenRouter API key if you want to use OpenRouter models +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env +# Optional: Add Ollama host if not local. defaults to http://localhost:11434 +echo "OLLAMA_HOST=your_ollama_host" >> .env +# Optional: Add Azure API key, endpoint and version if you want to use azure openai models +echo "AZURE_OPENAI_API_KEY=your_azure_openai_api_key" >> .env +echo "AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint" >> .env +echo "AZURE_OPENAI_VERSION=your_azure_openai_version" >> .env +# Run with Docker Compose +docker-compose up +``` + +For detailed instructions on using DeepWiki with Ollama and Docker, see [Ollama Instructions](Ollama-instruction.md). + +> 💡 **Where to get these keys:** +> - Get a Google API key from [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Get an OpenAI API key from [OpenAI Platform](https://platform.openai.com/api-keys) +> - Get Azure OpenAI credentials from [Azure Portal](https://portal.azure.com/) - create an Azure OpenAI resource and get the API key, endpoint, and API version + +### Option 2: Manual Setup (Recommended) + +#### Step 1: Set Up Your API Keys + +Create a `.env` file in the project root with these keys: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# Optional: Use Google AI embeddings (recommended if using Google models) +DEEPWIKI_EMBEDDER_TYPE=google +# Optional: Add this if you want to use OpenRouter models +OPENROUTER_API_KEY=your_openrouter_api_key +# Optional: Add this if you want to use Azure OpenAI models +AZURE_OPENAI_API_KEY=your_azure_openai_api_key +AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint +AZURE_OPENAI_VERSION=your_azure_openai_version +# Optional: Add Ollama host if not local. default: http://localhost:11434 +OLLAMA_HOST=your_ollama_host +``` + +#### Step 2: Start the Backend + +```bash +# Install Python dependencies +pip install -r api/requirements.txt + +# Start the API server +python -m api.main +``` + +#### Step 3: Start the Frontend + +```bash +# Install JavaScript dependencies +npm install +# or +yarn install + +# Start the web app +npm run dev +# or +yarn dev +``` + +#### Step 4: Use DeepWiki! + +1. Open [http://localhost:3000](http://localhost:3000) in your browser +2. Enter a GitHub, GitLab, or Bitbucket repository (like `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, or `https://bitbucket.org/redradish/atlassian_app_versions`) +3. For private repositories, click "+ Add access tokens" and enter your GitHub or GitLab personal access token +4. Click "Generate Wiki" and watch the magic happen! + +## 🔍 How It Works + +DeepWiki uses AI to: + +1. Clone and analyze the GitHub, GitLab, or Bitbucket repository (including private repos with token authentication) +2. Create embeddings of the code for smart retrieval +3. Generate documentation with context-aware AI (using Google Gemini, OpenAI, OpenRouter, Azure OpenAI, or local Ollama models) +4. Create visual diagrams to explain code relationships +5. Organize everything into a structured wiki +6. Enable intelligent Q&A with the repository through the Ask feature +7. Provide in-depth research capabilities with DeepResearch + +```mermaid +graph TD + A[User inputs GitHub/GitLab/Bitbucket repo] --> AA{Private repo?} + AA -->|Yes| AB[Add access token] + AA -->|No| B[Clone Repository] + AB --> B + B --> C[Analyze Code Structure] + C --> D[Create Code Embeddings] + + D --> M{Select Model Provider} + M -->|Google Gemini| E1[Generate with Gemini] + M -->|OpenAI| E2[Generate with OpenAI] + M -->|OpenRouter| E3[Generate with OpenRouter] + M -->|Local Ollama| E4[Generate with Ollama] + M -->|Azure| E5[Generate with Azure] + + E1 --> E[Generate Documentation] + E2 --> E + E3 --> E + E4 --> E + E5 --> E + + D --> F[Create Visual Diagrams] + E --> G[Organize as Wiki] + F --> G + G --> H[Interactive DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process; + class H result; +``` + +## 🛠️ Project Structure + +``` +deepwiki/ +├── api/ # Backend API server +│ ├── main.py # API entry point +│ ├── api.py # FastAPI implementation +│ ├── rag.py # Retrieval Augmented Generation +│ ├── data_pipeline.py # Data processing utilities +│ └── requirements.txt # Python dependencies +│ +├── src/ # Frontend Next.js app +│ ├── app/ # Next.js app directory +│ │ └── page.tsx # Main application page +│ └── components/ # React components +│ └── Mermaid.tsx # Mermaid diagram renderer +│ +├── public/ # Static assets +├── package.json # JavaScript dependencies +└── .env # Environment variables (create this) +``` + +## 🤖 Provider-Based Model Selection System + +DeepWiki now implements a flexible provider-based model selection system supporting multiple LLM providers: + +### Supported Providers and Models + +- **Google**: Default `gemini-2.5-flash`, also supports `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc. +- **OpenAI**: Default `gpt-5-nano`, also supports `gpt-5`, `4o`, etc. +- **OpenRouter**: Access to multiple models via a unified API, including Claude, Llama, Mistral, etc. +- **Azure OpenAI**: Default `gpt-4o`, also supports `o4-mini`, etc. +- **Ollama**: Support for locally running open-source models like `llama3` + +### Environment Variables + +Each provider requires its corresponding API key environment variables: + +``` +# API Keys +GOOGLE_API_KEY=your_google_api_key # Required for Google Gemini models +OPENAI_API_KEY=your_openai_api_key # Required for OpenAI models +OPENROUTER_API_KEY=your_openrouter_api_key # Required for OpenRouter models +AZURE_OPENAI_API_KEY=your_azure_openai_api_key #Required for Azure OpenAI models +AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint #Required for Azure OpenAI models +AZURE_OPENAI_VERSION=your_azure_openai_version #Required for Azure OpenAI models + +# OpenAI API Base URL Configuration +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # Optional, for custom OpenAI API endpoints + +# Ollama host +OLLAMA_HOST=your_ollama_host # Optional, if Ollama is not local. default: http://localhost:11434 + +# Configuration Directory +DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # Optional, for custom config file location +``` + +### Configuration Files + +DeepWiki uses JSON configuration files to manage various aspects of the system: + +1. **`generator.json`**: Configuration for text generation models + - Defines available model providers (Google, OpenAI, OpenRouter, Azure, Ollama) + - Specifies default and available models for each provider + - Contains model-specific parameters like temperature and top_p + +2. **`embedder.json`**: Configuration for embedding models and text processing + - Defines embedding models for vector storage + - Contains retriever configuration for RAG + - Specifies text splitter settings for document chunking + +3. **`repo.json`**: Configuration for repository handling + - Contains file filters to exclude certain files and directories + - Defines repository size limits and processing rules + +By default, these files are located in the `api/config/` directory. You can customize their location using the `DEEPWIKI_CONFIG_DIR` environment variable. + +### Custom Model Selection for Service Providers + +The custom model selection feature is specifically designed for service providers who need to: + +- You can offer multiple AI model choices to users within your organization +- You can quickly adapt to the rapidly evolving LLM landscape without code changes +- You can support specialized or fine-tuned models that aren't in the predefined list + +Service providers can implement their model offerings by selecting from the predefined options or entering custom model identifiers in the frontend interface. + +### Base URL Configuration for Enterprise Private Channels + +The OpenAI Client's base_url configuration is designed primarily for enterprise users with private API channels. This feature: + +- Enables connection to private or enterprise-specific API endpoints +- Allows organizations to use their own self-hosted or custom-deployed LLM services +- Supports integration with third-party OpenAI API-compatible services + +**Coming Soon**: In future updates, DeepWiki will support a mode where users need to provide their own API keys in requests. This will allow enterprise customers with private channels to use their existing API arrangements without sharing credentials with the DeepWiki deployment. + +## 🧩 Using OpenAI-Compatible Embedding Models (e.g., Alibaba Qwen) + +If you want to use embedding models compatible with the OpenAI API (such as Alibaba Qwen), follow these steps: + +1. Replace the contents of `api/config/embedder.json` with those from `api/config/embedder_openai_compatible.json`. +2. In your project root `.env` file, set the relevant environment variables, for example: + ``` + OPENAI_API_KEY=your_api_key + OPENAI_BASE_URL=your_openai_compatible_endpoint + ``` +3. The program will automatically substitute placeholders in embedder.json with the values from your environment variables. + +This allows you to seamlessly switch to any OpenAI-compatible embedding service without code changes. + +## 🧠 Using Google AI Embeddings + +DeepWiki now supports Google AI's latest embedding models as an alternative to OpenAI embeddings. This provides better integration when you're already using Google Gemini models for text generation. + +### Features + +- **Latest Model**: Uses Google's `text-embedding-004` model +- **Same API Key**: Uses your existing `GOOGLE_API_KEY` (no additional setup required) +- **Better Integration**: Optimized for use with Google Gemini text generation models +- **Task-Specific**: Supports semantic similarity, retrieval, and classification tasks +- **Batch Processing**: Efficient processing of multiple texts + +### How to Enable Google AI Embeddings + +**Option 1: Environment Variable (Recommended)** + +Set the embedder type in your `.env` file: + +```bash +# Your existing Google API key +GOOGLE_API_KEY=your_google_api_key + +# Enable Google AI embeddings +DEEPWIKI_EMBEDDER_TYPE=google +``` + +**Option 2: Docker Environment** + +```bash +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e DEEPWIKI_EMBEDDER_TYPE=google \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +**Option 3: Docker Compose** + +Add to your `.env` file: + +```bash +GOOGLE_API_KEY=your_google_api_key +DEEPWIKI_EMBEDDER_TYPE=google +``` + +Then run: + +```bash +docker-compose up +``` + +### Available Embedder Types + +| Type | Description | API Key Required | Notes | +|------|-------------|------------------|-------| +| `openai` | OpenAI embeddings (default) | `OPENAI_API_KEY` | Uses `text-embedding-3-small` model | +| `google` | Google AI embeddings | `GOOGLE_API_KEY` | Uses `text-embedding-004` model | +| `ollama` | Local Ollama embeddings | None | Requires local Ollama installation | + +### Why Use Google AI Embeddings? + +- **Consistency**: If you're using Google Gemini for text generation, using Google embeddings provides better semantic consistency +- **Performance**: Google's latest embedding model offers excellent performance for retrieval tasks +- **Cost**: Competitive pricing compared to OpenAI +- **No Additional Setup**: Uses the same API key as your text generation models + +### Switching Between Embedders + +You can easily switch between different embedding providers: + +```bash +# Use OpenAI embeddings (default) +export DEEPWIKI_EMBEDDER_TYPE=openai + +# Use Google AI embeddings +export DEEPWIKI_EMBEDDER_TYPE=google + +# Use local Ollama embeddings +export DEEPWIKI_EMBEDDER_TYPE=ollama +``` + +**Note**: When switching embedders, you may need to regenerate your repository embeddings as different models produce different vector spaces. + +### Logging + +DeepWiki uses Python's built-in `logging` module for diagnostic output. You can configure the verbosity and log file destination via environment variables: + +| Variable | Description | Default | +|-----------------|--------------------------------------------------------------------|------------------------------| +| `LOG_LEVEL` | Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO | +| `LOG_FILE_PATH` | Path to the log file. If set, logs will be written to this file. | `api/logs/application.log` | + +To enable debug logging and direct logs to a custom file: +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` +Or with Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +When running with Docker Compose, the container's `api/logs` directory is bind-mounted to `./api/logs` on your host (see the `volumes` section in `docker-compose.yml`), ensuring log files persist across restarts. + +Alternatively, you can store these settings in your `.env` file: + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` +Then simply run: + +```bash +docker-compose up +``` + +**Logging Path Security Considerations:** In production environments, ensure the `api/logs` directory and any custom log file path are secured with appropriate filesystem permissions and access controls. The application enforces that `LOG_FILE_PATH` resides within the project's `api/logs` directory to prevent path traversal or unauthorized writes. + +## 🛠️ Advanced Setup + +### Environment Variables + +| Variable | Description | Required | Note | +|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Google Gemini API key for AI generation and embeddings | No | Required for Google Gemini models and Google AI embeddings +| `OPENAI_API_KEY` | OpenAI API key for embeddings and models | Conditional | Required if using OpenAI embeddings or models | +| `OPENROUTER_API_KEY` | OpenRouter API key for alternative models | No | Required only if you want to use OpenRouter models | +| `AZURE_OPENAI_API_KEY` | Azure OpenAI API key | No | Required only if you want to use Azure OpenAI models | +| `AZURE_OPENAI_ENDPOINT` | Azure OpenAI endpoint | No | Required only if you want to use Azure OpenAI models | +| `AZURE_OPENAI_VERSION` | Azure OpenAI version | No | Required only if you want to use Azure OpenAI models | +| `OLLAMA_HOST` | Ollama Host (default: http://localhost:11434) | No | Required only if you want to use external Ollama server | +| `DEEPWIKI_EMBEDDER_TYPE` | Embedder type: `openai`, `google`, or `ollama` (default: `openai`) | No | Controls which embedding provider to use | +| `PORT` | Port for the API server (default: 8001) | No | If you host API and frontend on the same machine, make sure change port of `SERVER_BASE_URL` accordingly | +| `SERVER_BASE_URL` | Base URL for the API server (default: http://localhost:8001) | No | +| `DEEPWIKI_AUTH_MODE` | Set to `true` or `1` to enable authorization mode. | No | Defaults to `false`. If enabled, `DEEPWIKI_AUTH_CODE` is required. | +| `DEEPWIKI_AUTH_CODE` | The secret code required for wiki generation when `DEEPWIKI_AUTH_MODE` is enabled. | No | Only used if `DEEPWIKI_AUTH_MODE` is `true` or `1`. | + +**API Key Requirements:** +- If using `DEEPWIKI_EMBEDDER_TYPE=openai` (default): `OPENAI_API_KEY` is required +- If using `DEEPWIKI_EMBEDDER_TYPE=google`: `GOOGLE_API_KEY` is required +- If using `DEEPWIKI_EMBEDDER_TYPE=ollama`: No API key required (local processing) + +Other API keys are only required when configuring and using models from the corresponding providers. + +## Authorization Mode + +DeepWiki can be configured to run in an authorization mode, where wiki generation requires a valid authorization code. This is useful if you want to control who can use the generation feature. +Restricts frontend initiation and protects cache deletion, but doesn't fully prevent backend generation if API endpoints are hit directly. + +To enable authorization mode, set the following environment variables: + +- `DEEPWIKI_AUTH_MODE`: Set this to `true` or `1`. When enabled, the frontend will display an input field for the authorization code. +- `DEEPWIKI_AUTH_CODE`: Set this to the desired secret code. Restricts frontend initiation and protects cache deletion, but doesn't fully prevent backend generation if API endpoints are hit directly. + +If `DEEPWIKI_AUTH_MODE` is not set or is set to `false` (or any other value than `true`/`1`), the authorization feature will be disabled, and no code will be required. + +### Docker Setup + +You can use Docker to run DeepWiki: + +#### Running the Container + +```bash +# Pull the image from GitHub Container Registry +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# Run the container with environment variables +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -e OLLAMA_HOST=your_ollama_host \ + -e AZURE_OPENAI_API_KEY=your_azure_openai_api_key \ + -e AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint \ + -e AZURE_OPENAI_VERSION=your_azure_openai_version \ + + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +This command also mounts `~/.adalflow` on your host to `/root/.adalflow` in the container. This path is used to store: +- Cloned repositories (`~/.adalflow/repos/`) +- Their embeddings and indexes (`~/.adalflow/databases/`) +- Cached generated wiki content (`~/.adalflow/wikicache/`) + +This ensures that your data persists even if the container is stopped or removed. + +Or use the provided `docker-compose.yml` file: + +```bash +# Edit the .env file with your API keys first +docker-compose up +``` + +(The `docker-compose.yml` file is pre-configured to mount `~/.adalflow` for data persistence, similar to the `docker run` command above.) + +#### Using a .env file with Docker + +You can also mount a .env file to the container: + +```bash +# Create a .env file with your API keys +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env +echo "AZURE_OPENAI_API_KEY=your_azure_openai_api_key" >> .env +echo "AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint" >> .env +echo "AZURE_OPENAI_VERSION=your_azure_openai_version" >>.env +echo "OLLAMA_HOST=your_ollama_host" >> .env + +# Run the container with the .env file mounted +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +This command also mounts `~/.adalflow` on your host to `/root/.adalflow` in the container. This path is used to store: +- Cloned repositories (`~/.adalflow/repos/`) +- Their embeddings and indexes (`~/.adalflow/databases/`) +- Cached generated wiki content (`~/.adalflow/wikicache/`) + +This ensures that your data persists even if the container is stopped or removed. + +#### Building the Docker image locally + +If you want to build the Docker image locally: + +```bash +# Clone the repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Build the Docker image +docker build -t deepwiki-open . + +# Run the container +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -e AZURE_OPENAI_API_KEY=your_azure_openai_api_key \ + -e AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint \ + -e AZURE_OPENAI_VERSION=your_azure_openai_version \ + -e OLLAMA_HOST=your_ollama_host \ + deepwiki-open +``` + +#### Using Self-Signed Certificates in Docker + +If you're in an environment that uses self-signed certificates, you can include them in the Docker build: + +1. Create a directory for your certificates (default is `certs` in your project root) +2. Copy your `.crt` or `.pem` certificate files into this directory +3. Build the Docker image: + +```bash +# Build with default certificates directory (certs) +docker build . + +# Or build with a custom certificates directory +docker build --build-arg CUSTOM_CERT_DIR=my-custom-certs . +``` + +### API Server Details + +The API server provides: +- Repository cloning and indexing +- RAG (Retrieval Augmented Generation) +- Streaming chat completions + +For more details, see the [API README](./api/README.md). + +## 🔌 OpenRouter Integration + +DeepWiki now supports [OpenRouter](https://openrouter.ai/) as a model provider, giving you access to hundreds of AI models through a single API: + +- **Multiple Model Options**: Access models from OpenAI, Anthropic, Google, Meta, Mistral, and more +- **Simple Configuration**: Just add your OpenRouter API key and select the model you want to use +- **Cost Efficiency**: Choose models that fit your budget and performance needs +- **Easy Switching**: Toggle between different models without changing your code + +### How to Use OpenRouter with DeepWiki + +1. **Get an API Key**: Sign up at [OpenRouter](https://openrouter.ai/) and get your API key +2. **Add to Environment**: Add `OPENROUTER_API_KEY=your_key` to your `.env` file +3. **Enable in UI**: Check the "Use OpenRouter API" option on the homepage +4. **Select Model**: Choose from popular models like GPT-4o, Claude 3.5 Sonnet, Gemini 2.0, and more + +OpenRouter is particularly useful if you want to: +- Try different models without signing up for multiple services +- Access models that might be restricted in your region +- Compare performance across different model providers +- Optimize for cost vs. performance based on your needs + +## 🤖 Ask & DeepResearch Features + +### Ask Feature + +The Ask feature allows you to chat with your repository using Retrieval Augmented Generation (RAG): + +- **Context-Aware Responses**: Get accurate answers based on the actual code in your repository +- **RAG-Powered**: The system retrieves relevant code snippets to provide grounded responses +- **Real-Time Streaming**: See responses as they're generated for a more interactive experience +- **Conversation History**: The system maintains context between questions for more coherent interactions + +### DeepResearch Feature + +DeepResearch takes repository analysis to the next level with a multi-turn research process: + +- **In-Depth Investigation**: Thoroughly explores complex topics through multiple research iterations +- **Structured Process**: Follows a clear research plan with updates and a comprehensive conclusion +- **Automatic Continuation**: The AI automatically continues research until reaching a conclusion (up to 5 iterations) +- **Research Stages**: + 1. **Research Plan**: Outlines the approach and initial findings + 2. **Research Updates**: Builds on previous iterations with new insights + 3. **Final Conclusion**: Provides a comprehensive answer based on all iterations + +To use DeepResearch, simply toggle the "Deep Research" switch in the Ask interface before submitting your question. + +## 📱 Screenshots + +![DeepWiki Main Interface](screenshots/Interface.png) +*The main interface of DeepWiki* + +![Private Repository Support](screenshots/privaterepo.png) +*Access private repositories with personal access tokens* + +![DeepResearch Feature](screenshots/DeepResearch.png) +*DeepResearch conducts multi-turn investigations for complex topics* + +### Demo Video + +[![DeepWiki Demo Video](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*Watch DeepWiki in action!* + +## ❓ Troubleshooting + +### API Key Issues +- **"Missing environment variables"**: Make sure your `.env` file is in the project root and contains the required API keys +- **"API key not valid"**: Check that you've copied the full key correctly with no extra spaces +- **"OpenRouter API error"**: Verify your OpenRouter API key is valid and has sufficient credits +- **"Azure OpenAI API error"**: Verify your Azure OpenAI credentials (API key, endpoint, and version) are correct and the service is properly deployed + +### Connection Problems +- **"Cannot connect to API server"**: Make sure the API server is running on port 8001 +- **"CORS error"**: The API is configured to allow all origins, but if you're having issues, try running both frontend and backend on the same machine + +### Generation Issues +- **"Error generating wiki"**: For very large repositories, try a smaller one first +- **"Invalid repository format"**: Make sure you're using a valid GitHub, GitLab or Bitbucket URL format +- **"Could not fetch repository structure"**: For private repositories, ensure you've entered a valid personal access token with appropriate permissions +- **"Diagram rendering error"**: The app will automatically try to fix broken diagrams + +### Common Solutions +1. **Restart both servers**: Sometimes a simple restart fixes most issues +2. **Check console logs**: Open browser developer tools to see any JavaScript errors +3. **Check API logs**: Look at the terminal where the API is running for Python errors + +## 🤝 Contributing + +Contributions are welcome! Feel free to: +- Open issues for bugs or feature requests +- Submit pull requests to improve the code +- Share your feedback and ideas + +## 📄 License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +## ⭐ Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) diff --git a/reference-deepwiki/deepwiki-open-main/README.pt-br.md b/reference-deepwiki/deepwiki-open-main/README.pt-br.md new file mode 100644 index 0000000..f2f13b5 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.pt-br.md @@ -0,0 +1,510 @@ +# DeepWiki-Open + +![DeepWiki Banner](screenshots/Deepwiki.png) + +**DeepWiki** é minha própria tentativa de implementação do DeepWiki, que cria automaticamente wikis bonitas e interativas para qualquer repositório GitHub, GitLab ou BitBucket! Basta inserir o nome de um repositório, e o DeepWiki irá: + +1. Analisar a estrutura do código +2. Gerar documentação abrangente +3. Criar diagramas visuais para explicar como tudo funciona +4. Organizar tudo em uma wiki fácil de navegar + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Tip in Crypto](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Recursos + +- **Documentação Instantânea**: Transforme qualquer repositório GitHub, GitLab ou BitBucket em uma wiki em segundos +- **Suporte a Repositórios Privados**: Acesse repositórios privados com segurança usando tokens de acesso pessoal +- **Análise Inteligente**: Compreensão da estrutura e relacionamentos do código com IA +- **Diagramas Bonitos**: Diagramas Mermaid automáticos para visualizar arquitetura e fluxo de dados +- **Navegação Fácil**: Interface simples e intuitiva para explorar a wiki +- **Recurso de Perguntas**: Converse com seu repositório usando IA com RAG para obter respostas precisas +- **DeepResearch**: Processo de pesquisa em várias etapas que investiga minuciosamente tópicos complexos +- **Múltiplos Provedores de Modelos**: Suporte para Google Gemini, OpenAI, OpenRouter e modelos locais Ollama + +## 🚀 Início Rápido (Super Fácil!) + +### Opção 1: Usando Docker + +```bash +# Clone o repositório +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Crie um arquivo .env com suas chaves de API +echo "GOOGLE_API_KEY=sua_chave_api_google" > .env +echo "OPENAI_API_KEY=sua_chave_api_openai" >> .env +# Opcional: Adicione a chave API OpenRouter se quiser usar modelos OpenRouter +echo "OPENROUTER_API_KEY=sua_chave_api_openrouter" >> .env +# Opcional: Adicione o host Ollama se não for local. padrão: http://localhost:11434 +echo "OLLAMA_HOST=seu_host_ollama" >> .env + +# Execute com Docker Compose +docker-compose up +``` + +Para instruções detalhadas sobre como usar o DeepWiki com Ollama e Docker, veja [Instruções do Ollama (em inglês)](Ollama-instruction.md). + +> 💡 **Onde obter essas chaves:** +> - Obtenha uma chave API Google no [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Obtenha uma chave API OpenAI na [Plataforma OpenAI](https://platform.openai.com/api-keys) + +### Opção 2: Configuração Manual (Recomendada) + +#### Passo 1: Configure Suas Chaves API + +Crie um arquivo `.env` na raiz do projeto com estas chaves: + +``` +GOOGLE_API_KEY=sua_chave_api_google +OPENAI_API_KEY=sua_chave_api_openai +# Opcional: Adicione isso se quiser usar modelos OpenRouter +OPENROUTER_API_KEY=sua_chave_api_openrouter +# Opcional: Adicione o host Ollama se não for local. padrão: http://localhost:11434 +OLLAMA_HOST=seu_host_ollama +``` + +#### Passo 2: Inicie o Backend + +```bash +# Instale as dependências Python +pip install -r api/requirements.txt + +# Inicie o servidor API +python -m api.main +``` + +#### Passo 3: Inicie o Frontend + +```bash +# Instale as dependências JavaScript +npm install +# ou +yarn install + +# Inicie o aplicativo web +npm run dev +# ou +yarn dev +``` + +#### Passo 4: Use o DeepWiki! + +1. Abra [http://localhost:3000](http://localhost:3000) no seu navegador +2. Insira um repositório GitHub, GitLab ou Bitbucket (como `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, ou `https://bitbucket.org/redradish/atlassian_app_versions`) +3. Para repositórios privados, clique em "+ Adicionar tokens de acesso" e insira seu token de acesso pessoal do GitHub ou GitLab +4. Clique em "Gerar Wiki" e veja a mágica acontecer! + +## 🔍 Como Funciona + +O DeepWiki usa IA para: + +1. Clonar e analisar o repositório GitHub, GitLab ou Bitbucket (incluindo repositórios privados com autenticação por token) +2. Criar embeddings do código para recuperação inteligente +3. Gerar documentação com IA contextual (usando modelos Google Gemini, OpenAI, OpenRouter ou Ollama local) +4. Criar diagramas visuais para explicar relações de código +5. Organizar tudo em uma wiki estruturada +6. Permitir perguntas e respostas inteligentes com o repositório através do recurso de Perguntas +7. Fornecer capacidades de pesquisa aprofundada com DeepResearch + +```mermaid +graph TD + A[Usuário insere repo GitHub/GitLab/Bitbucket] --> AA{Repo privado?} + AA -->|Sim| AB[Adicionar token de acesso] + AA -->|Não| B[Clonar Repositório] + AB --> B + B --> C[Analisar Estrutura do Código] + C --> D[Criar Embeddings do Código] + + D --> M{Selecionar Provedor de Modelo} + M -->|Google Gemini| E1[Gerar com Gemini] + M -->|OpenAI| E2[Gerar com OpenAI] + M -->|OpenRouter| E3[Gerar com OpenRouter] + M -->|Ollama Local| E4[Gerar com Ollama] + + E1 --> E[Gerar Documentação] + E2 --> E + E3 --> E + E4 --> E + + D --> F[Criar Diagramas Visuais] + E --> G[Organizar como Wiki] + F --> G + G --> H[DeepWiki Interativo] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ Estrutura do Projeto + +``` +deepwiki/ +├── api/ # Servidor API backend +│ ├── main.py # Ponto de entrada da API +│ ├── api.py # Implementação FastAPI +│ ├── rag.py # Retrieval Augmented Generation +│ ├── data_pipeline.py # Utilitários de processamento de dados +│ └── requirements.txt # Dependências Python +│ +├── src/ # Aplicativo Next.js frontend +│ ├── app/ # Diretório do aplicativo Next.js +│ │ └── page.tsx # Página principal do aplicativo +│ └── components/ # Componentes React +│ └── Mermaid.tsx # Renderizador de diagramas Mermaid +│ +├── public/ # Ativos estáticos +├── package.json # Dependências JavaScript +└── .env # Variáveis de ambiente (crie este arquivo) +``` + +## 🤖 Sistema de Seleção de Modelos Baseado em Provedores + +O DeepWiki agora implementa um sistema flexível de seleção de modelos baseado em provedores, suportando múltiplos provedores de LLM: + +### Provedores e Modelos Suportados + +- **Google**: Padrão `gemini-2.5-flash`, também suporta `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc. +- **OpenAI**: Padrão `gpt-5-nano`, também suporta `gpt-5`, `4o`, etc. +- **OpenRouter**: Acesso a múltiplos modelos via uma API unificada, incluindo Claude, Llama, Mistral, etc. +- **Ollama**: Suporte para modelos de código aberto executados localmente como `llama3` + +### Variáveis de Ambiente + +Cada provedor requer suas variáveis de ambiente de chave API correspondentes: + +``` +# Chaves API +GOOGLE_API_KEY=sua_chave_api_google # Necessária para modelos Google Gemini +OPENAI_API_KEY=sua_chave_api_openai # Necessária para modelos OpenAI +OPENROUTER_API_KEY=sua_chave_api_openrouter # Necessária para modelos OpenRouter + +# Configuração de URL Base da API OpenAI +OPENAI_BASE_URL=https://endpoint-api-personalizado.com/v1 # Opcional, para endpoints de API OpenAI personalizados + +# Host Ollama +OLLAMA_HOST=seu_host_ollama # Opcional, se Ollama não for local. padrão: http://localhost:11434 + +# Diretório de Configuração +DEEPWIKI_CONFIG_DIR=/caminho/para/dir/config/personalizado # Opcional, para localização personalizada de arquivos de configuração +``` + +### Arquivos de Configuração + +O DeepWiki usa arquivos de configuração JSON para gerenciar vários aspectos do sistema: + +1. **`generator.json`**: Configuração para modelos de geração de texto + - Define provedores de modelos disponíveis (Google, OpenAI, OpenRouter, Ollama) + - Especifica modelos padrão e disponíveis para cada provedor + - Contém parâmetros específicos de modelo como temperatura e top_p + +2. **`embedder.json`**: Configuração para modelos de embedding e processamento de texto + - Define modelos de embedding para armazenamento de vetores + - Contém configuração do recuperador para RAG + - Especifica configurações do divisor de texto para divisão de documentos + +3. **`repo.json`**: Configuração para manipulação de repositórios + - Contém filtros de arquivos para excluir certos arquivos e diretórios + - Define limites de tamanho de repositório e regras de processamento + +Por padrão, esses arquivos estão localizados no diretório `api/config/`. Você pode personalizar sua localização usando a variável de ambiente `DEEPWIKI_CONFIG_DIR`. + +### Seleção de Modelo Personalizado para Provedores de Serviço + +O recurso de seleção de modelo personalizado é especificamente projetado para provedores de serviço que precisam: + +- Oferecer múltiplas opções de modelo de IA para usuários dentro de sua organização +- Adaptar-se rapidamente ao panorama de LLM em rápida evolução sem mudanças de código +- Suportar modelos especializados ou ajustados que não estão na lista predefinida + +Provedores de serviço podem implementar suas ofertas de modelo selecionando entre as opções predefinidas ou inserindo identificadores de modelo personalizados na interface do frontend. + +### Configuração de URL Base para Canais Privados Empresariais + +A configuração base_url do Cliente OpenAI é projetada principalmente para usuários empresariais com canais de API privados. Este recurso: + +- Permite conexão a endpoints de API privados ou específicos da empresa +- Permite que organizações usem seus próprios serviços LLM auto-hospedados ou implantados personalizados +- Suporta integração com serviços compatíveis com a API OpenAI de terceiros + +**Em Breve**: Em atualizações futuras, o DeepWiki suportará um modo onde os usuários precisam fornecer suas próprias chaves API nas solicitações. Isso permitirá que clientes empresariais com canais privados usem seus arranjos de API existentes sem compartilhar credenciais com a implantação do DeepWiki. + +## 🤩 Usando Modelos de Embedding Compatíveis com OpenAI (ex., Alibaba Qwen) + +Se você deseja usar modelos de embedding compatíveis com a API OpenAI (como Alibaba Qwen), siga estas etapas: + +1. Substitua o conteúdo de `api/config/embedder.json` pelo de `api/config/embedder_openai_compatible.json`. +2. No arquivo `.env` da raiz do seu projeto, defina as variáveis de ambiente relevantes, por exemplo: + ``` + OPENAI_API_KEY=sua_chave_api + OPENAI_BASE_URL=seu_endpoint_compativel_openai + ``` +3. O programa substituirá automaticamente os espaços reservados em embedder.json pelos valores de suas variáveis de ambiente. + +Isso permite que você mude perfeitamente para qualquer serviço de embedding compatível com OpenAI sem mudanças de código. + +### Logging + +O DeepWiki usa o módulo `logging` integrado do Python para saída de diagnóstico. Você pode configurar a verbosidade e o destino do arquivo de log via variáveis de ambiente: + +| Variável | Descrição | Padrão | +|-----------------|--------------------------------------------------------------------|------------------------------| +| `LOG_LEVEL` | Nível de logging (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO | +| `LOG_FILE_PATH` | Caminho para o arquivo de log. Se definido, logs serão escritos neste arquivo. | `api/logs/application.log` | + +Para habilitar logging de depuração e direcionar logs para um arquivo personalizado: +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` +Ou com Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +Ao executar com Docker Compose, o diretório `api/logs` do container é montado em `./api/logs` no seu host (veja a seção `volumes` em `docker-compose.yml`), garantindo que os arquivos de log persistam entre reinicializações. + +Alternativamente, você pode armazenar essas configurações no seu arquivo `.env`: + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` +Então simplesmente execute: + +```bash +docker-compose up +``` + +**Considerações de Segurança do Caminho de Logging:** Em ambientes de produção, garanta que o diretório `api/logs` e qualquer caminho de arquivo de log personalizado estejam protegidos com permissões de sistema de arquivos e controles de acesso apropriados. O aplicativo impõe que `LOG_FILE_PATH` resida dentro do diretório `api/logs` do projeto para evitar travessia de caminho ou escritas não autorizadas. + +## 🔧 Configuração Avançada + +### Variáveis de Ambiente + +| Variável | Descrição | Obrigatória | Observação | +|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Chave API Google Gemini para geração com IA | Não | Necessária apenas se você quiser usar modelos Google Gemini +| `OPENAI_API_KEY` | Chave API OpenAI para embeddings | Sim | Nota: Isso é necessário mesmo se você não estiver usando modelos OpenAI, pois é usado para embeddings. | +| `OPENROUTER_API_KEY` | Chave API OpenRouter para modelos alternativos | Não | Necessária apenas se você quiser usar modelos OpenRouter | +| `OLLAMA_HOST` | Host Ollama (padrão: http://localhost:11434) | Não | Necessária apenas se você quiser usar servidor Ollama externo | +| `PORT` | Porta para o servidor API (padrão: 8001) | Não | Se você hospedar API e frontend na mesma máquina, certifique-se de alterar a porta de `SERVER_BASE_URL` de acordo | +| `SERVER_BASE_URL` | URL base para o servidor API (padrão: http://localhost:8001) | Não | +| `DEEPWIKI_AUTH_MODE` | Defina como `true` ou `1` para habilitar o modo de autorização. | Não | Padrão é `false`. Se habilitado, `DEEPWIKI_AUTH_CODE` é necessário. | +| `DEEPWIKI_AUTH_CODE` | O código secreto necessário para geração de wiki quando `DEEPWIKI_AUTH_MODE` está habilitado. | Não | Usado apenas se `DEEPWIKI_AUTH_MODE` for `true` ou `1`. | + +Se você não estiver usando o modo ollama, você precisa configurar uma chave API OpenAI para embeddings. Outras chaves API são necessárias apenas ao configurar e usar modelos dos provedores correspondentes. + +## Modo de Autorização + +O DeepWiki pode ser configurado para executar em um modo de autorização, onde a geração de wiki requer um código de autorização válido. Isso é útil se você quiser controlar quem pode usar o recurso de geração. +Restringe a iniciação do frontend e protege a exclusão de cache, mas não impede completamente a geração de backend se os endpoints da API forem acessados diretamente. + +Para habilitar o modo de autorização, defina as seguintes variáveis de ambiente: + +- `DEEPWIKI_AUTH_MODE`: Defina como `true` ou `1`. Quando habilitado, o frontend exibirá um campo de entrada para o código de autorização. +- `DEEPWIKI_AUTH_CODE`: Defina como o código secreto desejado. Restringe a iniciação do frontend e protege a exclusão de cache, mas não impede completamente a geração de backend se os endpoints da API forem acessados diretamente. + +Se `DEEPWIKI_AUTH_MODE` não estiver definido ou estiver definido como `false` (ou qualquer outro valor diferente de `true`/`1`), o recurso de autorização será desativado, e nenhum código será necessário. + +### Configuração Docker + +Você pode usar Docker para executar o DeepWiki: + +```bash +# Baixe a imagem do GitHub Container Registry +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# Execute o container com variáveis de ambiente +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=sua_chave_api_google \ + -e OPENAI_API_KEY=sua_chave_api_openai \ + -e OPENROUTER_API_KEY=sua_chave_api_openrouter \ + -e OLLAMA_HOST=seu_host_ollama \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Este comando também monta `~/.adalflow` no seu host para `/root/.adalflow` no container. Este caminho é usado para armazenar: +- Repositórios clonados (`~/.adalflow/repos/`) +- Seus embeddings e índices (`~/.adalflow/databases/`) +- Conteúdo de wiki gerado em cache (`~/.adalflow/wikicache/`) + +Isso garante que seus dados persistam mesmo se o container for parado ou removido. + +Ou use o arquivo `docker-compose.yml` fornecido: + +```bash +# Edite o arquivo .env com suas chaves API primeiro +docker-compose up +``` + +(O arquivo `docker-compose.yml` é pré-configurado para montar `~/.adalflow` para persistência de dados, similar ao comando `docker run` acima.) + +#### Usando um arquivo .env com Docker + +Você também pode montar um arquivo .env no container: + +```bash +# Crie um arquivo .env com suas chaves API +echo "GOOGLE_API_KEY=sua_chave_api_google" > .env +echo "OPENAI_API_KEY=sua_chave_api_openai" >> .env +echo "OPENROUTER_API_KEY=sua_chave_api_openrouter" >> .env +echo "OLLAMA_HOST=seu_host_ollama" >> .env + +# Execute o container com o arquivo .env montado +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Este comando também monta `~/.adalflow` no seu host para `/root/.adalflow` no container. Este caminho é usado para armazenar: +- Repositórios clonados (`~/.adalflow/repos/`) +- Seus embeddings e índices (`~/.adalflow/databases/`) +- Conteúdo de wiki gerado em cache (`~/.adalflow/wikicache/`) + +Isso garante que seus dados persistam mesmo se o container for parado ou removido. +#### Construindo a imagem Docker localmente + +Se você quiser construir a imagem Docker localmente: + +```bash +# Clone o repositório +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Construa a imagem Docker +docker build -t deepwiki-open . + +# Execute o container +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=sua_chave_api_google \ + -e OPENAI_API_KEY=sua_chave_api_openai \ + -e OPENROUTER_API_KEY=sua_chave_api_openrouter \ + -e OLLAMA_HOST=seu_host_ollama \ + deepwiki-open +``` + +### Detalhes do Servidor API + +O servidor API fornece: +- Clonagem e indexação de repositórios +- RAG (Retrieval Augmented Generation) +- Completions de chat com streaming + +Para mais detalhes, veja o [README da API](./api/README.md). + +## 🔌 Integração com OpenRouter + +O DeepWiki agora suporta [OpenRouter](https://openrouter.ai/) como provedor de modelos, dando acesso a centenas de modelos de IA através de uma única API: + +- **Múltiplas Opções de Modelos**: Acesse modelos da OpenAI, Anthropic, Google, Meta, Mistral e mais +- **Configuração Simples**: Apenas adicione sua chave API OpenRouter e selecione o modelo que deseja usar +- **Eficiência de Custo**: Escolha modelos que se adequem ao seu orçamento e necessidades de desempenho +- **Troca Fácil**: Alterne entre diferentes modelos sem alterar seu código + +### Como Usar o OpenRouter com DeepWiki + +1. **Obtenha uma Chave API**: Cadastre-se no [OpenRouter](https://openrouter.ai/) e obtenha sua chave API +2. **Adicione ao Ambiente**: Adicione `OPENROUTER_API_KEY=sua_chave` ao seu arquivo `.env` +3. **Habilite na UI**: Marque a opção "Usar API OpenRouter" na página inicial +4. **Selecione o Modelo**: Escolha entre modelos populares como GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 e mais + +O OpenRouter é particularmente útil se você quiser: +- Experimentar diferentes modelos sem se cadastrar em múltiplos serviços +- Acessar modelos que podem estar restritos em sua região +- Comparar desempenho entre diferentes provedores de modelos +- Otimizar custo vs. desempenho com base em suas necessidades + +## 🤖 Recursos de Perguntas & DeepResearch + +### Recurso de Perguntas + +O recurso de Perguntas permite que você converse com seu repositório usando Retrieval Augmented Generation (RAG): + +- **Respostas Contextuais**: Obtenha respostas precisas baseadas no código real em seu repositório +- **Alimentado por RAG**: O sistema recupera trechos de código relevantes para fornecer respostas fundamentadas +- **Streaming em Tempo Real**: Veja as respostas conforme são geradas para uma experiência mais interativa +- **Histórico de Conversação**: O sistema mantém contexto entre perguntas para interações mais coerentes + +### Recurso DeepResearch + +O DeepResearch leva a análise de repositórios a um novo nível com um processo de pesquisa em várias etapas: + +- **Investigação Aprofundada**: Explora minuciosamente tópicos complexos através de múltiplas iterações de pesquisa +- **Processo Estruturado**: Segue um plano de pesquisa claro com atualizações e uma conclusão abrangente +- **Continuação Automática**: A IA continua automaticamente a pesquisa até chegar a uma conclusão (até 5 iterações) +- **Estágios de Pesquisa**: + 1. **Plano de Pesquisa**: Descreve a abordagem e descobertas iniciais + 2. **Atualizações de Pesquisa**: Construído sobre iterações anteriores com novos insights + 3. **Conclusão Final**: Fornece uma resposta abrangente baseada em todas as iterações + +Para usar o DeepResearch, simplesmente alterne o interruptor "Pesquisa Aprofundada" na interface de Perguntas antes de enviar sua pergunta. + +## 📱 Capturas de Tela + +![Interface Principal do DeepWiki](screenshots/Interface.png) +*A interface principal do DeepWiki* + +![Suporte a Repositórios Privados](screenshots/privaterepo.png) +*Acesse repositórios privados com tokens de acesso pessoal* + +![Recurso DeepResearch](screenshots/DeepResearch.png) +*DeepResearch conduz investigações em várias etapas para tópicos complexos* + +### Vídeo de Demonstração + +[![Vídeo de Demonstração do DeepWiki](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*Veja o DeepWiki em ação!* + +## ❓ Solução de Problemas + +### Problemas com Chaves API +- **"Variáveis de ambiente ausentes"**: Certifique-se de que seu arquivo `.env` está na raiz do projeto e contém as chaves API necessárias +- **"Chave API não válida"**: Verifique se você copiou a chave completa corretamente sem espaços extras +- **"Erro de API OpenRouter"**: Verifique se sua chave API OpenRouter é válida e tem créditos suficientes + +### Problemas de Conexão +- **"Não é possível conectar ao servidor API"**: Certifique-se de que o servidor API está em execução na porta 8001 +- **"Erro CORS"**: A API está configurada para permitir todas as origens, mas se você estiver tendo problemas, tente executar frontend e backend na mesma máquina + +### Problemas de Geração +- **"Erro ao gerar wiki"**: Para repositórios muito grandes, tente um menor primeiro +- **"Formato de repositório inválido"**: Certifique-se de que está usando um formato de URL GitHub, GitLab ou Bitbucket válido +- **"Não foi possível buscar a estrutura do repositório"**: Para repositórios privados, certifique-se de ter inserido um token de acesso pessoal válido com as permissões apropriadas +- **"Erro de renderização de diagrama"**: O aplicativo tentará corrigir automaticamente diagramas quebrados + +### Soluções Comuns +1. **Reinicie ambos os servidores**: Às vezes um simples reinicio resolve a maioria dos problemas +2. **Verifique os logs do console**: Abra as ferramentas de desenvolvedor do navegador para ver quaisquer erros JavaScript +3. **Verifique os logs da API**: Olhe o terminal onde a API está em execução para erros Python + +## 🤝 Contribuindo + +Contribuições são bem-vindas! Sinta-se à vontade para: +- Abrir issues para bugs ou solicitações de recursos +- Enviar pull requests para melhorar o código +- Compartilhar seu feedback e ideias + +## 📄 Licença + +Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes. + +## ⭐ Histórico de Estrelas + +[![Gráfico de Histórico de Estrelas](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) diff --git a/reference-deepwiki/deepwiki-open-main/README.ru.md b/reference-deepwiki/deepwiki-open-main/README.ru.md new file mode 100644 index 0000000..f74a9d0 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.ru.md @@ -0,0 +1,509 @@ +# DeepWiki-Open + +![Баннер DeepWiki](screenshots/Deepwiki.png) + +**DeepWiki** — это моя собственная реализация DeepWiki, автоматически создающая красивые, интерактивные вики по любому репозиторию на GitHub, GitLab или BitBucket! Просто укажите название репозитория, и DeepWiki выполнит: + +1. Анализ структуры кода +2. Генерацию полноценной документации +3. Построение визуальных диаграмм, объясняющих работу системы +4. Организацию всего в удобную и структурированную вики + +[!["Купить мне кофе"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Поддержать в криптовалюте](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Возможности + +- **Мгновенная документация**: Превращение любого репозитория в вики за считанные секунды +- **Поддержка приватных репозиториев**: Безопасный доступ с помощью персональных токенов +- **Умный анализ**: Понимание структуры и взаимосвязей в коде с помощью ИИ +- **Красивые диаграммы**: Автоматическая генерация диаграмм Mermaid для отображения архитектуры и потоков данных +- **Простая навигация**: Интуитивный интерфейс для изучения вики +- **Функция “Спросить”**: Общение с репозиторием через ИИ, основанный на RAG, для получения точных ответов +- **DeepResearch**: Многошаговое исследование для глубокого анализа сложных тем +- **Поддержка различных провайдеров моделей**: Google Gemini, OpenAI, OpenRouter и локальные модели Ollama + +## 🚀 Быстрый старт (максимально просто!) + +### Вариант 1: С использованием Docker + +```bash +# Клонируйте репозиторий +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Создайте файл .env с вашими API-ключами +echo "GOOGLE_API_KEY=ваш_google_api_key" > .env +echo "OPENAI_API_KEY=ваш_openai_api_key" >> .env +# Необязательно: ключ OpenRouter +echo "OPENROUTER_API_KEY=ваш_openrouter_api_key" >> .env +# Необязательно: указать хост Ollama, если он не локальный (по умолчанию http://localhost:11434) +echo "OLLAMA_HOST=ваш_ollama_host" >> .env +# Необязательно: ключ и параметры Azure OpenAI +echo "AZURE_OPENAI_API_KEY=ваш_azure_api_key" >> .env +echo "AZURE_OPENAI_ENDPOINT=ваш_azure_endpoint" >> .env +echo "AZURE_OPENAI_VERSION=ваша_azure_version" >> .env +# Запуск через Docker Compose +docker-compose up +``` + +Подробную инструкцию по работе с Ollama и Docker см. в [Ollama Instructions](Ollama-instruction.md). + +> 💡 **Где взять ключи API:** +> - [Google AI Studio](https://makersuite.google.com/app/apikey) +> - [OpenAI Platform](https://platform.openai.com/api-keys) +> - [Azure Portal](https://portal.azure.com/) + +### Вариант 2: Ручная установка (рекомендуется) + +#### Шаг 1: Установка ключей API + +Создайте файл `.env` в корне проекта со следующим содержанием: + +``` +GOOGLE_API_KEY=ваш_google_api_key +OPENAI_API_KEY=ваш_openai_api_key +# Необязательно: для OpenRouter +OPENROUTER_API_KEY=ваш_openrouter_api_key +# Необязательно: для Azure OpenAI +AZURE_OPENAI_API_KEY=ваш_azure_api_key +AZURE_OPENAI_ENDPOINT=ваш_azure_endpoint +AZURE_OPENAI_VERSION=ваша_azure_version +# Необязательно: если Ollama не локальная +OLLAMA_HOST=ваш_ollama_host +``` + +#### Шаг 2: Запуск backend-сервера + +```bash +# Установка зависимостей +pip install -r api/requirements.txt + +# Запуск API +python -m api.main +``` + +#### Шаг 3: Запуск frontend-интерфейса + +```bash +# Установка JS-зависимостей +npm install +# или +yarn install + +# Запуск веб-интерфейса +npm run dev +# или +yarn dev +``` + +#### Шаг 4: Используйте DeepWiki! + +1. Откройте [http://localhost:3000](http://localhost:3000) в браузере +2. Введите URL репозитория (например, `https://github.com/openai/codex`) +3. Для приватных репозиториев нажмите “+ Add access tokens” и введите токен +4. Нажмите “Generate Wiki” и наблюдайте за магией! + +## 🔍 Как это работает + +DeepWiki использует искусственный интеллект, чтобы: + +1. Клонировать и проанализировать репозиторий GitHub, GitLab или Bitbucket (включая приватные — с использованием токенов) +2. Создать эмбеддинги кода для интеллектуального поиска +3. Сгенерировать документацию с учетом контекста (с помощью Google Gemini, OpenAI, OpenRouter, Azure OpenAI или локальных моделей Ollama) +4. Построить визуальные диаграммы для отображения связей в коде +5. Организовать всё в структурированную вики +6. Включить интеллектуальное взаимодействие через функцию "Спросить" +7. Обеспечить углубленный анализ через DeepResearch + +```mermaid +graph TD + A[Пользователь вводит ссылку на репозиторий] --> AA{Приватный репозиторий?} + AA -->|Да| AB[Добавить токен доступа] + AA -->|Нет| B[Клонировать репозиторий] + AB --> B + B --> C[Анализ структуры кода] + C --> D[Создание эмбеддингов] + + D --> M{Выбор провайдера модели} + M -->|Google Gemini| E1[Генерация через Gemini] + M -->|OpenAI| E2[Генерация через OpenAI] + M -->|OpenRouter| E3[Генерация через OpenRouter] + M -->|Локальная Ollama| E4[Генерация через Ollama] + M -->|Azure| E5[Генерация через Azure] + + E1 --> E[Создание документации] + E2 --> E + E3 --> E + E4 --> E + E5 --> E + + D --> F[Создание диаграмм] + E --> G[Формирование вики] + F --> G + G --> H[Интерактивная DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process; + class H result; +``` + +## 🛠️ Структура проекта + +``` +deepwiki/ +├── api/ # Backend API сервер +│ ├── main.py # Точка входа API +│ ├── api.py # Реализация через FastAPI +│ ├── rag.py # RAG: генерация с дополнением +│ ├── data_pipeline.py # Утилиты обработки данных +│ └── requirements.txt # Зависимости Python +│ +├── src/ # Клиентское приложение на Next.js +│ ├── app/ # Каталог приложения Next.js +│ │ └── page.tsx # Главная страница приложения +│ └── components/ # React-компоненты +│ └── Mermaid.tsx # Рендеринг диаграмм Mermaid +│ +├── public/ # Статические ресурсы +├── package.json # JS-зависимости +└── .env # Переменные окружения +``` + +## 🤖 Система выбора моделей по провайдерам + +DeepWiki поддерживает гибкую систему выбора моделей от разных поставщиков: + +### Поддерживаемые провайдеры и модели + +- **Google**: По умолчанию `gemini-2.5-flash`, также доступны `gemini-2.5-flash-lite`, `gemini-2.5-pro`, и др. +- **OpenAI**: По умолчанию `gpt-5-nano`, также поддерживает `gpt-5`, `4o` и другие +- **OpenRouter**: Доступ к множеству моделей через единый API (Claude, Llama, Mistral и др.) +- **Azure OpenAI**: По умолчанию `gpt-4o`, поддерживаются и другие +- **Ollama**: Локальные open-source модели, например `llama3` + +### Переменные окружения + +Каждому провайдеру соответствуют свои ключи: + +```bash +GOOGLE_API_KEY=... # Для моделей Google Gemini +OPENAI_API_KEY=... # Для моделей OpenAI +OPENROUTER_API_KEY=... # Для моделей OpenRouter +AZURE_OPENAI_API_KEY=... # Для моделей Azure +AZURE_OPENAI_ENDPOINT=... +AZURE_OPENAI_VERSION=... + +# Кастомный адрес для OpenAI API +OPENAI_BASE_URL=https://ваш-кастомный-api/v1 + +# Хост Ollama +OLLAMA_HOST=http://localhost:11434 + +# Каталог конфигурации +DEEPWIKI_CONFIG_DIR=/путь/к/конфигурации +``` + +### Конфигурационные файлы + +DeepWiki использует JSON-файлы для настройки: + +1. **`generator.json`** — конфигурация генерации текста и моделей +2. **`embedder.json`** — настройки эмбеддингов и ретривера +3. **`repo.json`** — правила обработки репозиториев + +По умолчанию хранятся в `api/config/`, путь можно изменить через `DEEPWIKI_CONFIG_DIR`. + +### Кастомизация для сервис-провайдеров + +Функция выбора модели позволяет: + +- Предоставлять выбор моделей пользователям вашей системы +- Легко адаптироваться к новым LLM без изменения кода +- Поддерживать кастомные или специализированные модели + +Пользователи могут выбрать модель через интерфейс или указать свой идентификатор. + +### Настройка OpenAI base_url для корпоративных клиентов + +Позволяет: + +- Использовать приватные API OpenAI +- Подключаться к self-hosted решениям +- Интегрироваться с совместимыми сторонними сервисами + +**Скоро**: DeepWiki получит режим, в котором пользователи будут указывать свои API-ключи напрямую в запросах — удобно для корпоративных решений. + +## 🧩 Использование совместимых с OpenAI моделей (например, Alibaba Qwen) + +Чтобы использовать модели эмбеддингов, совместимые с OpenAI: + +1. Замените `api/config/embedder.json` на `embedder_openai_compatible.json` +2. В `.env` добавьте: +```bash +OPENAI_API_KEY=ваш_ключ +OPENAI_BASE_URL=совместимый_endpoint +``` + +Программа автоматически подставит значения из переменных окружения. + +### Логирование + +DeepWiki использует стандартный `logging` из Python. Настраивается через: + +| Переменная | Описание | Значение по умолчанию | +|------------------|-----------------------------------------------|-------------------------------| +| `LOG_LEVEL` | Уровень логов (DEBUG, INFO, WARNING и т.д.) | INFO | +| `LOG_FILE_PATH` | Путь к файлу логов | `api/logs/application.log` | + +Пример: +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` + +Или через Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +Для постоянства логов при перезапуске контейнера `api/logs` монтируется в `./api/logs`. + +Также можно указать переменные в `.env`: + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` + +И просто выполнить: + +```bash +docker-compose up +``` + +**Безопасность логов:** в продакшене важно настроить права доступа к `api/logs`, чтобы исключить несанкционированный доступ или запись. + +## 🛠️ Расширенная настройка + +### Переменные окружения + +| Переменная | Назначение | Обязательно | Примечание | +|--------------------------|------------------------------------------------------------------------|-------------|-----------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Ключ API для Google Gemini | Нет | Только если используете модели от Google | +| `OPENAI_API_KEY` | Ключ API для OpenAI (нужен даже для эмбеддингов) | Да | Обязателен для генерации эмбеддингов | +| `OPENROUTER_API_KEY` | Ключ API для OpenRouter | Нет | Только если используете модели OpenRouter | +| `AZURE_OPENAI_API_KEY` | Ключ Azure OpenAI | Нет | Только если используете Azure | +| `AZURE_OPENAI_ENDPOINT` | Endpoint Azure | Нет | Только если используете Azure | +| `AZURE_OPENAI_VERSION` | Версия API Azure | Нет | Только если используете Azure | +| `OLLAMA_HOST` | Хост Ollama (по умолчанию http://localhost:11434) | Нет | Указывается при использовании внешнего сервера Ollama | +| `PORT` | Порт API-сервера (по умолчанию 8001) | Нет | Меняйте, если frontend и backend работают на одной машине | +| `SERVER_BASE_URL` | Базовый URL для API (по умолчанию http://localhost:8001) | Нет | | +| `DEEPWIKI_AUTH_MODE` | Включает режим авторизации (true или 1) | Нет | Если включён, потребуется код из `DEEPWIKI_AUTH_CODE` | +| `DEEPWIKI_AUTH_CODE` | Секретный код для запуска генерации | Нет | Только если включён режим авторизации | + +Если не используете Ollama, обязательно настройте OpenAI API ключ. + +## Режим авторизации + +DeepWiki может быть запущен в режиме авторизации — для генерации вики потребуется ввести секретный код. Это полезно, если вы хотите ограничить доступ к функциональности. + +Для включения: + +- `DEEPWIKI_AUTH_MODE=true` +- `DEEPWIKI_AUTH_CODE=секретный_код` + +Это ограничивает доступ с фронтенда и защищает кэш, но не блокирует прямые вызовы API. + +### Запуск через Docker + +Вы можете использовать Docker: + +#### Запуск контейнера + +```bash +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=... \ + -e OPENAI_API_KEY=... \ + -e OPENROUTER_API_KEY=... \ + -e OLLAMA_HOST=... \ + -e AZURE_OPENAI_API_KEY=... \ + -e AZURE_OPENAI_ENDPOINT=... \ + -e AZURE_OPENAI_VERSION=... \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Каталог `~/.adalflow` содержит: + +- Клонированные репозитории +- Эмбеддинги и индексы +- Сгенерированные кэшированные вики + +#### Docker Compose + +```bash +# Убедитесь, что .env заполнен +docker-compose up +``` + +#### Использование .env + +```bash +echo "GOOGLE_API_KEY=..." > .env +... +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +#### Локальная сборка Docker-образа + +```bash +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +docker build -t deepwiki-open . + +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=... \ + -e OPENAI_API_KEY=... \ + ... \ + deepwiki-open +``` + +#### Самоподписанные сертификаты + +1. Создайте каталог `certs` (или свой) +2. Поместите сертификаты `.crt` или `.pem` +3. Соберите образ: + +```bash +docker build --build-arg CUSTOM_CERT_DIR=certs . +``` + +### Описание API + +Сервер API: + +- Клонирует и индексирует репозитории +- Реализует RAG +- Поддерживает потоковую генерацию + +См. подробности в [API README](./api/README.md) + +## 🔌 Интеграция с OpenRouter + +Платформа [OpenRouter](https://openrouter.ai/) предоставляет доступ ко множеству моделей: + +- **Много моделей**: OpenAI, Anthropic, Google, Meta и др. +- **Простая настройка**: достаточно API-ключа +- **Гибкость и экономия**: выбирайте модели по цене и производительности +- **Быстрое переключение**: без изменения кода + +### Как использовать + +1. Получите ключ на [OpenRouter](https://openrouter.ai/) +2. Добавьте `OPENROUTER_API_KEY=...` в `.env` +3. Активируйте в интерфейсе +4. Выберите модель (например GPT-4o, Claude 3.5, Gemini 2.0 и др.) + +Подходит для: + +- Тестирования разных моделей без регистрации в каждом сервисе +- Доступа к моделям в регионах с ограничениями +- Сравнения производительности +- Оптимизации затрат + +## 🤖 Возможности Ask и DeepResearch + +### Ask + +- **Ответы по коду**: AI использует содержимое репозитория +- **RAG**: подбираются релевантные фрагменты +- **Потоковая генерация**: ответы формируются в реальном времени +- **История общения**: поддерживается контекст + +### DeepResearch + +Функция глубокого анализа: + +- **Многошаговый подход**: AI сам исследует тему +- **Этапы исследования**: + 1. План + 2. Промежуточные результаты + 3. Итоговый вывод + +Активируется переключателем "Deep Research". + +## 📱 Скриншоты + +![Интерфейс](screenshots/Interface.png) +*Основной интерфейс DeepWiki* + +![Приватный доступ](screenshots/privaterepo.png) +*Доступ к приватным репозиториям* + +![DeepResearch](screenshots/DeepResearch.png) +*DeepResearch анализирует сложные темы* + +### Видео-демо + +[![Видео](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +## ❓ Решение проблем + +### Проблемы с API-ключами + +- **“Отсутствуют переменные окружения”** — проверьте `.env` +- **“Неверный ключ”** — уберите пробелы +- **“Ошибка OpenRouter API”** — проверьте ключ и баланс +- **“Ошибка Azure API”** — проверьте ключ, endpoint и версию + +### Проблемы с подключением + +- **“Нет подключения к API”** — убедитесь, что сервер запущен на 8001 +- **“CORS ошибка”** — пробуйте запускать frontend и backend на одной машине + +### Ошибки генерации + +- **“Ошибка генерации вики”** — попробуйте меньший репозиторий +- **“Неверный формат ссылки”** — используйте корректные ссылки +- **“Нет структуры репозитория”** — проверьте токен доступа +- **“Ошибка диаграмм”** — система попытается автоматически исправить + +### Универсальные советы + +1. Перезапустите frontend и backend +2. Проверьте консоль браузера +3. Проверьте логи API + +## 🤝 Участие + +Вы можете: + +- Заводить issues +- Отправлять pull requests +- Делиться идеями + +## 📄 Лицензия + +Проект распространяется под лицензией MIT. См. файл [LICENSE](LICENSE) + +## ⭐ История звёзд + +[![График звёзд](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) diff --git a/reference-deepwiki/deepwiki-open-main/README.vi.md b/reference-deepwiki/deepwiki-open-main/README.vi.md new file mode 100644 index 0000000..f526213 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.vi.md @@ -0,0 +1,423 @@ +# DeepWiki-Open + +![DeepWiki Banner](screenshots/Deepwiki.png) + +**Open DeepWiki** là 1 triển khai thay thế cho DeepWiki, tự động tạo ra các trang wiki cho bất kỳ Repository nào trên GitHub, GitLab hoặc BitBucket! Chỉ cần nhập đường dẫn Repository, và DeepWiki sẽ: + +1. Phân tích cấu trúc mã nguồn +2. Tạo tài liệu đầy đủ và chi tiết +3. Tạo sơ đồ trực quan để giải thích cách mọi thứ hoạt động +4. Sắp xếp tất cả documents thành một wiki dễ hiểu + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ Tính năng + +- **Tạo Tài liệu tức thì**: Biến bất kỳ Repository GitHub, GitLab hoặc BitBucket nào thành wiki chỉ trong vài giây +- **Hỗ trợ Private Repository**: Truy cập Private Repository một cách an toàn với personal access tokens +- **Phân tích thông minh**: Hiểu cấu trúc và mối quan hệ của source codes nhờ AI +- **Tự động tạo Sơ đồ**: Tự động tạo sơ đồ Mermaid để trực quan hóa kiến trúc và luồng dữ liệu +- **Dễ dàng thao tác**:Giao diện wiki đơn giản, trực quan để khám phá +- **Trò chuyện với repository**: Trò chuyện với repo của bạn bằng AI (tích hợp RAG) để nhận câu trả lời chính xác +- **DeepResearch**:Quy trình Deep Research nhiều bước giúp phân tích kỹ lưỡng các chủ đề phức tạp +- **Hỗ trợ nhiều mô hình**: Hỗ trợ Google Gemini, OpenAI, OpenRouter, và local Ollama models + +## 🚀 Bắt đầu (Siêu dễ :)) + +### Option 1: Sử dụng Docker + +```bash +# Clone repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Tạo .env file với API keys +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# Optional: Thêm OpenRouter API key nếu bạn muốn OpenRouter models +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Run với Docker Compose +docker-compose up +``` + +> 💡 **Hướng dẫn lấy Keys** +> - Lấy Google API key từ [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Lấy OpenAI API key từ [OpenAI Platform](https://platform.openai.com/api-keys) + +### Option 2: Setup thủ công (Khuyên dùng) + +#### Bước 1: Set Up API Keys + +Tạo `.env` file trong thư mục gốc của project với những keys vừa tạo: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# Optional: Thêm OpenRouter API key nếu bạn muốn OpenRouter models +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### Bước 2: Bắt đầu với Backend + +```bash +# Cài đặt Python dependencies +pip install -r api/requirements.txt + +# Chạy API server +python -m api.main +``` + +#### Bước 3: Bắt đầu với Frontend + +```bash +# Cài đặt JavaScript dependencies +npm install +# Hoặc +yarn install + +# Chạy the web app +npm run dev +# Hoặc +yarn dev +``` + +#### Bước 4: Dùng DeepWiki! + +1. Mở [http://localhost:3000](http://localhost:3000) trên trình duyệt +2. Nhập đường dẫn GitHub, GitLab, hoặt Bitbucket repository (ví dụ như `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, hay `https://bitbucket.org/redradish/atlassian_app_versions`) +3. Cho private repositories, Nhấn "+ Add access tokens" và nhập your GitHub hoặt GitLab personal access token +4. Click "Generate Wiki" và xem kết quả! + +## 🔍 Cách Open Deepwiki hoạt động + +DeepWiki dùng AI để: + +1. Clone và phân tích GitHub, GitLab, hoặc Bitbucket repository (bao gồm private repos với token authentication) +2. Tạo embeddings cho code (Rag support) +3. Tạo documentation với context-aware AI (dùng Google Gemini, OpenAI, OpenRouter, hay local Ollama models) +4. Tạo diagrams để giải thích code relationships +5. Organize thông tin thành 1 trang wiki +6. Cho phép Q&A với repository +7. Cung cấp khả năng DeepResearch + +```mermaid +graph TD + A[User inputs GitHub/GitLab/Bitbucket repo] --> AA{Private repo?} + AA -->|Yes| AB[Add access token] + AA -->|No| B[Clone Repository] + AB --> B + B --> C[Analyze Code Structure] + C --> D[Create Code Embeddings] + + D --> M{Select Model Provider} + M -->|Google Gemini| E1[Generate with Gemini] + M -->|OpenAI| E2[Generate with OpenAI] + M -->|OpenRouter| E3[Generate with OpenRouter] + M -->|Local Ollama| E4[Generate with Ollama] + + E1 --> E[Generate Documentation] + E2 --> E + E3 --> E + E4 --> E + + D --> F[Create Visual Diagrams] + E --> G[Organize as Wiki] + F --> G + G --> H[Interactive DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ Cấu trúc dự án + +``` +deepwiki/ +├── api/ # Backend API server +│ ├── main.py # API +│ ├── api.py # FastAPI +│ ├── rag.py # Retrieval Augmented Generation (RAG) +│ ├── data_pipeline.py # Data processing utilities +│ └── requirements.txt # Python dependencies +│ +├── src/ # Frontend Next.js app +│ ├── app/ # Next.js app directory +│ │ └── page.tsx # Main application page +│ └── components/ # React components +│ └── Mermaid.tsx # Mermaid diagram renderer +│ +├── public/ # Static assets +├── package.json # JavaScript dependencies +└── .env # Environment variables (create this) +``` + +## 🛠️ Cài đặt nâng cao + +### Biến môi trường + +| Biến môi trường | Mô tả | bắt buộc | ghi chú | +|----------|-------------|----------|------| +| `GOOGLE_API_KEY` | Google Gemini API key | Có | +| `OPENAI_API_KEY` | OpenAI API key | có | +| `OPENROUTER_API_KEY` | OpenRouter API key | không| Yêu cầu nếu bạn muốn dùng OpenRouter models | +| `PORT` | Port của API server (mặc định: 8001) | không | Nếu bạn muốn chạy API và frontend trên cùng 1 máy, hãy điều chỉnh Port `SERVER_BASE_URL` | +| `SERVER_BASE_URL` | Đường dẫnn mặt định của API server (mặc định: http://localhost:8001) | không | + +### Cài Đặt với Docker + +Bạn có thể dùng Docker để run DeepWiki: + +```bash +# Pull Docker image từ GitHub Container Registry +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# Chạy container với biến môi trường +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +Hoặc đơn giản hơn, sử dụng `docker-compose.yml` : + +```bash +# Edit the .env file with your API keys first +docker-compose up +``` + +#### Sử dụng .env file với Docker + +Bạn có thể "mount" .env file vào container: + +```bash +# Tạo .env file với your API keys +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# Run container với .env file +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +#### Bạn có thể Building the Docker image trên máy cục bộ + + +```bash +# Clone repository +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# Build Docker image +docker build -t deepwiki-open . + +# Chạy container +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + deepwiki-open +``` + +### Chi tiết API Server + +API server cung cấp: +- Repository cloning và indexing +- RAG (Retrieval Augmented Generation) +- Trò chuyện liên tục + +Biết thêm chi tiết truy cập [ API README](./api/README.md). + +## 🤖 Hệ thống lựa chọn mô hình dựa trên nhà cung cấp + +DeepWiki hiện đã triển khai một hệ thống lựa chọn mô hình linh hoạt dựa trên nhiều nhà cung cấp LLM: + +### Các nhà cung cấp và mô hình được hỗ trợ + +- **Google**: Mặc định là `gemini-2.5-flash`, cũng hỗ trợ `gemini-2.5-flash-lite`, `gemini-2.5-pro`, v.v. +- **OpenAI**: Mặc định là `gpt-5-nano`, cũng hỗ trợ `gpt-5`, `4o`, v.v. +- **OpenRouter**: Truy cập nhiều mô hình qua một API thống nhất, bao gồm Claude, Llama, Mistral, v.v. +- **Ollama**: Hỗ trợ các mô hình mã nguồn mở chạy cục bộ như `llama3` + +### Biến môi trường + +Mỗi nhà cung cấp yêu cầu các biến môi trường API key tương ứng: + +``` +# API Keys +GOOGLE_API_KEY=google_api_key_của_bạn # Bắt buộc cho các mô hình Google Gemini +OPENAI_API_KEY=openai_key_của_bạn # Bắt buộc cho các mô hình OpenAI +OPENROUTER_API_KEY=openrouter_key_của_bạn # Bắt buộc cho các mô hình OpenRouter + +# Cấu hình URL cơ sở cho OpenAI API +OPENAI_BASE_URL=https://endpoint-tùy-chỉnh.com/v1 # Tùy chọn, cho các điểm cuối API OpenAI tùy chỉnh + +# Thư mục cấu hình +DEEPWIKI_CONFIG_DIR=/đường/dẫn/đến/thư_mục/cấu_hình # Tùy chọn, cho vị trí tệp cấu hình tùy chỉnh +``` + +### Tệp cấu hình + +DeepWiki sử dụng các tệp cấu hình JSON để quản lý các khía cạnh khác nhau của hệ thống: + +1. **`generator.json`**: Cấu hình cho các mô hình tạo văn bản + - Xác định các nhà cung cấp mô hình có sẵn (Google, OpenAI, OpenRouter, Ollama) + - Chỉ định các mô hình mặc định và có sẵn cho mỗi nhà cung cấp + - Chứa các tham số đặc thù cho mô hình như temperature và top_p + +2. **`embedder.json`**: Cấu hình cho mô hình embedding và xử lý văn bản + - Xác định mô hình embedding cho lưu trữ vector + - Chứa cấu hình bộ truy xuất cho RAG + - Chỉ định cài đặt trình chia văn bản để phân đoạn tài liệu + +3. **`repo.json`**: Cấu hình xử lý repository + - Chứa bộ lọc tệp để loại trừ một số tệp và thư mục nhất định + - Xác định giới hạn kích thước repository và quy tắc xử lý + +Mặc định, các tệp này nằm trong thư mục `api/config/`. Bạn có thể tùy chỉnh vị trí của chúng bằng biến môi trường `DEEPWIKI_CONFIG_DIR`. + +### Lựa chọn mô hình tùy chỉnh cho nhà cung cấp dịch vụ + +Tính năng lựa chọn mô hình tùy chỉnh được thiết kế đặc biệt cho các nhà cung cấp dịch vụ cần: + +- Bạn có thể cung cấp cho người dùng trong tổ chức của mình nhiều lựa chọn mô hình AI khác nhau +- Bạn có thể thích ứng nhanh chóng với môi trường LLM đang phát triển nhanh chóng mà không cần thay đổi mã +- Bạn có thể hỗ trợ các mô hình chuyên biệt hoặc được tinh chỉnh không có trong danh sách định nghĩa trước + +Bạn có thể triển khai các mô hình cung cấp bằng cách chọn từ các tùy chọn định nghĩa trước hoặc nhập định danh mô hình tùy chỉnh trong giao diện người dùng. + +### Cấu hình URL cơ sở cho các kênh riêng doanh nghiệp + +Cấu hình base_url của OpenAI Client được thiết kế chủ yếu cho người dùng doanh nghiệp có các kênh API riêng. Tính năng này: + +- Cho phép kết nối với các điểm cuối API riêng hoặc dành riêng cho doanh nghiệp +- Cho phép các tổ chức sử dụng dịch vụ LLM tự lưu trữ hoặc triển khai tùy chỉnh +- Hỗ trợ tích hợp với các dịch vụ tương thích API OpenAI của bên thứ ba + +**Sắp ra mắt**: Trong các bản cập nhật tương lai, DeepWiki sẽ hỗ trợ chế độ mà người dùng cần cung cấp API key của riêng họ trong các yêu cầu. Điều này sẽ cho phép khách hàng doanh nghiệp có kênh riêng sử dụng cấu hình API hiện có mà không cần chia sẻ thông tin đăng nhập với triển khai DeepWiki. + +## 🔌 Tích hợp OpenRouter + +DeepWiki hiện đã hỗ trợ [OpenRouter](https://openrouter.ai/) làm nhà cung cấp mô hình, cho phép bạn truy cập hàng trăm mô hình AI thông qua một API duy nhất: + +- **Nhiều tùy chọn mô hình**: Truy cập các mô hình từ OpenAI, Anthropic, Google, Meta, Mistral và nhiều nhà cung cấp khác +- **Cấu hình đơn giản**: Chỉ cần thêm khóa API của bạn từ OpenRouter và chọn mô hình bạn muốn sử dụng +- **Tiết kiệm chi phí**: Lựa chọn mô hình phù hợp với ngân sách và nhu cầu hiệu suất của bạn +- **Chuyển đổi dễ dàng**: Chuyển đổi giữa các mô hình khác nhau mà không cần thay đổi mã nguồn + + +### Cách sử dụng OpenRouter với DeepWiki + +1. **Lấy API Key**: Đăng ký tại [OpenRouter](https://openrouter.ai/) và lấy khóa API +2. **Thêm vào biến môi trường**: Thêm `OPENROUTER_API_KEY=your_key` vào file `.env` +3. **Bật trong giao diện**: Chọn "Use OpenRouter API" trên trang chủ +4. **Chọn mô hình**: Lựa chọn từ các mô hình phổ biến như GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 và nhiều hơn nữa + + +OpenRouter đặc biệt hữu ích nếu bạn muốn: + +- Thử nhiều mô hình khác nhau mà không cần đăng ký nhiều dịch vụ +- Truy cập các mô hình có thể bị giới hạn tại khu vực của bạn +- So sánh hiệu năng giữa các nhà cung cấp mô hình khác nhau +- Tối ưu hóa chi phí so với hiệu suất dựa trên nhu cầu của bạn + + +## 🤖 Tính năng Hỏi & Nghiên cứu Sâu (DeepResearch) + +### Tính năng Hỏi (Ask) + +Tính năng Hỏi cho phép bạn trò chuyện với kho mã của mình bằng cách sử dụng kỹ thuật RAG (Retrieval Augmented Generation): + +- **Phản hồi theo ngữ cảnh**: Nhận câu trả lời chính xác dựa trên mã thực tế trong kho của bạn +- **Ứng dụng RAG**: Hệ thống truy xuất các đoạn mã liên quan để tạo ra câu trả lời có cơ sở +- **Phản hồi theo thởi gian thực**: Xem câu trả lời được tạo ra trực tiếp, mang lại trải nghiệm tương tác hơn +- **Lưu lịch sử cuộc trò chuyện**: Hệ thống duy trì ngữ cảnh giữa các câu hỏi để cuộc đối thoại liền mạch hơn + + +### Tính năng DeepResearch + +DeepResearch nâng tầm phân tích kho mã với quy trình nghiện cứu nhiểu vòng: + +- **Ngieen cứu chuyên sâu**: Khám phá kỹ lưỡng các chủ đề phức tạp thông qua nhiểu vòng nghiện cứu +- **Quy trình có cấu trúc**: Tuân theo kế hoạch nghiện cứu rõ ràng với các bản cập nhật và kết luận tổng thể +- **Tự động tiếp tục**: AI sẽ tự động tiếp tục quá trình nghiện cứu cho đến khi đưa ra kết luận (tối đa 5 vòng) +- **Các giai đoạn nghiện cứu**: + 1. **Kế hoạch nghiện cứu**: Phác thảo phương pháp và những phát hiện ban đầu + 2. **Cập nhật nghiện cứu**: Bổ sung kiến thức mới qua từng vòng lặp + 3. **Kết luận cuối cùng**: Đưa ra câu trả lời toàn diện dựa trên tất cả các vòng nghiện cứu + +Để sử dụng DeepResearch, chỉ cần bật công tắc "Deep Research" trong giao diện Hỏi (Ask) trước khi gửi câu hỏi của bạn. + + +## 📱 Ảnh chụp màng hình + +![Giao diện chính của DeepWiki](screenshots/Interface.png) +*Giao diện chính của DeepWiki* + +![Hỗ trợ kho riêng tư](screenshots/privaterepo.png) +*Truy cập kho riêng tư bằng Personal Access Token* + +![Tính năng DeepResearch](screenshots/DeepResearch.png) +*DeepResearch thực hiện nghiện cứu nhiểu vòng cho các chủ đề phức tạp* + +### Demo Video + +[![DeepWiki Demo Video](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + + + +## ❓ Khắc phục sự cố + +### Vấn đề với API Key +- **"Thiếu biến môi trường"**: Đảm bảo rằng file `.env` của bạn nằm ở thư mục gốc của dự án và chứa các API key cần thiết +- **"API key không hợp lệ"**: Kiểm tra lại xem bạn đã sao chép đầy đủ API key mà không có khoảng trắng thừa chưa +- **"Lỗi API OpenRouter"**: Xác minh rằng API key của OpenRouter là hợp lệ và có đủ tín dụng + +### Vấn đề kết nối +- **"Không thể kết nối với máy chủ API"**: Đảm bảo máy chủ API đang chạy trên cổng 8001 +- **"Lỗi CORS"**: API được cấu hình để cho phép tất cả các nguồn gốc, nhưng nếu gặp sự cố, thử chạy cả frontend và backend trên cùng một máy tính + +### Vấn đề khi tạo nội dung +- **"Lỗi khi tạo wiki"**: Với các kho mã rất lớn, hãy thử trước với kho mã nhỏ hơn +- **"Định dạng kho mã không hợp lệ"**: Đảm bảo bạn đang sử dụng định dạng URL hợp lệ cho GitHub, GitLab hoặc Bitbucket +- **"Không thể lấy cấu trúc kho mã"**: Với các kho mã riêng tư, hãy đảm bảo bạn đã nhập token truy cập cá nhân hợp lệ và có quyền truy cập phù hợp +- **"Lỗi khi render sơ đồ"**: Ứng dụng sẽ tự động thử khắc phục các sơ đồ bị lỗi + +### Các giải pháp phổ biến +1. **Khởi động lại cả hai máy chủ**: Đôi khi, một lần khởi động lại đơn giản có thể giải quyết hầu hết các vấn đề +2. **Kiểm tra nhật ký trình duyệt**: Mở công cụ phát triển của trình duyệt để xem các lỗi JavaScript +3. **Kiểm tra nhật ký API**: Xem các lỗi Python trong terminal nơi API đang chạy + + +## 🤝 Đóng góp + +Chúng tôi hoan nghênh mọi đóng góp! Bạn có thể: +- Mở các vấn đề (issues) để báo lỗi hoặc yêu cầu tính năng +- Gửi pull request để cải thiện mã nguồn +- Chia sẻ phản hồi và ý tưởng của bạn + +## 📄 Giấy phép + +Dự án này được cấp phép theo Giấy phép MIT - xem file [LICENSE](LICENSE) để biết chi tiết. + +## ⭐ Lịch sử + +[![Biểu đồ lịch sử](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + diff --git a/reference-deepwiki/deepwiki-open-main/README.zh-tw.md b/reference-deepwiki/deepwiki-open-main/README.zh-tw.md new file mode 100644 index 0000000..08e4150 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.zh-tw.md @@ -0,0 +1,607 @@ +# DeepWiki-Open + +![DeepWiki 橫幅](screenshots/Deepwiki.png) + +**DeepWiki** 可以為任何 GitHub、GitLab 或 BitBucket 程式碼儲存庫自動建立美觀、互動式的 Wiki!只需輸入儲存庫名稱,DeepWiki 將: + +1. 分析程式碼結構 +2. 產生全面的文件 +3. 建立視覺化圖表解釋一切如何運作 +4. 將所有內容整理成易於導覽的 Wiki + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) +[![Tip in Crypto](https://tip.md/badge.svg)](https://tip.md/sng-asyncfunc) +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ 特點 + +- **即時文件**:幾秒鐘內將任何 GitHub、GitLab 或 BitBucket 儲存庫轉換為 Wiki +- **私人儲存庫支援**:使用個人存取權杖安全存取私人儲存庫 +- **智慧分析**:AI 驅動的程式碼結構和關係理解 +- **精美圖表**:自動產生 Mermaid 圖表視覺化架構和資料流 +- **簡易導覽**:簡單、直觀的介面探索 Wiki +- **提問功能**:使用 RAG 驅動的 AI 與您的儲存庫聊天,取得準確答案 +- **深度研究**:多輪研究過程,徹底調查複雜主題 +- **多模型提供商**:支援 Google Gemini、OpenAI、OpenRouter 和本機 Ollama 模型 + +## 🚀 快速開始(超級簡單!) + +### 選項 1:使用 Docker + +```bash +# 複製儲存庫 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# 建立包含 API 金鑰的 .env 檔案 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# 可選:如果您想使用 OpenRouter 模型,新增 OpenRouter API 金鑰 +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env +# 可選:如果 Ollama 不在本機執行,新增 Ollama 主機位址,預設為 http://localhost:11434 +echo "OLLAMA_HOST=your_ollama_host" >> .env + +# 使用 Docker Compose 執行 +docker-compose up +``` + +有關使用 DeepWiki 搭配 Ollama 和 Docker 的詳細說明,請參閱 [Ollama 操作說明](Ollama-instruction.md)。 + +(上述 Docker 命令以及 `docker-compose.yml` 設定會掛載您主機上的 `~/.adalflow` 目錄到容器內的 `/root/.adalflow`。此路徑用於儲存: +- 複製的儲存庫 (`~/.adalflow/repos/`) +- 儲存庫的嵌入和索引 (`~/.adalflow/databases/`) +- 快取的已產生 Wiki 內容 (`~/.adalflow/wikicache/`) + +這確保了即使容器停止或移除,您的資料也能持久保存。) + +> 💡 **取得這些金鑰的地方:** +> - 從 [Google AI Studio](https://makersuite.google.com/app/apikey) 取得 Google API 金鑰 +> - 從 [OpenAI Platform](https://platform.openai.com/api-keys) 取得 OpenAI API 金鑰 + +### 選項 2:手動設定(推薦) + +#### 步驟 1:設定 API 金鑰 + +在專案根目錄建立一個 `.env` 檔案,包含以下金鑰: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# 可選:如果您想使用 OpenRouter 模型,新增此項 +OPENROUTER_API_KEY=your_openrouter_api_key +# 可選:如果 Ollama 不在本機執行,新增 Ollama 主機位址,預設為 http://localhost:11434 +OLLAMA_HOST=your_ollama_host +``` + +#### 步驟 2:啟動後端 + +```bash +# 安裝 Python 相依性 +pip install -r api/requirements.txt + +# 啟動 API 伺服器 +python -m api.main +``` + +#### 步驟 3:啟動前端 + +```bash +# 安裝 JavaScript 相依性 +npm install +# 或 +yarn install + +# 啟動 Web 應用 +npm run dev +# 或 +yarn dev +``` + +#### 步驟 4:使用 DeepWiki! + +1. 在瀏覽器中開啟 [http://localhost:3000](http://localhost:3000) +2. 輸入 GitHub、GitLab 或 Bitbucket 儲存庫(如 `https://github.com/openai/codex`、`https://github.com/microsoft/autogen`、`https://gitlab.com/gitlab-org/gitlab` 或 `https://bitbucket.org/redradish/atlassian_app_versions`) +3. 對於私人儲存庫,點擊「+ 新增存取權杖」並輸入您的 GitHub 或 GitLab 個人存取權杖 +4. 點擊「產生 Wiki」,見證奇蹟的發生! + +## 🔍 工作原理 + +DeepWiki 使用 AI 來: + +1. 複製並分析 GitHub、GitLab 或 Bitbucket 儲存庫(包括使用權杖驗證的私人儲存庫) +2. 建立程式碼嵌入用於智慧檢索 +3. 使用上下文感知 AI 產生文件(使用 Google Gemini、OpenAI、OpenRouter 或本機 Ollama 模型) +4. 建立視覺化圖表解釋程式碼關係 +5. 將所有內容組織成結構化 Wiki +6. 透過提問功能實現與儲存庫的智慧問答 +7. 透過深度研究功能提供深入研究能力 + +```mermaid +graph TD + A[使用者輸入 GitHub/GitLab/Bitbucket 儲存庫] --> AA{私人儲存庫?} + AA -->|是| AB[新增存取權杖] + AA -->|否| B[複製儲存庫] + AB --> B + B --> C[分析程式碼結構] + C --> D[建立程式碼嵌入] + + D --> M{選擇模型提供商} + M -->|Google Gemini| E1[使用 Gemini 產生] + M -->|OpenAI| E2[使用 OpenAI 產生] + M -->|OpenRouter| E3[使用 OpenRouter 產生] + M -->|本機 Ollama| E4[使用 Ollama 產生] + + E1 --> E[產生文件] + E2 --> E + E3 --> E + E4 --> E + + D --> F[建立視覺化圖表] + E --> G[組織為 Wiki] + F --> G + G --> H[互動式 DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ 專案結構 + +``` +deepwiki/ +├── api/ # 後端 API 伺服器 +│ ├── main.py # API 進入點 +│ ├── api.py # FastAPI 實作 +│ ├── rag.py # 檢索增強產生 +│ ├── data_pipeline.py # 資料處理工具 +│ └── requirements.txt # Python 相依性 +│ +├── src/ # 前端 Next.js 應用 +│ ├── app/ # Next.js 應用目錄 +│ │ └── page.tsx # 主應用頁面 +│ └── components/ # React 元件 +│ └── Mermaid.tsx # Mermaid 圖表渲染器 +│ +├── public/ # 靜態資源 +├── package.json # JavaScript 相依性 +└── .env # 環境變數(需要建立) +``` + +## 🤖 基於提供商的模型選擇系統 + +DeepWiki 現在實作了靈活的基於提供商的模型選擇系統,支援多種 LLM 提供商: + +### 支援的提供商和模型 + +- **Google**:預設 `gemini-2.5-flash`,也支援 `gemini-2.5-flash-lite`、`gemini-2.5-pro` 等 +- **OpenAI**:預設 `gpt-5-nano`,也支援 `gpt-5`, `4o` 等 +- **OpenRouter**:透過統一 API 存取多種模型,包括 Claude、Llama、Mistral 等 +- **Ollama**:支援本機執行的開源模型,如 `llama3` + +### 環境變數 + +每個提供商都需要對應的 API 金鑰環境變數: + +``` +# API 金鑰 +GOOGLE_API_KEY=your_google_api_key # 使用 Google Gemini 模型時必需 +OPENAI_API_KEY=your_openai_api_key # 使用 OpenAI 模型時必需 +OPENROUTER_API_KEY=your_openrouter_api_key # 使用 OpenRouter 模型時必需 + +# OpenAI API 基礎 URL 設定 +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # 可選,用於自訂 OpenAI API 端點 + +# Ollama 主機 +OLLAMA_HOST=your_ollama_host # 可選,如果 Ollama 不在本機執行,預設為 http://localhost:11434 + +# 設定檔目錄 +DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # 可選,用於自訂設定檔位置 +``` + +### 設定檔 + +DeepWiki 使用 JSON 設定檔來管理系統的各個層面: + +1. **`generator.json`**:文字產生模型設定 + - 定義可用的模型提供商(Google、OpenAI、OpenRouter、Ollama) + - 指定每個提供商的預設和可用模型 + - 包含模型特定參數,如 temperature 和 top_p + +2. **`embedder.json`**:嵌入模型和文字處理設定 + - 定義用於向量儲存的嵌入模型 + - 包含用於 RAG 的檢索器設定 + - 指定文件分塊的文字分割器設定 + +3. **`repo.json`**:儲存庫處理設定 + - 包含排除特定檔案和目錄的檔案篩選器 + - 定義儲存庫大小限制和處理規則 + +預設情況下,這些檔案位於 `api/config/` 目錄中。您可以使用 `DEEPWIKI_CONFIG_DIR` 環境變數自訂它們的位置。 + +### 為服務提供商設計的自訂模型選擇 + +自訂模型選擇功能專為需要以下功能的服務提供商設計: + +- 您可以在組織內為使用者提供多種 AI 模型選擇 +- 您可以快速適應快速發展的 LLM 領域,無需變更程式碼 +- 您可以支援不在預定義清單中的專業或微調模型 + +服務提供商可以透過從預定義選項中選擇或在前端介面中輸入自訂模型識別符來實作其模型提供方案。 + +### 為企業私有通道設計的基礎 URL 設定 + +OpenAI 客戶端的 base_url 設定主要為擁有私有 API 通道的企業使用者設計。此功能: + +- 支援連線到私有或企業特定的 API 端點 +- 允許組織使用自己的自主託管或自訂部署的 LLM 服務 +- 支援與第三方 OpenAI API 相容服務的整合 + +**即將推出**:在未來的更新中,DeepWiki 將支援一種模式,讓使用者需要在請求中提供自己的 API 金鑰。這將允許擁有私有通道的企業客戶使用其現有的 API 安排,而不必與 DeepWiki 部署共享憑證。 + +## 🧩 使用 OpenAI 相容的嵌入模型(如阿里巴巴 Qwen) + +如果您想使用與 OpenAI API 相容的嵌入模型(如阿里巴巴 Qwen),請按照以下步驟操作: + +1. 用 `api/config/embedder_openai_compatible.json` 的內容替換 `api/config/embedder.json` 的內容。 +2. 在專案根目錄的 `.env` 檔案中,設定相關的環境變數,例如: + ``` + OPENAI_API_KEY=your_api_key + OPENAI_BASE_URL=your_openai_compatible_endpoint + ``` +3. 程式會自動用環境變數的值替換 embedder.json 中的預留位置。 + +這讓您可以無縫切換到任何 OpenAI 相容的嵌入服務,無需變更程式碼。 + +### 日誌記錄 + +DeepWiki 使用 Python 的內建 `logging` 模組進行診斷輸出。您可以透過環境變數設定詳細程度和日誌檔案目標: + +| 變數 | 說明 | 預設值 | +|-----------------|----------------------------------------------------------------------|------------------------------| +| `LOG_LEVEL` | 日誌記錄等級(DEBUG、INFO、WARNING、ERROR、CRITICAL) | INFO | +| `LOG_FILE_PATH` | 日誌檔案的路徑。如果設定,日誌將寫入此檔案 | `api/logs/application.log` | + +要啟用除錯日誌並將日誌導向自訂檔案: +```bash +export LOG_LEVEL=DEBUG +export LOG_FILE_PATH=./debug.log +python -m api.main +``` +或使用 Docker Compose: +```bash +LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up +``` + +使用 Docker Compose 執行時,容器的 `api/logs` 目錄會掛載到主機上的 `./api/logs`(請參閱 `docker-compose.yml` 中的 `volumes` 區段),確保日誌檔案在重新啟動後仍然存在。 + +您也可以將這些設定儲存在 `.env` 檔案中: + +```bash +LOG_LEVEL=DEBUG +LOG_FILE_PATH=./debug.log +``` +然後簡單執行: + +```bash +docker-compose up +``` + +**日誌路徑安全性考量:** 在生產環境中,請確保 `api/logs` 目錄和任何自訂日誌檔案路徑都受到適當的檔案系統權限和存取控制保護。應用程式會強制要求 `LOG_FILE_PATH` 位於專案的 `api/logs` 目錄內,以防止路徑遍歷或未授權的寫入。 + +## 🛠️ 進階設定 + +### 環境變數 + +| 變數 | 說明 | 必需 | 備註 | +|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------| +| `GOOGLE_API_KEY` | Google Gemini API 金鑰,用於 AI 產生 | 否 | 只有在您想使用 Google Gemini 模型時才需要 +| `OPENAI_API_KEY` | OpenAI API 金鑰,用於嵌入 | 是 | 備註:即使您不使用 OpenAI 模型,這個也是必需的,因為它用於嵌入 | +| `OPENROUTER_API_KEY` | OpenRouter API 金鑰,用於替代模型 | 否 | 只有在您想使用 OpenRouter 模型時才需要 | +| `OLLAMA_HOST` | Ollama 主機(預設:http://localhost:11434) | 否 | 只有在您想使用外部 Ollama 伺服器時才需要 | +| `PORT` | API 伺服器的連接埠(預設:8001) | 否 | 如果您在同一台機器上託管 API 和前端,請確保相應地變更 `SERVER_BASE_URL` 的連接埠 | +| `SERVER_BASE_URL` | API 伺服器的基礎 URL(預設:http://localhost:8001) | 否 | +| `DEEPWIKI_AUTH_MODE` | 設定為 `true` 或 `1` 以啟用授權模式 | 否 | 預設為 `false`。如果啟用,則需要 `DEEPWIKI_AUTH_CODE` | +| `DEEPWIKI_AUTH_CODE` | 當 `DEEPWIKI_AUTH_MODE` 啟用時,Wiki 產生所需的秘密代碼 | 否 | 只有在 `DEEPWIKI_AUTH_MODE` 為 `true` 或 `1` 時才使用 | + +如果您不使用 ollama 模式,您需要設定 OpenAI API 金鑰用於嵌入。其他 API 金鑰只有在設定並使用對應提供商的模型時才需要。 + +## 授權模式 + +DeepWiki 可以設定為在授權模式下執行,在此模式下,Wiki 產生需要有效的授權代碼。如果您想控制誰可以使用產生功能,這會很有用。 +限制前端啟動並保護快取刪除,但如果直接存取 API 端點,無法完全防止後端產生。 + +要啟用授權模式,請設定以下環境變數: + +- `DEEPWIKI_AUTH_MODE`:將此設定為 `true` 或 `1`。啟用時,前端將顯示授權代碼的輸入欄位。 +- `DEEPWIKI_AUTH_CODE`:將此設定為所需的秘密代碼。限制前端啟動並保護快取刪除,但如果直接存取 API 端點,無法完全防止後端產生。 + +如果未設定 `DEEPWIKI_AUTH_MODE` 或設定為 `false`(或除 `true`/`1` 以外的任何其他值),授權功能將被停用,不需要任何代碼。 + +### Docker 設定 + +您可以使用 Docker 來執行 DeepWiki: + +```bash +# 從 GitHub Container Registry 拉取映像 +docker pull ghcr.io/asyncfuncai/deepwiki-open:latest + +# 使用環境變數執行容器 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -e OLLAMA_HOST=your_ollama_host \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +此命令也會將主機上的 `~/.adalflow` 掛載到容器中的 `/root/.adalflow`。此路徑用於儲存: +- 複製的儲存庫(`~/.adalflow/repos/`) +- 它們的嵌入和索引(`~/.adalflow/databases/`) +- 快取的已產生 Wiki 內容(`~/.adalflow/wikicache/`) + +這確保即使容器停止或移除,您的資料也會持續存在。 + +或使用提供的 `docker-compose.yml` 檔案: + +```bash +# 首先使用您的 API 金鑰編輯 .env 檔案 +docker-compose up +``` + +(`docker-compose.yml` 檔案預先設定為掛載 `~/.adalflow` 以保持資料持續性,類似於上面的 `docker run` 命令。) + +#### 在 Docker 中使用 .env 檔案 + +您也可以將 .env 檔案掛載到容器: + +```bash +# 使用您的 API 金鑰建立 .env 檔案 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env +echo "OLLAMA_HOST=your_ollama_host" >> .env + +# 使用掛載的 .env 檔案執行容器 +docker run -p 8001:8001 -p 3000:3000 \ + -v $(pwd)/.env:/app/.env \ + -v ~/.adalflow:/root/.adalflow \ + ghcr.io/asyncfuncai/deepwiki-open:latest +``` + +此命令也會將主機上的 `~/.adalflow` 掛載到容器中的 `/root/.adalflow`。此路徑用於儲存: +- 複製的儲存庫(`~/.adalflow/repos/`) +- 它們的嵌入和索引(`~/.adalflow/databases/`) +- 快取的已產生 Wiki 內容(`~/.adalflow/wikicache/`) + +這確保即使容器停止或移除,您的資料也會持續存在。 + +#### 在本機建置 Docker 映像 + +如果您想在本機建置 Docker 映像: + +```bash +# 複製儲存庫 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# 建置 Docker 映像 +docker build -t deepwiki-open . + +# 執行容器 +docker run -p 8001:8001 -p 3000:3000 \ + -e GOOGLE_API_KEY=your_google_api_key \ + -e OPENAI_API_KEY=your_openai_api_key \ + -e OPENROUTER_API_KEY=your_openrouter_api_key \ + -e OLLAMA_HOST=your_ollama_host \ + deepwiki-open +``` + +### API 伺服器詳細資訊 + +API 伺服器提供: +- 儲存庫複製和索引 +- RAG(檢索增強產生) +- 串流聊天完成 + +更多詳細資訊,請參閱 [API README](./api/README.md)。 + +## 🔌 OpenRouter 整合 + +DeepWiki 現在支援 [OpenRouter](https://openrouter.ai/) 作為模型提供商,讓您可以透過單一 API 存取數百個 AI 模型: + +- **多種模型選項**:存取來自 OpenAI、Anthropic、Google、Meta、Mistral 等的模型 +- **簡單設定**:只需新增您的 OpenRouter API 金鑰並選擇您想使用的模型 +- **成本效益**:選擇符合您預算和效能需求的模型 +- **輕鬆切換**:在不同模型之間切換,無需變更程式碼 + +### 如何在 DeepWiki 中使用 OpenRouter + +1. **取得 API 金鑰**:在 [OpenRouter](https://openrouter.ai/) 註冊並取得您的 API 金鑰 +2. **新增到環境**:在您的 `.env` 檔案中新增 `OPENROUTER_API_KEY=your_key` +3. **在 UI 中啟用**:在首頁勾選「使用 OpenRouter API」選項 +4. **選擇模型**:從熱門模型中選擇,如 GPT-4o、Claude 3.5 Sonnet、Gemini 2.0 等 + +OpenRouter 特別適用於以下情況: +- 想嘗試不同模型而不用註冊多個服務 +- 存取在您所在地區可能受限的模型 +- 比較不同模型提供商的效能 +- 根據您的需求最佳化成本與效能的平衡 + +## 🤖 提問和深度研究功能 + +### 提問功能 + +提問功能允許您使用檢索增強產生(RAG)與您的儲存庫聊天: + +- **上下文感知回應**:基於儲存庫中實際程式碼取得準確答案 +- **RAG 驅動**:系統檢索相關程式碼片段,提供有根據的回應 +- **即時串流傳輸**:即時檢視產生的回應,取得更互動式的體驗 +- **對話歷史**:系統在問題之間保持上下文,實現更連貫的互動 + +### 深度研究功能 + +深度研究透過多輪研究過程將儲存庫分析提升到新水平: + +- **深入調查**:透過多次研究迭代徹底探索複雜主題 +- **結構化過程**:遵循清晰的研究計畫,包含更新和全面結論 +- **自動繼續**:AI 自動繼續研究直到達成結論(最多 5 次迭代) +- **研究階段**: + 1. **研究計畫**:概述方法和初步發現 + 2. **研究更新**:在前一輪迭代基礎上增加新見解 + 3. **最終結論**:基於所有迭代提供全面答案 + +要使用深度研究,只需在提交問題前在提問介面中切換「深度研究」開關。 + +## 📱 螢幕截圖 + +### 主頁面 +![主頁面](screenshots/home.png) + +### Wiki 頁面 +![Wiki 頁面](screenshots/wiki-page.png) + +### 提問功能 +![提問功能](screenshots/ask.png) + +### 深度研究 +![深度研究](screenshots/deep-research.png) + +### 展示影片 + +[![DeepWiki 展示影片](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*觀看 DeepWiki 實際操作!* + +## 🔧 配置選項 + +### 模型提供商 + +DeepWiki 支援多個 AI 模型提供商: + +1. **Google Gemini**(預設) + - 快速且經濟實惠 + - 良好的程式碼理解能力 + +2. **OpenAI** + - 高品質輸出 + - 支援 GPT-4 和 GPT-3.5 + +3. **OpenRouter** + - 存取多個模型 + - 靈活的定價選項 + +4. **本機 Ollama** + - 隱私保護 + - 離線執行 + - 需要本機設定 + +### Wiki 類型 + +- **全面型**:包含詳細分析、程式碼範例和完整文件 +- **簡潔型**:專注於核心功能和關鍵見解 + +## 🌍 支援的平台 + +- **GitHub**:公開和私人儲存庫 +- **GitLab**:GitLab.com 和自主託管實例 +- **Bitbucket**:Atlassian 託管的儲存庫 + +## 📚 API 端點 + +### `/api/wiki_cache` +- **方法**:GET +- **描述**:檢索快取的 Wiki 資料 +- **參數**: + - `repo`: 儲存庫識別符 + - `platform`: git 平台(github、gitlab、bitbucket) + +### `/export/wiki` +- **方法**:GET +- **描述**:匯出 Wiki 為 Markdown 或 JSON +- **參數**: + - `repo`: 儲存庫識別符 + - `format`: 匯出格式(markdown、json) + +## ❓ 故障排除 + +### API 金鑰問題 +- **「缺少環境變數」**:確保您的 `.env` 檔案位於專案根目錄並包含所需的 API 金鑰 +- **「API 金鑰無效」**:檢查您是否正確複製了完整金鑰,沒有多餘空格 +- **「OpenRouter API 錯誤」**:驗證您的 OpenRouter API 金鑰有效且有足夠的額度 + +### 連線問題 +- **「無法連線到 API 伺服器」**:確保 API 伺服器在連接埠 8001 上執行 +- **「CORS 錯誤」**:API 設定為允許所有來源,但如果您遇到問題,請嘗試在同一台機器上執行前端和後端 + +### 產生問題 +- **「產生 Wiki 時出錯」**:對於非常大的儲存庫,請先嘗試較小的儲存庫 +- **「無效的儲存庫格式」**:確保您使用有效的 GitHub、GitLab 或 Bitbucket URL 格式 +- **「無法擷取儲存庫結構」**:對於私人儲存庫,確保您輸入了具有適當權限的有效個人存取權杖 +- **「圖表轉譯錯誤」**:應用程式將自動嘗試修復損壞的圖表 + +### 常見解決方案 +1. **重新啟動兩個伺服器**:有時簡單的重新啟動可以解決大多數問題 +2. **檢查主控台日誌**:開啟瀏覽器開發者工具查看任何 JavaScript 錯誤 +3. **檢查 API 日誌**:查看執行 API 的終端中的 Python 錯誤 + +## 🤝 貢獻 + +我們歡迎各種形式的貢獻!無論是錯誤報告、功能請求還是程式碼貢獻。 + +### 開發設定 + +1. Fork 此儲存庫 +2. 建立功能分支:`git checkout -b feature/amazing-feature` +3. 提交您的變更:`git commit -m 'Add amazing feature'` +4. 推送到分支:`git push origin feature/amazing-feature` +5. 開啟 Pull Request + +### 新增新語言支援 + +1. 在 `src/messages/` 中新增新的翻譯檔案 +2. 更新 `src/i18n.ts` 中的 `locales` 陣列 +3. 建立相對應的 README 檔案 +4. 測試翻譯 + +## 📄 授權 + +此專案根據 MIT 授權條款授權 - 詳情請參閱 [LICENSE](LICENSE) 檔案。 + +## 🙏 致謝 + +- 感謝所有貢獻者的努力 +- 基於 Next.js、FastAPI 和各種開源程式庫建構 +- 特別感謝 AI 模型提供商讓此專案成為可能 + +## 🐛 問題回報 + +如果您遇到任何問題,請在 GitHub Issues 中建立問題報告。請包含: + +- 錯誤描述 +- 重現步驟 +- 預期行為 +- 螢幕截圖(如果適用) +- 系統資訊 + +## 🔮 未來計劃 + +- [ ] 更多 AI 模型整合 +- [ ] 進階程式碼分析功能 +- [ ] 即時協作編輯 +- [ ] 行動應用支援 +- [ ] 企業級功能 + +## ⭐ Star 歷史 + +[![Star 歷史圖表](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) diff --git a/reference-deepwiki/deepwiki-open-main/README.zh.md b/reference-deepwiki/deepwiki-open-main/README.zh.md new file mode 100644 index 0000000..e05ce05 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/README.zh.md @@ -0,0 +1,385 @@ +# DeepWiki-Open + +![DeepWiki 横幅](screenshots/Deepwiki.png) + +**DeepWiki**可以为任何GitHub、GitLab或BitBucket代码仓库自动创建美观、交互式的Wiki!只需输入仓库名称,DeepWiki将: + +1. 分析代码结构 +2. 生成全面的文档 +3. 创建可视化图表解释一切如何运作 +4. 将所有内容整理成易于导航的Wiki + +[!["Buy Me A Coffee"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://buymeacoffee.com/sheing) + +[![Twitter/X](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge&logo=twitter&logoColor=white)](https://x.com/sashimikun_void) +[![Discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white)](https://discord.com/invite/VQMBGR8u5v) + +[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md) + +## ✨ 特点 + +- **即时文档**:几秒钟内将任何GitHub、GitLab或BitBucket仓库转换为Wiki +- **私有仓库支持**:使用个人访问令牌安全访问私有仓库 +- **智能分析**:AI驱动的代码结构和关系理解 +- **精美图表**:自动生成Mermaid图表可视化架构和数据流 +- **简易导航**:简单、直观的界面探索Wiki +- **提问功能**:使用RAG驱动的AI与您的仓库聊天,获取准确答案 +- **深度研究**:多轮研究过程,彻底调查复杂主题 +- **多模型提供商**:支持Google Gemini、OpenAI、OpenRouter和本地Ollama模型 + +## 🚀 快速开始(超级简单!) + +### 选项1:使用Docker + +```bash +# 克隆仓库 +git clone https://github.com/AsyncFuncAI/deepwiki-open.git +cd deepwiki-open + +# 创建包含API密钥的.env文件 +echo "GOOGLE_API_KEY=your_google_api_key" > .env +echo "OPENAI_API_KEY=your_openai_api_key" >> .env +# 可选:如果您想使用OpenRouter模型,添加OpenRouter API密钥 +echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env + +# 使用Docker Compose运行 +docker-compose up +``` + +(上述 Docker 命令以及 `docker-compose.yml` 配置会挂载您主机上的 `~/.adalflow` 目录到容器内的 `/root/.adalflow`。此路径用于存储: +- 克隆的仓库 (`~/.adalflow/repos/`) +- 仓库的嵌入和索引 (`~/.adalflow/databases/`) +- 缓存的已生成 Wiki 内容 (`~/.adalflow/wikicache/`) + +这确保了即使容器停止或移除,您的数据也能持久保存。) + +> 💡 **获取这些密钥的地方:** +> - 从[Google AI Studio](https://makersuite.google.com/app/apikey)获取Google API密钥 +> - 从[OpenAI Platform](https://platform.openai.com/api-keys)获取OpenAI API密钥 + +### 选项2:手动设置(推荐) + +#### 步骤1:设置API密钥 + +在项目根目录创建一个`.env`文件,包含以下密钥: + +``` +GOOGLE_API_KEY=your_google_api_key +OPENAI_API_KEY=your_openai_api_key +# 可选:如果您想使用OpenRouter模型,添加此项 +OPENROUTER_API_KEY=your_openrouter_api_key +``` + +#### 步骤2:启动后端 + +```bash +# 安装Python依赖 +pip install -r api/requirements.txt + +# 启动API服务器 +python -m api.main +``` + +#### 步骤3:启动前端 + +```bash +# 安装JavaScript依赖 +npm install +# 或 +yarn install + +# 启动Web应用 +npm run dev +# 或 +yarn dev +``` + +#### 步骤4:使用DeepWiki! + +1. 在浏览器中打开[http://localhost:3000](http://localhost:3000) +2. 输入GitHub、GitLab或Bitbucket仓库(如`https://github.com/openai/codex`、`https://github.com/microsoft/autogen`、`https://gitlab.com/gitlab-org/gitlab`或`https://bitbucket.org/redradish/atlassian_app_versions`) +3. 对于私有仓库,点击"+ 添加访问令牌"并输入您的GitHub或GitLab个人访问令牌 +4. 点击"生成Wiki",见证奇迹的发生! + +## 🔍 工作原理 + +DeepWiki使用AI来: + +1. 克隆并分析GitHub、GitLab或Bitbucket仓库(包括使用令牌认证的私有仓库) +2. 创建代码嵌入用于智能检索 +3. 使用上下文感知AI生成文档(使用Google Gemini、OpenAI、OpenRouter或本地Ollama模型) +4. 创建可视化图表解释代码关系 +5. 将所有内容组织成结构化Wiki +6. 通过提问功能实现与仓库的智能问答 +7. 通过深度研究功能提供深入研究能力 + +```mermaid +graph TD + A[用户输入GitHub/GitLab/Bitbucket仓库] --> AA{私有仓库?} + AA -->|是| AB[添加访问令牌] + AA -->|否| B[克隆仓库] + AB --> B + B --> C[分析代码结构] + C --> D[创建代码嵌入] + + D --> M{选择模型提供商} + M -->|Google Gemini| E1[使用Gemini生成] + M -->|OpenAI| E2[使用OpenAI生成] + M -->|OpenRouter| E3[使用OpenRouter生成] + M -->|本地Ollama| E4[使用Ollama生成] + + E1 --> E[生成文档] + E2 --> E + E3 --> E + E4 --> E + + D --> F[创建可视化图表] + E --> G[组织为Wiki] + F --> G + G --> H[交互式DeepWiki] + + classDef process stroke-width:2px; + classDef data stroke-width:2px; + classDef result stroke-width:2px; + classDef decision stroke-width:2px; + + class A,D data; + class AA,M decision; + class B,C,E,F,G,AB,E1,E2,E3,E4 process; + class H result; +``` + +## 🛠️ 项目结构 + +``` +deepwiki/ +├── api/ # 后端API服务器 +│ ├── main.py # API入口点 +│ ├── api.py # FastAPI实现 +│ ├── rag.py # 检索增强生成 +│ ├── data_pipeline.py # 数据处理工具 +│ └── requirements.txt # Python依赖 +│ +├── src/ # 前端Next.js应用 +│ ├── app/ # Next.js应用目录 +│ │ └── page.tsx # 主应用页面 +│ └── components/ # React组件 +│ └── Mermaid.tsx # Mermaid图表渲染器 +│ +├── public/ # 静态资源 +├── package.json # JavaScript依赖 +└── .env # 环境变量(需要创建) +``` + +## 🤖 提问和深度研究功能 + +### 提问功能 + +提问功能允许您使用检索增强生成(RAG)与您的仓库聊天: + +- **上下文感知响应**:基于仓库中实际代码获取准确答案 +- **RAG驱动**:系统检索相关代码片段,提供有根据的响应 +- **实时流式传输**:实时查看生成的响应,获得更交互式的体验 +- **对话历史**:系统在问题之间保持上下文,实现更连贯的交互 + +### 深度研究功能 + +深度研究通过多轮研究过程将仓库分析提升到新水平: + +- **深入调查**:通过多次研究迭代彻底探索复杂主题 +- **结构化过程**:遵循清晰的研究计划,包含更新和全面结论 +- **自动继续**:AI自动继续研究直到达成结论(最多5次迭代) +- **研究阶段**: + 1. **研究计划**:概述方法和初步发现 + 2. **研究更新**:在前一轮迭代基础上增加新见解 + 3. **最终结论**:基于所有迭代提供全面答案 + +要使用深度研究,只需在提交问题前在提问界面中切换"深度研究"开关。 + +## 📱 截图 + +![DeepWiki主界面](screenshots/Interface.png) +*DeepWiki的主界面* + +![私有仓库支持](screenshots/privaterepo.png) +*使用个人访问令牌访问私有仓库* + +![深度研究功能](screenshots/DeepResearch.png) +*深度研究为复杂主题进行多轮调查* + +### 演示视频 + +[![DeepWiki演示视频](https://img.youtube.com/vi/zGANs8US8B4/0.jpg)](https://youtu.be/zGANs8US8B4) + +*观看DeepWiki实际操作!* + +## ❓ 故障排除 + +### API密钥问题 +- **"缺少环境变量"**:确保您的`.env`文件位于项目根目录并包含所需的API密钥 +- **"API密钥无效"**:检查您是否正确复制了完整密钥,没有多余空格 +- **"OpenRouter API错误"**:验证您的OpenRouter API密钥有效且有足够的额度 + +### 连接问题 +- **"无法连接到API服务器"**:确保API服务器在端口8001上运行 +- **"CORS错误"**:API配置为允许所有来源,但如果您遇到问题,请尝试在同一台机器上运行前端和后端 + +### 生成问题 +- **"生成Wiki时出错"**:对于非常大的仓库,请先尝试较小的仓库 +- **"无效的仓库格式"**:确保您使用有效的GitHub、GitLab或Bitbucket URL格式 +- **"无法获取仓库结构"**:对于私有仓库,确保您输入了具有适当权限的有效个人访问令牌 +- **"图表渲染错误"**:应用程序将自动尝试修复损坏的图表 + +### 常见解决方案 +1. **重启两个服务器**:有时简单的重启可以解决大多数问题 +2. **检查控制台日志**:打开浏览器开发者工具查看任何JavaScript错误 +3. **检查API日志**:查看运行API的终端中的Python错误 + +## 🤝 贡献 + +欢迎贡献!随时: +- 为bug或功能请求开issue +- 提交pull request改进代码 +- 分享您的反馈和想法 + +## 📄 许可证 + +本项目根据MIT许可证授权 - 详情请参阅[LICENSE](LICENSE)文件。 + +## ⭐ 星标历史 + +[![星标历史图表](https://api.star-history.com/svg?repos=AsyncFuncAI/deepwiki-open&type=Date)](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date) + +## 🤖 基于提供者的模型选择系统 + +DeepWiki 现在实现了灵活的基于提供者的模型选择系统,支持多种 LLM 提供商: + +### 支持的提供商和模型 + +- **Google**: 默认使用 `gemini-2.5-flash`,还支持 `gemini-2.5-flash-lite`、`gemini-2.5-pro` 等 +- **OpenAI**: 默认使用 `gpt-5-nano`,还支持 `gpt-5`, `4o` 等 +- **OpenRouter**: 通过统一 API 访问多种模型,包括 Claude、Llama、Mistral 等 +- **Ollama**: 支持本地运行的开源模型,如 `llama3` + +### 环境变量 + +每个提供商需要相应的 API 密钥环境变量: + +``` +# API 密钥 +GOOGLE_API_KEY=你的谷歌API密钥 # 使用 Google Gemini 模型必需 +OPENAI_API_KEY=你的OpenAI密钥 # 使用 OpenAI 模型必需 +OPENROUTER_API_KEY=你的OpenRouter密钥 # 使用 OpenRouter 模型必需 + +# OpenAI API 基础 URL 配置 +OPENAI_BASE_URL=https://自定义API端点.com/v1 # 可选,用于自定义 OpenAI API 端点 +``` + +### 为服务提供者设计的自定义模型选择 + +自定义模型选择功能专为需要以下功能的服务提供者设计: + +- 您可在您的组织内部为用户提供多种 AI 模型选择 +- 您无需代码更改即可快速适应快速发展的 LLM 领域 +- 您可支持预定义列表中没有的专业或微调模型 + +使用者可以通过从服务提供者预定义选项中选择或在前端界面中输入自定义模型标识符来实现其模型产品。 + +### 为企业私有渠道设计的基础 URL 配置 + +OpenAI 客户端的 base_url 配置主要为拥有私有 API 渠道的企业用户设计。此功能: + +- 支持连接到私有或企业特定的 API 端点 +- 允许组织使用自己的自托管或自定义部署的 LLM 服务 +- 支持与第三方 OpenAI API 兼容服务的集成 + +**即将推出**:在未来的更新中,DeepWiki 将支持一种模式,用户需要在请求中提供自己的 API 密钥。这将允许拥有私有渠道的企业客户使用其现有的 API 安排,而不是与 DeepWiki 部署共享凭据。 + +### 环境变量 + +每个提供商需要其相应的API密钥环境变量: + +``` +# API密钥 +GOOGLE_API_KEY=your_google_api_key # Google Gemini模型必需 +OPENAI_API_KEY=your_openai_api_key # OpenAI模型必需 +OPENROUTER_API_KEY=your_openrouter_api_key # OpenRouter模型必需 + +# OpenAI API基础URL配置 +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # 可选,用于自定义OpenAI API端点 + +# 配置目录 +DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # 可选,用于自定义配置文件位置 + +# 授权模式 +DEEPWIKI_AUTH_MODE=true # 设置为 true 或 1 以启用授权模式 +DEEPWIKI_AUTH_CODE=your_secret_code # 当 DEEPWIKI_AUTH_MODE 启用时所需的授权码 +``` +如果不使用ollama模式,那么需要配置OpenAI API密钥用于embeddings。其他密钥只有配置并使用使用对应提供商的模型时才需要。 + +## 授权模式 + +DeepWiki 可以配置为在授权模式下运行,在该模式下,生成 Wiki 需要有效的授权码。如果您想控制谁可以使用生成功能,这将非常有用。 +限制使用前端页面生成wiki并保护已生成页面的缓存删除,但无法完全阻止直接访问 API 端点生成wiki。主要目的是为了保护管理员已生成的wiki页面,防止被访问者重新生成。 + +要启用授权模式,请设置以下环境变量: + +- `DEEPWIKI_AUTH_MODE`: 将此设置为 `true` 或 `1`。启用后,前端将显示一个用于输入授权码的字段。 +- `DEEPWIKI_AUTH_CODE`: 将此设置为所需的密钥。限制使用前端页面生成wiki并保护已生成页面的缓存删除,但无法完全阻止直接访问 API 端点生成wiki。 + +如果未设置 `DEEPWIKI_AUTH_MODE` 或将其设置为 `false`(或除 `true`/`1` 之外的任何其他值),则授权功能将被禁用,并且不需要任何代码。 + +### 配置文件 + +DeepWiki使用JSON配置文件管理系统的各个方面: + +1. **`generator.json`**:文本生成模型配置 + - 定义可用的模型提供商(Google、OpenAI、OpenRouter、Ollama) + - 指定每个提供商的默认和可用模型 + - 包含特定模型的参数,如temperature和top_p + +2. **`embedder.json`**:嵌入模型和文本处理配置 + - 定义用于向量存储的嵌入模型 + - 包含用于RAG的检索器配置 + - 指定文档分块的文本分割器设置 + +3. **`repo.json`**:仓库处理配置 + - 包含排除特定文件和目录的文件过滤器 + - 定义仓库大小限制和处理规则 + +默认情况下,这些文件位于`api/config/`目录中。您可以使用`DEEPWIKI_CONFIG_DIR`环境变量自定义它们的位置。 + +### 面向服务提供商的自定义模型选择 + +自定义模型选择功能专为需要以下功能的服务提供者设计: + +- 您可在您的组织内部为用户提供多种 AI 模型选择 +- 您无需代码更改即可快速适应快速发展的 LLM 领域 +- 您可支持预定义列表中没有的专业或微调模型 + +使用者可以通过从服务提供者预定义选项中选择或在前端界面中输入自定义模型标识符来实现其模型产品。 + +### 为企业私有渠道设计的基础 URL 配置 + +OpenAI 客户端的 base_url 配置主要为拥有私有 API 渠道的企业用户设计。此功能: + +- 支持连接到私有或企业特定的 API 端点 +- 允许组织使用自己的自托管或自定义部署的 LLM 服务 +- 支持与第三方 OpenAI API 兼容服务的集成 + +**即将推出**:在未来的更新中,DeepWiki 将支持一种模式,用户需要在请求中提供自己的 API 密钥。这将允许拥有私有渠道的企业客户使用其现有的 API 安排,而不是与 DeepWiki 部署共享凭据。 + +## 🧩 使用 OpenAI 兼容的 Embedding 模型(如阿里巴巴 Qwen) + +如果你希望使用 OpenAI 以外、但兼容 OpenAI 接口的 embedding 模型(如阿里巴巴 Qwen),请参考以下步骤: + +1. 用 `api/config/embedder_openai_compatible.json` 的内容替换 `api/config/embedder.json`。 +2. 在项目根目录的 `.env` 文件中,配置相应的环境变量,例如: + ``` + OPENAI_API_KEY=你的_api_key + OPENAI_BASE_URL=你的_openai_兼容接口地址 + ``` +3. 程序会自动用环境变量的值替换 embedder.json 里的占位符。 + +这样即可无缝切换到 OpenAI 兼容的 embedding 服务,无需修改代码。 + diff --git a/reference-deepwiki/deepwiki-open-main/api/README.md b/reference-deepwiki/deepwiki-open-main/api/README.md new file mode 100644 index 0000000..4e09fb3 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/README.md @@ -0,0 +1,199 @@ +# 🚀 DeepWiki API + +This is the backend API for DeepWiki, providing smart code analysis and AI-powered documentation generation. + +## ✨ Features + +- **Streaming AI Responses**: Real-time responses using Google's Generative AI (Gemini) +- **Smart Code Analysis**: Automatically analyzes GitHub repositories +- **RAG Implementation**: Retrieval Augmented Generation for context-aware responses +- **Local Storage**: All data stored locally - no cloud dependencies +- **Conversation History**: Maintains context across multiple questions + +## 🔧 Quick Setup + +### Step 1: Install Dependencies + +```bash +# From the project root +pip install -r api/requirements.txt +``` + +### Step 2: Set Up Environment Variables + +Create a `.env` file in the project root: + +``` +# Required API Keys +GOOGLE_API_KEY=your_google_api_key # Required for Google Gemini models +OPENAI_API_KEY=your_openai_api_key # Required for embeddings and OpenAI models + +# Optional API Keys +OPENROUTER_API_KEY=your_openrouter_api_key # Required only if using OpenRouter models + +# AWS Bedrock Configuration +AWS_ACCESS_KEY_ID=your_aws_access_key_id # Required for AWS Bedrock models +AWS_SECRET_ACCESS_KEY=your_aws_secret_key # Required for AWS Bedrock models +AWS_REGION=us-east-1 # Optional, defaults to us-east-1 +AWS_ROLE_ARN=your_aws_role_arn # Optional, for role-based authentication + +# OpenAI API Configuration +OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # Optional, for custom OpenAI API endpoints + +# Ollama host +OLLAMA_HOST=https://your_ollama_host" # Optional: Add Ollama host if not local. default: http://localhost:11434 + +# Server Configuration +PORT=8001 # Optional, defaults to 8001 +``` + +If you're not using Ollama mode, you need to configure an OpenAI API key for embeddings. Other API keys are only required when configuring and using models from the corresponding providers. + +> 💡 **Where to get these keys:** +> - Get a Google API key from [Google AI Studio](https://makersuite.google.com/app/apikey) +> - Get an OpenAI API key from [OpenAI Platform](https://platform.openai.com/api-keys) +> - Get an OpenRouter API key from [OpenRouter](https://openrouter.ai/keys) +> - Get AWS credentials from [AWS IAM Console](https://console.aws.amazon.com/iam/) + +#### Advanced Environment Configuration + +##### Provider-Based Model Selection +DeepWiki supports multiple LLM providers. The environment variables above are required depending on which providers you want to use: + +- **Google Gemini**: Requires `GOOGLE_API_KEY` +- **OpenAI**: Requires `OPENAI_API_KEY` +- **OpenRouter**: Requires `OPENROUTER_API_KEY` +- **AWS Bedrock**: Requires `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` +- **Ollama**: No API key required (runs locally) + +##### Custom OpenAI API Endpoints +The `OPENAI_BASE_URL` variable allows you to specify a custom endpoint for the OpenAI API. This is useful for: + +- Enterprise users with private API channels +- Organizations using self-hosted or custom-deployed LLM services +- Integration with third-party OpenAI API-compatible services + +**Example:** you can use the endpoint which support the OpenAI protocol provided by any organization +``` +OPENAI_BASE_URL=https://custom-openai-endpoint.com/v1 +``` + +##### Configuration Files +DeepWiki now uses JSON configuration files to manage various system components instead of hardcoded values: + +1. **`generator.json`**: Configuration for text generation models + - Located in `api/config/` by default + - Defines available model providers (Google, OpenAI, OpenRouter, AWS Bedrock, Ollama) + - Specifies default and available models for each provider + - Contains model-specific parameters like temperature and top_p + +2. **`embedder.json`**: Configuration for embedding models and text processing + - Located in `api/config/` by default + - Defines embedding models for vector storage + - Contains retriever configuration for RAG + - Specifies text splitter settings for document chunking + +3. **`repo.json`**: Configuration for repository handling + - Located in `api/config/` by default + - Contains file filters to exclude certain files and directories + - Defines repository size limits and processing rules + +You can customize the configuration directory location using the environment variable: + +``` +DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # Optional, for custom config file location +``` + +This allows you to maintain different configurations for various environments or deployment scenarios without modifying the code. + +### Step 3: Start the API Server + +```bash +# From the project root +python -m api.main +``` + +The API will be available at `http://localhost:8001` + +## 🧠 How It Works + +### 1. Repository Indexing +When you provide a GitHub repository URL, the API: +- Clones the repository locally (if not already cloned) +- Reads all files in the repository +- Creates embeddings for the files using OpenAI +- Stores the embeddings in a local database + +### 2. Smart Retrieval (RAG) +When you ask a question: +- The API finds the most relevant code snippets +- These snippets are used as context for the AI +- The AI generates a response based on this context + +### 3. Real-Time Streaming +- Responses are streamed in real-time +- You see the answer as it's being generated +- This creates a more interactive experience + +## 📡 API Endpoints + +### GET / +Returns basic API information and available endpoints. + +### POST /chat/completions/stream +Streams an AI-generated response about a GitHub repository. + +**Request Body:** + +```json +{ + "repo_url": "https://github.com/username/repo", + "messages": [ + { + "role": "user", + "content": "What does this repository do?" + } + ], + "filePath": "optional/path/to/file.py" // Optional +} +``` + +**Response:** +A streaming response with the generated text. + +## 📝 Example Code + +```python +import requests + +# API endpoint +url = "http://localhost:8001/chat/completions/stream" + +# Request data +payload = { + "repo_url": "https://github.com/AsyncFuncAI/deepwiki-open", + "messages": [ + { + "role": "user", + "content": "Explain how React components work" + } + ] +} + +# Make streaming request +response = requests.post(url, json=payload, stream=True) + +# Process the streaming response +for chunk in response.iter_content(chunk_size=None): + if chunk: + print(chunk.decode('utf-8'), end='', flush=True) +``` + +## 💾 Storage + +All data is stored locally on your machine: +- Cloned repositories: `~/.adalflow/repos/` +- Embeddings and indexes: `~/.adalflow/databases/` +- Generated wiki cache: `~/.adalflow/wikicache/` + +No cloud storage is used - everything runs on your computer! diff --git a/reference-deepwiki/deepwiki-open-main/api/__init__.py b/reference-deepwiki/deepwiki-open-main/api/__init__.py new file mode 100644 index 0000000..3660b8d --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/__init__.py @@ -0,0 +1,3 @@ +# Make the api package importable + +# api package diff --git a/reference-deepwiki/deepwiki-open-main/api/api.py b/reference-deepwiki/deepwiki-open-main/api/api.py new file mode 100644 index 0000000..d40e73f --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/api.py @@ -0,0 +1,634 @@ +import os +import logging +from fastapi import FastAPI, HTTPException, Query, Request, WebSocket +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse, Response +from typing import List, Optional, Dict, Any, Literal +import json +from datetime import datetime +from pydantic import BaseModel, Field +import google.generativeai as genai +import asyncio + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +logger = logging.getLogger(__name__) + + +# Initialize FastAPI app +app = FastAPI( + title="Streaming API", + description="API for streaming chat completions" +) + +# Configure CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Allows all origins + allow_credentials=True, + allow_methods=["*"], # Allows all methods + allow_headers=["*"], # Allows all headers +) + +# Helper function to get adalflow root path +def get_adalflow_default_root_path(): + return os.path.expanduser(os.path.join("~", ".adalflow")) + +# --- Pydantic Models --- +class WikiPage(BaseModel): + """ + Model for a wiki page. + """ + id: str + title: str + content: str + filePaths: List[str] + importance: str # Should ideally be Literal['high', 'medium', 'low'] + relatedPages: List[str] + +class ProcessedProjectEntry(BaseModel): + id: str # Filename + owner: str + repo: str + name: str # owner/repo + repo_type: str # Renamed from type to repo_type for clarity with existing models + submittedAt: int # Timestamp + language: str # Extracted from filename + +class RepoInfo(BaseModel): + owner: str + repo: str + type: str + token: Optional[str] = None + localPath: Optional[str] = None + repoUrl: Optional[str] = None + + +class WikiSection(BaseModel): + """ + Model for the wiki sections. + """ + id: str + title: str + pages: List[str] + subsections: Optional[List[str]] = None + + +class WikiStructureModel(BaseModel): + """ + Model for the overall wiki structure. + """ + id: str + title: str + description: str + pages: List[WikiPage] + sections: Optional[List[WikiSection]] = None + rootSections: Optional[List[str]] = None + +class WikiCacheData(BaseModel): + """ + Model for the data to be stored in the wiki cache. + """ + wiki_structure: WikiStructureModel + generated_pages: Dict[str, WikiPage] + repo_url: Optional[str] = None #compatible for old cache + repo: Optional[RepoInfo] = None + provider: Optional[str] = None + model: Optional[str] = None + +class WikiCacheRequest(BaseModel): + """ + Model for the request body when saving wiki cache. + """ + repo: RepoInfo + language: str + wiki_structure: WikiStructureModel + generated_pages: Dict[str, WikiPage] + provider: str + model: str + +class WikiExportRequest(BaseModel): + """ + Model for requesting a wiki export. + """ + repo_url: str = Field(..., description="URL of the repository") + pages: List[WikiPage] = Field(..., description="List of wiki pages to export") + format: Literal["markdown", "json"] = Field(..., description="Export format (markdown or json)") + +# --- Model Configuration Models --- +class Model(BaseModel): + """ + Model for LLM model configuration + """ + id: str = Field(..., description="Model identifier") + name: str = Field(..., description="Display name for the model") + +class Provider(BaseModel): + """ + Model for LLM provider configuration + """ + id: str = Field(..., description="Provider identifier") + name: str = Field(..., description="Display name for the provider") + models: List[Model] = Field(..., description="List of available models for this provider") + supportsCustomModel: Optional[bool] = Field(False, description="Whether this provider supports custom models") + +class ModelConfig(BaseModel): + """ + Model for the entire model configuration + """ + providers: List[Provider] = Field(..., description="List of available model providers") + defaultProvider: str = Field(..., description="ID of the default provider") + +class AuthorizationConfig(BaseModel): + code: str = Field(..., description="Authorization code") + +from api.config import configs, WIKI_AUTH_MODE, WIKI_AUTH_CODE + +@app.get("/lang/config") +async def get_lang_config(): + return configs["lang_config"] + +@app.get("/auth/status") +async def get_auth_status(): + """ + Check if authentication is required for the wiki. + """ + return {"auth_required": WIKI_AUTH_MODE} + +@app.post("/auth/validate") +async def validate_auth_code(request: AuthorizationConfig): + """ + Check authorization code. + """ + return {"success": WIKI_AUTH_CODE == request.code} + +@app.get("/models/config", response_model=ModelConfig) +async def get_model_config(): + """ + Get available model providers and their models. + + This endpoint returns the configuration of available model providers and their + respective models that can be used throughout the application. + + Returns: + ModelConfig: A configuration object containing providers and their models + """ + try: + logger.info("Fetching model configurations") + + # Create providers from the config file + providers = [] + default_provider = configs.get("default_provider", "google") + + # Add provider configuration based on config.py + for provider_id, provider_config in configs["providers"].items(): + models = [] + # Add models from config + for model_id in provider_config["models"].keys(): + # Get a more user-friendly display name if possible + models.append(Model(id=model_id, name=model_id)) + + # Add provider with its models + providers.append( + Provider( + id=provider_id, + name=f"{provider_id.capitalize()}", + supportsCustomModel=provider_config.get("supportsCustomModel", False), + models=models + ) + ) + + # Create and return the full configuration + config = ModelConfig( + providers=providers, + defaultProvider=default_provider + ) + return config + + except Exception as e: + logger.error(f"Error creating model configuration: {str(e)}") + # Return some default configuration in case of error + return ModelConfig( + providers=[ + Provider( + id="google", + name="Google", + supportsCustomModel=True, + models=[ + Model(id="gemini-2.5-flash", name="Gemini 2.5 Flash") + ] + ) + ], + defaultProvider="google" + ) + +@app.post("/export/wiki") +async def export_wiki(request: WikiExportRequest): + """ + Export wiki content as Markdown or JSON. + + Args: + request: The export request containing wiki pages and format + + Returns: + A downloadable file in the requested format + """ + try: + logger.info(f"Exporting wiki for {request.repo_url} in {request.format} format") + + # Extract repository name from URL for the filename + repo_parts = request.repo_url.rstrip('/').split('/') + repo_name = repo_parts[-1] if len(repo_parts) > 0 else "wiki" + + # Get current timestamp for the filename + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + + if request.format == "markdown": + # Generate Markdown content + content = generate_markdown_export(request.repo_url, request.pages) + filename = f"{repo_name}_wiki_{timestamp}.md" + media_type = "text/markdown" + else: # JSON format + # Generate JSON content + content = generate_json_export(request.repo_url, request.pages) + filename = f"{repo_name}_wiki_{timestamp}.json" + media_type = "application/json" + + # Create response with appropriate headers for file download + response = Response( + content=content, + media_type=media_type, + headers={ + "Content-Disposition": f"attachment; filename={filename}" + } + ) + + return response + + except Exception as e: + error_msg = f"Error exporting wiki: {str(e)}" + logger.error(error_msg) + raise HTTPException(status_code=500, detail=error_msg) + +@app.get("/local_repo/structure") +async def get_local_repo_structure(path: str = Query(None, description="Path to local repository")): + """Return the file tree and README content for a local repository.""" + if not path: + return JSONResponse( + status_code=400, + content={"error": "No path provided. Please provide a 'path' query parameter."} + ) + + if not os.path.isdir(path): + return JSONResponse( + status_code=404, + content={"error": f"Directory not found: {path}"} + ) + + try: + logger.info(f"Processing local repository at: {path}") + file_tree_lines = [] + readme_content = "" + + for root, dirs, files in os.walk(path): + # Exclude hidden dirs/files and virtual envs + dirs[:] = [d for d in dirs if not d.startswith('.') and d != '__pycache__' and d != 'node_modules' and d != '.venv'] + for file in files: + if file.startswith('.') or file == '__init__.py' or file == '.DS_Store': + continue + rel_dir = os.path.relpath(root, path) + rel_file = os.path.join(rel_dir, file) if rel_dir != '.' else file + file_tree_lines.append(rel_file) + # Find README.md (case-insensitive) + if file.lower() == 'readme.md' and not readme_content: + try: + with open(os.path.join(root, file), 'r', encoding='utf-8') as f: + readme_content = f.read() + except Exception as e: + logger.warning(f"Could not read README.md: {str(e)}") + readme_content = "" + + file_tree_str = '\n'.join(sorted(file_tree_lines)) + return {"file_tree": file_tree_str, "readme": readme_content} + except Exception as e: + logger.error(f"Error processing local repository: {str(e)}") + return JSONResponse( + status_code=500, + content={"error": f"Error processing local repository: {str(e)}"} + ) + +def generate_markdown_export(repo_url: str, pages: List[WikiPage]) -> str: + """ + Generate Markdown export of wiki pages. + + Args: + repo_url: The repository URL + pages: List of wiki pages + + Returns: + Markdown content as string + """ + # Start with metadata + markdown = f"# Wiki Documentation for {repo_url}\n\n" + markdown += f"Generated on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" + + # Add table of contents + markdown += "## Table of Contents\n\n" + for page in pages: + markdown += f"- [{page.title}](#{page.id})\n" + markdown += "\n" + + # Add each page + for page in pages: + markdown += f"\n\n" + markdown += f"## {page.title}\n\n" + + + + # Add related pages + if page.relatedPages and len(page.relatedPages) > 0: + markdown += "### Related Pages\n\n" + related_titles = [] + for related_id in page.relatedPages: + # Find the title of the related page + related_page = next((p for p in pages if p.id == related_id), None) + if related_page: + related_titles.append(f"[{related_page.title}](#{related_id})") + + if related_titles: + markdown += "Related topics: " + ", ".join(related_titles) + "\n\n" + + # Add page content + markdown += f"{page.content}\n\n" + markdown += "---\n\n" + + return markdown + +def generate_json_export(repo_url: str, pages: List[WikiPage]) -> str: + """ + Generate JSON export of wiki pages. + + Args: + repo_url: The repository URL + pages: List of wiki pages + + Returns: + JSON content as string + """ + # Create a dictionary with metadata and pages + export_data = { + "metadata": { + "repository": repo_url, + "generated_at": datetime.now().isoformat(), + "page_count": len(pages) + }, + "pages": [page.model_dump() for page in pages] + } + + # Convert to JSON string with pretty formatting + return json.dumps(export_data, indent=2) + +# Import the simplified chat implementation +from api.simple_chat import chat_completions_stream +from api.websocket_wiki import handle_websocket_chat + +# Add the chat_completions_stream endpoint to the main app +app.add_api_route("/chat/completions/stream", chat_completions_stream, methods=["POST"]) + +# Add the WebSocket endpoint +app.add_websocket_route("/ws/chat", handle_websocket_chat) + +# --- Wiki Cache Helper Functions --- + +WIKI_CACHE_DIR = os.path.join(get_adalflow_default_root_path(), "wikicache") +os.makedirs(WIKI_CACHE_DIR, exist_ok=True) + +def get_wiki_cache_path(owner: str, repo: str, repo_type: str, language: str) -> str: + """Generates the file path for a given wiki cache.""" + filename = f"deepwiki_cache_{repo_type}_{owner}_{repo}_{language}.json" + return os.path.join(WIKI_CACHE_DIR, filename) + +async def read_wiki_cache(owner: str, repo: str, repo_type: str, language: str) -> Optional[WikiCacheData]: + """Reads wiki cache data from the file system.""" + cache_path = get_wiki_cache_path(owner, repo, repo_type, language) + if os.path.exists(cache_path): + try: + with open(cache_path, 'r', encoding='utf-8') as f: + data = json.load(f) + return WikiCacheData(**data) + except Exception as e: + logger.error(f"Error reading wiki cache from {cache_path}: {e}") + return None + return None + +async def save_wiki_cache(data: WikiCacheRequest) -> bool: + """Saves wiki cache data to the file system.""" + cache_path = get_wiki_cache_path(data.repo.owner, data.repo.repo, data.repo.type, data.language) + logger.info(f"Attempting to save wiki cache. Path: {cache_path}") + try: + payload = WikiCacheData( + wiki_structure=data.wiki_structure, + generated_pages=data.generated_pages, + repo=data.repo, + provider=data.provider, + model=data.model + ) + # Log size of data to be cached for debugging (avoid logging full content if large) + try: + payload_json = payload.model_dump_json() + payload_size = len(payload_json.encode('utf-8')) + logger.info(f"Payload prepared for caching. Size: {payload_size} bytes.") + except Exception as ser_e: + logger.warning(f"Could not serialize payload for size logging: {ser_e}") + + + logger.info(f"Writing cache file to: {cache_path}") + with open(cache_path, 'w', encoding='utf-8') as f: + json.dump(payload.model_dump(), f, indent=2) + logger.info(f"Wiki cache successfully saved to {cache_path}") + return True + except IOError as e: + logger.error(f"IOError saving wiki cache to {cache_path}: {e.strerror} (errno: {e.errno})", exc_info=True) + return False + except Exception as e: + logger.error(f"Unexpected error saving wiki cache to {cache_path}: {e}", exc_info=True) + return False + +# --- Wiki Cache API Endpoints --- + +@app.get("/api/wiki_cache", response_model=Optional[WikiCacheData]) +async def get_cached_wiki( + owner: str = Query(..., description="Repository owner"), + repo: str = Query(..., description="Repository name"), + repo_type: str = Query(..., description="Repository type (e.g., github, gitlab)"), + language: str = Query(..., description="Language of the wiki content") +): + """ + Retrieves cached wiki data (structure and generated pages) for a repository. + """ + # Language validation + supported_langs = configs["lang_config"]["supported_languages"] + if not supported_langs.__contains__(language): + language = configs["lang_config"]["default"] + + logger.info(f"Attempting to retrieve wiki cache for {owner}/{repo} ({repo_type}), lang: {language}") + cached_data = await read_wiki_cache(owner, repo, repo_type, language) + if cached_data: + return cached_data + else: + # Return 200 with null body if not found, as frontend expects this behavior + # Or, raise HTTPException(status_code=404, detail="Wiki cache not found") if preferred + logger.info(f"Wiki cache not found for {owner}/{repo} ({repo_type}), lang: {language}") + return None + +@app.post("/api/wiki_cache") +async def store_wiki_cache(request_data: WikiCacheRequest): + """ + Stores generated wiki data (structure and pages) to the server-side cache. + """ + # Language validation + supported_langs = configs["lang_config"]["supported_languages"] + + if not supported_langs.__contains__(request_data.language): + request_data.language = configs["lang_config"]["default"] + + logger.info(f"Attempting to save wiki cache for {request_data.repo.owner}/{request_data.repo.repo} ({request_data.repo.type}), lang: {request_data.language}") + success = await save_wiki_cache(request_data) + if success: + return {"message": "Wiki cache saved successfully"} + else: + raise HTTPException(status_code=500, detail="Failed to save wiki cache") + +@app.delete("/api/wiki_cache") +async def delete_wiki_cache( + owner: str = Query(..., description="Repository owner"), + repo: str = Query(..., description="Repository name"), + repo_type: str = Query(..., description="Repository type (e.g., github, gitlab)"), + language: str = Query(..., description="Language of the wiki content"), + authorization_code: Optional[str] = Query(None, description="Authorization code") +): + """ + Deletes a specific wiki cache from the file system. + """ + # Language validation + supported_langs = configs["lang_config"]["supported_languages"] + if not supported_langs.__contains__(language): + raise HTTPException(status_code=400, detail="Language is not supported") + + if WIKI_AUTH_MODE: + logger.info("check the authorization code") + if not authorization_code or WIKI_AUTH_CODE != authorization_code: + raise HTTPException(status_code=401, detail="Authorization code is invalid") + + logger.info(f"Attempting to delete wiki cache for {owner}/{repo} ({repo_type}), lang: {language}") + cache_path = get_wiki_cache_path(owner, repo, repo_type, language) + + if os.path.exists(cache_path): + try: + os.remove(cache_path) + logger.info(f"Successfully deleted wiki cache: {cache_path}") + return {"message": f"Wiki cache for {owner}/{repo} ({language}) deleted successfully"} + except Exception as e: + logger.error(f"Error deleting wiki cache {cache_path}: {e}") + raise HTTPException(status_code=500, detail=f"Failed to delete wiki cache: {str(e)}") + else: + logger.warning(f"Wiki cache not found, cannot delete: {cache_path}") + raise HTTPException(status_code=404, detail="Wiki cache not found") + +@app.get("/health") +async def health_check(): + """Health check endpoint for Docker and monitoring""" + return { + "status": "healthy", + "timestamp": datetime.now().isoformat(), + "service": "deepwiki-api" + } + +@app.get("/") +async def root(): + """Root endpoint to check if the API is running and list available endpoints dynamically.""" + # Collect routes dynamically from the FastAPI app + endpoints = {} + for route in app.routes: + if hasattr(route, "methods") and hasattr(route, "path"): + # Skip docs and static routes + if route.path in ["/openapi.json", "/docs", "/redoc", "/favicon.ico"]: + continue + # Group endpoints by first path segment + path_parts = route.path.strip("/").split("/") + group = path_parts[0].capitalize() if path_parts[0] else "Root" + method_list = list(route.methods - {"HEAD", "OPTIONS"}) + for method in method_list: + endpoints.setdefault(group, []).append(f"{method} {route.path}") + + # Optionally, sort endpoints for readability + for group in endpoints: + endpoints[group].sort() + + return { + "message": "Welcome to Streaming API", + "version": "1.0.0", + "endpoints": endpoints + } + +# --- Processed Projects Endpoint --- (New Endpoint) +@app.get("/api/processed_projects", response_model=List[ProcessedProjectEntry]) +async def get_processed_projects(): + """ + Lists all processed projects found in the wiki cache directory. + Projects are identified by files named like: deepwiki_cache_{repo_type}_{owner}_{repo}_{language}.json + """ + project_entries: List[ProcessedProjectEntry] = [] + # WIKI_CACHE_DIR is already defined globally in the file + + try: + if not os.path.exists(WIKI_CACHE_DIR): + logger.info(f"Cache directory {WIKI_CACHE_DIR} not found. Returning empty list.") + return [] + + logger.info(f"Scanning for project cache files in: {WIKI_CACHE_DIR}") + filenames = await asyncio.to_thread(os.listdir, WIKI_CACHE_DIR) # Use asyncio.to_thread for os.listdir + + for filename in filenames: + if filename.startswith("deepwiki_cache_") and filename.endswith(".json"): + file_path = os.path.join(WIKI_CACHE_DIR, filename) + try: + stats = await asyncio.to_thread(os.stat, file_path) # Use asyncio.to_thread for os.stat + parts = filename.replace("deepwiki_cache_", "").replace(".json", "").split('_') + + # Expecting repo_type_owner_repo_language + # Example: deepwiki_cache_github_AsyncFuncAI_deepwiki-open_en.json + # parts = [github, AsyncFuncAI, deepwiki-open, en] + if len(parts) >= 4: + repo_type = parts[0] + owner = parts[1] + language = parts[-1] # language is the last part + repo = "_".join(parts[2:-1]) # repo can contain underscores + + project_entries.append( + ProcessedProjectEntry( + id=filename, + owner=owner, + repo=repo, + name=f"{owner}/{repo}", + repo_type=repo_type, + submittedAt=int(stats.st_mtime * 1000), # Convert to milliseconds + language=language + ) + ) + else: + logger.warning(f"Could not parse project details from filename: {filename}") + except Exception as e: + logger.error(f"Error processing file {file_path}: {e}") + continue # Skip this file on error + + # Sort by most recent first + project_entries.sort(key=lambda p: p.submittedAt, reverse=True) + logger.info(f"Found {len(project_entries)} processed project entries.") + return project_entries + + except Exception as e: + logger.error(f"Error listing processed projects from {WIKI_CACHE_DIR}: {e}", exc_info=True) + raise HTTPException(status_code=500, detail="Failed to list processed projects from server cache.") diff --git a/reference-deepwiki/deepwiki-open-main/api/azureai_client.py b/reference-deepwiki/deepwiki-open-main/api/azureai_client.py new file mode 100644 index 0000000..948e86c --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/azureai_client.py @@ -0,0 +1,488 @@ +"""AzureOpenAI ModelClient integration.""" + +import os +from typing import ( + Dict, + Sequence, + Optional, + List, + Any, + TypeVar, + Callable, + Generator, + Union, + Literal, +) +import re + +import logging +import backoff + +# optional import +from adalflow.utils.lazy_import import safe_import, OptionalPackages + +import sys + +openai = safe_import(OptionalPackages.OPENAI.value[0], OptionalPackages.OPENAI.value[1]) +# Importing all Azure packages together +azure_modules = safe_import( + OptionalPackages.AZURE.value[0], # List of package names + OptionalPackages.AZURE.value[1], # Error message +) +# Manually add each module to sys.modules to make them available globally as if imported normally +azure_module_names = OptionalPackages.AZURE.value[0] +for name, module in zip(azure_module_names, azure_modules): + sys.modules[name] = module + +# Use the modules as if they were imported normally +from azure.identity import DefaultAzureCredential, get_bearer_token_provider + +# from azure.core.credentials import AccessToken +from openai import AzureOpenAI, AsyncAzureOpenAI, Stream +from openai import ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, +) +from openai.types import ( + Completion, + CreateEmbeddingResponse, +) +from openai.types.chat import ChatCompletionChunk, ChatCompletion + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ( + ModelType, + EmbedderOutput, + TokenLogProb, + CompletionUsage, + GeneratorOutput, +) +from adalflow.components.model_client.utils import parse_embedding_response + +log = logging.getLogger(__name__) +T = TypeVar("T") + + +__all__ = ["AzureAIClient"] + +# TODO: this overlaps with openai client largely, might need to refactor to subclass openai client to simplify the code + + +# completion parsing functions and you can combine them into one singple chat completion parser +def get_first_message_content(completion: ChatCompletion) -> str: + r"""When we only need the content of the first message. + It is the default parser for chat completion.""" + return completion.choices[0].message.content + + +# def _get_chat_completion_usage(completion: ChatCompletion) -> OpenAICompletionUsage: +# return completion.usage + + +def parse_stream_response(completion: ChatCompletionChunk) -> str: + r"""Parse the response of the stream API.""" + return completion.choices[0].delta.content + + +def handle_streaming_response(generator: Stream[ChatCompletionChunk]): + r"""Handle the streaming response.""" + for completion in generator: + log.debug(f"Raw chunk completion: {completion}") + parsed_content = parse_stream_response(completion) + yield parsed_content + + +def get_all_messages_content(completion: ChatCompletion) -> List[str]: + r"""When the n > 1, get all the messages content.""" + return [c.message.content for c in completion.choices] + + +def get_probabilities(completion: ChatCompletion) -> List[List[TokenLogProb]]: + r"""Get the probabilities of each token in the completion.""" + log_probs = [] + for c in completion.choices: + content = c.logprobs.content + print(content) + log_probs_for_choice = [] + for openai_token_logprob in content: + token = openai_token_logprob.token + logprob = openai_token_logprob.logprob + log_probs_for_choice.append(TokenLogProb(token=token, logprob=logprob)) + log_probs.append(log_probs_for_choice) + return log_probs + + +class AzureAIClient(ModelClient): + __doc__ = r""" + A client wrapper for interacting with Azure OpenAI's API. + + This class provides support for both embedding and chat completion API calls. + Users can use this class to simplify their interactions with Azure OpenAI models + through the `Embedder` and `Generator` components. + + **Initialization:** + + You can initialize the `AzureAIClient` with either an API key or Azure Active Directory (AAD) token + authentication. It is recommended to set environment variables for sensitive data like API keys. + + Args: + api_key (Optional[str]): Azure OpenAI API key. Default is None. + api_version (Optional[str]): API version to use. Default is None. + azure_endpoint (Optional[str]): Azure OpenAI endpoint URL. Default is None. + credential (Optional[DefaultAzureCredential]): Azure AD credential for token-based authentication. Default is None. + chat_completion_parser (Callable[[Completion], Any]): Function to parse chat completions. Default is `get_first_message_content`. + input_type (Literal["text", "messages"]): Format for input, either "text" or "messages". Default is "text". + + **Setup Instructions:** + + - **Using API Key:** + Set up the following environment variables: + ```bash + export AZURE_OPENAI_API_KEY="your_api_key" + export AZURE_OPENAI_ENDPOINT="your_endpoint" + export AZURE_OPENAI_VERSION="your_version" + ``` + + - **Using Azure AD Token:** + Ensure you have configured Azure AD credentials. The `DefaultAzureCredential` will automatically use your configured credentials. + + **Example Usage:** + + .. code-block:: python + + from azure.identity import DefaultAzureCredential + from your_module import AzureAIClient # Adjust import based on your module name + + # Initialize with API key + client = AzureAIClient( + api_key="your_api_key", + api_version="2023-05-15", + azure_endpoint="https://your-endpoint.openai.azure.com/" + ) + + # Or initialize with Azure AD token + client = AzureAIClient( + api_version="2023-05-15", + azure_endpoint="https://your-endpoint.openai.azure.com/", + credential=DefaultAzureCredential() + ) + + # Example call to the chat completion API + api_kwargs = { + "model": "gpt-3.5-turbo", + "messages": [{"role": "user", "content": "What is the meaning of life?"}], + "stream": True + } + response = client.call(api_kwargs=api_kwargs, model_type=ModelType.LLM) + + for chunk in response: + print(chunk) + + + **Notes:** + - Ensure that the API key or credentials are correctly set up and accessible to avoid authentication errors. + - Use `chat_completion_parser` to define how to extract and handle the chat completion responses. + - The `input_type` parameter determines how input is formatted for the API call. + + **References:** + - [Azure OpenAI API Documentation](https://learn.microsoft.com/en-us/azure/ai-services/openai/overview) + - [OpenAI API Documentation](https://platform.openai.com/docs/guides/text-generation) + """ + + def __init__( + self, + api_key: Optional[str] = None, + api_version: Optional[str] = None, + azure_endpoint: Optional[str] = None, + credential: Optional[DefaultAzureCredential] = None, + chat_completion_parser: Callable[[Completion], Any] = None, + input_type: Literal["text", "messages"] = "text", + ): + r"""It is recommended to set the API_KEY into the environment variable instead of passing it as an argument. + + + Initializes the Azure OpenAI client with either API key or AAD token authentication. + + Args: + api_key: Azure OpenAI API key. + api_version: Azure OpenAI API version. + azure_endpoint: Azure OpenAI endpoint. + credential: Azure AD credential for token-based authentication. + chat_completion_parser: Function to parse chat completions. + input_type: Input format, either "text" or "messages". + + """ + super().__init__() + + # added api_type azure for azure Ai + self.api_type = "azure" + self._api_key = api_key + self._apiversion = api_version + self._azure_endpoint = azure_endpoint + self._credential = credential + self.sync_client = self.init_sync_client() + self.async_client = None # only initialize if the async call is called + self.chat_completion_parser = ( + chat_completion_parser or get_first_message_content + ) + self._input_type = input_type + + def init_sync_client(self): + api_key = self._api_key or os.getenv("AZURE_OPENAI_API_KEY") + azure_endpoint = self._azure_endpoint or os.getenv("AZURE_OPENAI_ENDPOINT") + api_version = self._apiversion or os.getenv("AZURE_OPENAI_VERSION") + # credential = self._credential or DefaultAzureCredential + if not azure_endpoint: + raise ValueError("Environment variable AZURE_OPENAI_ENDPOINT must be set") + if not api_version: + raise ValueError("Environment variable AZURE_OPENAI_VERSION must be set") + + if api_key: + return AzureOpenAI( + api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version + ) + elif self._credential: + # credential = DefaultAzureCredential() + token_provider = get_bearer_token_provider( + DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" + ) + return AzureOpenAI( + azure_ad_token_provider=token_provider, + azure_endpoint=azure_endpoint, + api_version=api_version, + ) + else: + raise ValueError( + "Environment variable AZURE_OPENAI_API_KEY must be set or credential must be provided" + ) + + def init_async_client(self): + api_key = self._api_key or os.getenv("AZURE_OPENAI_API_KEY") + azure_endpoint = self._azure_endpoint or os.getenv("AZURE_OPENAI_ENDPOINT") + api_version = self._apiversion or os.getenv("AZURE_OPENAI_VERSION") + # credential = self._credential or DefaultAzureCredential() + if not azure_endpoint: + raise ValueError("Environment variable AZURE_OPENAI_ENDPOINT must be set") + if not api_version: + raise ValueError("Environment variable AZURE_OPENAI_VERSION must be set") + + if api_key: + return AsyncAzureOpenAI( + api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version + ) + elif self._credential: + # credential = DefaultAzureCredential() + token_provider = get_bearer_token_provider( + DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default" + ) + return AsyncAzureOpenAI( + azure_ad_token_provider=token_provider, + azure_endpoint=azure_endpoint, + api_version=api_version, + ) + else: + raise ValueError( + "Environment variable AZURE_OPENAI_API_KEY must be set or credential must be provided" + ) + + # def _parse_chat_completion(self, completion: ChatCompletion) -> "GeneratorOutput": + # # TODO: raw output it is better to save the whole completion as a source of truth instead of just the message + # try: + # data = self.chat_completion_parser(completion) + # usage = self.track_completion_usage(completion) + # return GeneratorOutput( + # data=data, error=None, raw_response=str(data), usage=usage + # ) + # except Exception as e: + # log.error(f"Error parsing the completion: {e}") + # return GeneratorOutput(data=None, error=str(e), raw_response=completion) + + def parse_chat_completion( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> "GeneratorOutput": + """Parse the completion, and put it into the raw_response.""" + log.debug(f"completion: {completion}, parser: {self.chat_completion_parser}") + try: + data = self.chat_completion_parser(completion) + usage = self.track_completion_usage(completion) + return GeneratorOutput( + data=None, error=None, raw_response=data, usage=usage + ) + except Exception as e: + log.error(f"Error parsing the completion: {e}") + return GeneratorOutput(data=None, error=str(e), raw_response=completion) + + def track_completion_usage( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> CompletionUsage: + if isinstance(completion, ChatCompletion): + usage: CompletionUsage = CompletionUsage( + completion_tokens=completion.usage.completion_tokens, + prompt_tokens=completion.usage.prompt_tokens, + total_tokens=completion.usage.total_tokens, + ) + return usage + else: + raise NotImplementedError( + "streaming completion usage tracking is not implemented" + ) + + def parse_embedding_response( + self, response: CreateEmbeddingResponse + ) -> EmbedderOutput: + r"""Parse the embedding response to a structure AdalFlow components can understand. + + Should be called in ``Embedder``. + """ + try: + return parse_embedding_response(response) + except Exception as e: + log.error(f"Error parsing the embedding response: {e}") + return EmbedderOutput(data=[], error=str(e), raw_response=response) + + def convert_inputs_to_api_kwargs( + self, + input: Optional[Any] = None, + model_kwargs: Dict = {}, + model_type: ModelType = ModelType.UNDEFINED, + ) -> Dict: + r""" + Specify the API input type and output api_kwargs that will be used in _call and _acall methods. + Convert the Component's standard input, and system_input(chat model) and model_kwargs into API-specific format + """ + + final_model_kwargs = model_kwargs.copy() + if model_type == ModelType.EMBEDDER: + if isinstance(input, str): + input = [input] + # convert input to input + if not isinstance(input, Sequence): + raise TypeError("input must be a sequence of text") + final_model_kwargs["input"] = input + elif model_type == ModelType.LLM: + # convert input to messages + messages: List[Dict[str, str]] = [] + + if self._input_type == "messages": + system_start_tag = "" + system_end_tag = "" + user_start_tag = "" + user_end_tag = "" + pattern = f"{system_start_tag}(.*?){system_end_tag}{user_start_tag}(.*?){user_end_tag}" + # Compile the regular expression + regex = re.compile(pattern) + # Match the pattern + match = regex.search(input) + system_prompt, input_str = None, None + + if match: + system_prompt = match.group(1) + input_str = match.group(2) + + else: + print("No match found.") + if system_prompt and input_str: + messages.append({"role": "system", "content": system_prompt}) + messages.append({"role": "user", "content": input_str}) + if len(messages) == 0: + messages.append({"role": "system", "content": input}) + final_model_kwargs["messages"] = messages + else: + raise ValueError(f"model_type {model_type} is not supported") + return final_model_kwargs + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """ + kwargs is the combined input and model_kwargs. Support streaming call. + """ + log.info(f"api_kwargs: {api_kwargs}") + if model_type == ModelType.EMBEDDER: + return self.sync_client.embeddings.create(**api_kwargs) + elif model_type == ModelType.LLM: + if "stream" in api_kwargs and api_kwargs.get("stream", False): + log.debug("streaming call") + self.chat_completion_parser = handle_streaming_response + return self.sync_client.chat.completions.create(**api_kwargs) + return self.sync_client.chat.completions.create(**api_kwargs) + else: + raise ValueError(f"model_type {model_type} is not supported") + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + async def acall( + self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED + ): + """ + kwargs is the combined input and model_kwargs + """ + if self.async_client is None: + self.async_client = self.init_async_client() + if model_type == ModelType.EMBEDDER: + return await self.async_client.embeddings.create(**api_kwargs) + elif model_type == ModelType.LLM: + return await self.async_client.chat.completions.create(**api_kwargs) + else: + raise ValueError(f"model_type {model_type} is not supported") + + @classmethod + def from_dict(cls: type[T], data: Dict[str, Any]) -> T: + obj = super().from_dict(data) + # recreate the existing clients + obj.sync_client = obj.init_sync_client() + obj.async_client = obj.init_async_client() + return obj + + def to_dict(self) -> Dict[str, Any]: + r"""Convert the component to a dictionary.""" + # TODO: not exclude but save yes or no for recreating the clients + exclude = [ + "sync_client", + "async_client", + ] # unserializable object + output = super().to_dict(exclude=exclude) + return output + + +# if __name__ == "__main__": +# from adalflow.core import Generator +# from adalflow.utils import setup_env, get_logger + +# log = get_logger(level="DEBUG") + +# setup_env() +# prompt_kwargs = {"input_str": "What is the meaning of life?"} + +# gen = Generator( +# model_client=OpenAIClient(), +# model_kwargs={"model": "gpt-3.5-turbo", "stream": True}, +# ) +# gen_response = gen(prompt_kwargs) +# print(f"gen_response: {gen_response}") + +# for genout in gen_response.data: +# print(f"genout: {genout}") \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/api/bedrock_client.py b/reference-deepwiki/deepwiki-open-main/api/bedrock_client.py new file mode 100644 index 0000000..2799597 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/bedrock_client.py @@ -0,0 +1,317 @@ +"""AWS Bedrock ModelClient integration.""" + +import os +import json +import logging +import boto3 +import botocore +import backoff +from typing import Dict, Any, Optional, List, Generator, Union, AsyncGenerator + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ModelType, GeneratorOutput + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +log = logging.getLogger(__name__) + +class BedrockClient(ModelClient): + __doc__ = r"""A component wrapper for the AWS Bedrock API client. + + AWS Bedrock provides a unified API that gives access to various foundation models + including Amazon's own models and third-party models like Anthropic Claude. + + Example: + ```python + from api.bedrock_client import BedrockClient + + client = BedrockClient() + generator = adal.Generator( + model_client=client, + model_kwargs={"model": "anthropic.claude-3-sonnet-20240229-v1:0"} + ) + ``` + """ + + def __init__( + self, + aws_access_key_id: Optional[str] = None, + aws_secret_access_key: Optional[str] = None, + aws_region: Optional[str] = None, + aws_role_arn: Optional[str] = None, + *args, + **kwargs + ) -> None: + """Initialize the AWS Bedrock client. + + Args: + aws_access_key_id: AWS access key ID. If not provided, will use environment variable AWS_ACCESS_KEY_ID. + aws_secret_access_key: AWS secret access key. If not provided, will use environment variable AWS_SECRET_ACCESS_KEY. + aws_region: AWS region. If not provided, will use environment variable AWS_REGION. + aws_role_arn: AWS IAM role ARN for role-based authentication. If not provided, will use environment variable AWS_ROLE_ARN. + """ + super().__init__(*args, **kwargs) + from api.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, AWS_ROLE_ARN + + self.aws_access_key_id = aws_access_key_id or AWS_ACCESS_KEY_ID + self.aws_secret_access_key = aws_secret_access_key or AWS_SECRET_ACCESS_KEY + self.aws_region = aws_region or AWS_REGION or "us-east-1" + self.aws_role_arn = aws_role_arn or AWS_ROLE_ARN + + self.sync_client = self.init_sync_client() + self.async_client = None # Initialize async client only when needed + + def init_sync_client(self): + """Initialize the synchronous AWS Bedrock client.""" + try: + # Create a session with the provided credentials + session = boto3.Session( + aws_access_key_id=self.aws_access_key_id, + aws_secret_access_key=self.aws_secret_access_key, + region_name=self.aws_region + ) + + # If a role ARN is provided, assume that role + if self.aws_role_arn: + sts_client = session.client('sts') + assumed_role = sts_client.assume_role( + RoleArn=self.aws_role_arn, + RoleSessionName="DeepWikiBedrockSession" + ) + credentials = assumed_role['Credentials'] + + # Create a new session with the assumed role credentials + session = boto3.Session( + aws_access_key_id=credentials['AccessKeyId'], + aws_secret_access_key=credentials['SecretAccessKey'], + aws_session_token=credentials['SessionToken'], + region_name=self.aws_region + ) + + # Create the Bedrock client + bedrock_runtime = session.client( + service_name='bedrock-runtime', + region_name=self.aws_region + ) + + return bedrock_runtime + + except Exception as e: + log.error(f"Error initializing AWS Bedrock client: {str(e)}") + # Return None to indicate initialization failure + return None + + def init_async_client(self): + """Initialize the asynchronous AWS Bedrock client. + + Note: boto3 doesn't have native async support, so we'll use the sync client + in async methods and handle async behavior at a higher level. + """ + # For now, just return the sync client + return self.sync_client + + def _get_model_provider(self, model_id: str) -> str: + """Extract the provider from the model ID. + + Args: + model_id: The model ID, e.g., "anthropic.claude-3-sonnet-20240229-v1:0" + + Returns: + The provider name, e.g., "anthropic" + """ + if "." in model_id: + return model_id.split(".")[0] + return "amazon" # Default provider + + def _format_prompt_for_provider(self, provider: str, prompt: str, messages=None) -> Dict[str, Any]: + """Format the prompt according to the provider's requirements. + + Args: + provider: The provider name, e.g., "anthropic" + prompt: The prompt text + messages: Optional list of messages for chat models + + Returns: + A dictionary with the formatted prompt + """ + if provider == "anthropic": + # Format for Claude models + if messages: + # Format as a conversation + formatted_messages = [] + for msg in messages: + role = "user" if msg.get("role") == "user" else "assistant" + formatted_messages.append({ + "role": role, + "content": [{"type": "text", "text": msg.get("content", "")}] + }) + return { + "anthropic_version": "bedrock-2023-05-31", + "messages": formatted_messages, + "max_tokens": 4096 + } + else: + # Format as a single prompt + return { + "anthropic_version": "bedrock-2023-05-31", + "messages": [ + {"role": "user", "content": [{"type": "text", "text": prompt}]} + ], + "max_tokens": 4096 + } + elif provider == "amazon": + # Format for Amazon Titan models + return { + "inputText": prompt, + "textGenerationConfig": { + "maxTokenCount": 4096, + "stopSequences": [], + "temperature": 0.7, + "topP": 0.8 + } + } + elif provider == "cohere": + # Format for Cohere models + return { + "prompt": prompt, + "max_tokens": 4096, + "temperature": 0.7, + "p": 0.8 + } + elif provider == "ai21": + # Format for AI21 models + return { + "prompt": prompt, + "maxTokens": 4096, + "temperature": 0.7, + "topP": 0.8 + } + else: + # Default format + return {"prompt": prompt} + + def _extract_response_text(self, provider: str, response: Dict[str, Any]) -> str: + """Extract the generated text from the response. + + Args: + provider: The provider name, e.g., "anthropic" + response: The response from the Bedrock API + + Returns: + The generated text + """ + if provider == "anthropic": + return response.get("content", [{}])[0].get("text", "") + elif provider == "amazon": + return response.get("results", [{}])[0].get("outputText", "") + elif provider == "cohere": + return response.get("generations", [{}])[0].get("text", "") + elif provider == "ai21": + return response.get("completions", [{}])[0].get("data", {}).get("text", "") + else: + # Try to extract text from the response + if isinstance(response, dict): + for key in ["text", "content", "output", "completion"]: + if key in response: + return response[key] + return str(response) + + @backoff.on_exception( + backoff.expo, + (botocore.exceptions.ClientError, botocore.exceptions.BotoCoreError), + max_time=5, + ) + def call(self, api_kwargs: Dict = None, model_type: ModelType = None) -> Any: + """Make a synchronous call to the AWS Bedrock API.""" + api_kwargs = api_kwargs or {} + + # Check if client is initialized + if not self.sync_client: + error_msg = "AWS Bedrock client not initialized. Check your AWS credentials and region." + log.error(error_msg) + return error_msg + + if model_type == ModelType.LLM: + model_id = api_kwargs.get("model", "anthropic.claude-3-sonnet-20240229-v1:0") + provider = self._get_model_provider(model_id) + + # Get the prompt from api_kwargs + prompt = api_kwargs.get("input", "") + messages = api_kwargs.get("messages") + + # Format the prompt according to the provider + request_body = self._format_prompt_for_provider(provider, prompt, messages) + + # Add model parameters if provided + if "temperature" in api_kwargs: + if provider == "anthropic": + request_body["temperature"] = api_kwargs["temperature"] + elif provider == "amazon": + request_body["textGenerationConfig"]["temperature"] = api_kwargs["temperature"] + elif provider == "cohere": + request_body["temperature"] = api_kwargs["temperature"] + elif provider == "ai21": + request_body["temperature"] = api_kwargs["temperature"] + + if "top_p" in api_kwargs: + if provider == "anthropic": + request_body["top_p"] = api_kwargs["top_p"] + elif provider == "amazon": + request_body["textGenerationConfig"]["topP"] = api_kwargs["top_p"] + elif provider == "cohere": + request_body["p"] = api_kwargs["top_p"] + elif provider == "ai21": + request_body["topP"] = api_kwargs["top_p"] + + # Convert request body to JSON + body = json.dumps(request_body) + + try: + # Make the API call + response = self.sync_client.invoke_model( + modelId=model_id, + body=body + ) + + # Parse the response + response_body = json.loads(response["body"].read()) + + # Extract the generated text + generated_text = self._extract_response_text(provider, response_body) + + return generated_text + + except Exception as e: + log.error(f"Error calling AWS Bedrock API: {str(e)}") + return f"Error: {str(e)}" + else: + raise ValueError(f"Model type {model_type} is not supported by AWS Bedrock client") + + async def acall(self, api_kwargs: Dict = None, model_type: ModelType = None) -> Any: + """Make an asynchronous call to the AWS Bedrock API.""" + # For now, just call the sync method + # In a real implementation, you would use an async library or run the sync method in a thread pool + return self.call(api_kwargs, model_type) + + def convert_inputs_to_api_kwargs( + self, input: Any = None, model_kwargs: Dict = None, model_type: ModelType = None + ) -> Dict: + """Convert inputs to API kwargs for AWS Bedrock.""" + model_kwargs = model_kwargs or {} + api_kwargs = {} + + if model_type == ModelType.LLM: + api_kwargs["model"] = model_kwargs.get("model", "anthropic.claude-3-sonnet-20240229-v1:0") + api_kwargs["input"] = input + + # Add model parameters + if "temperature" in model_kwargs: + api_kwargs["temperature"] = model_kwargs["temperature"] + if "top_p" in model_kwargs: + api_kwargs["top_p"] = model_kwargs["top_p"] + + return api_kwargs + else: + raise ValueError(f"Model type {model_type} is not supported by AWS Bedrock client") diff --git a/reference-deepwiki/deepwiki-open-main/api/config.py b/reference-deepwiki/deepwiki-open-main/api/config.py new file mode 100644 index 0000000..3650f48 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/config.py @@ -0,0 +1,387 @@ +import os +import json +import logging +import re +from pathlib import Path +from typing import List, Union, Dict, Any + +logger = logging.getLogger(__name__) + +from api.openai_client import OpenAIClient +from api.openrouter_client import OpenRouterClient +from api.bedrock_client import BedrockClient +from api.google_embedder_client import GoogleEmbedderClient +from api.azureai_client import AzureAIClient +from api.dashscope_client import DashscopeClient +from adalflow import GoogleGenAIClient, OllamaClient + +# Get API keys from environment variables +OPENAI_API_KEY = os.environ.get('OPENAI_API_KEY') +GOOGLE_API_KEY = os.environ.get('GOOGLE_API_KEY') +OPENROUTER_API_KEY = os.environ.get('OPENROUTER_API_KEY') +AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') +AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') +AWS_REGION = os.environ.get('AWS_REGION') +AWS_ROLE_ARN = os.environ.get('AWS_ROLE_ARN') + +# Set keys in environment (in case they're needed elsewhere in the code) +if OPENAI_API_KEY: + os.environ["OPENAI_API_KEY"] = OPENAI_API_KEY +if GOOGLE_API_KEY: + os.environ["GOOGLE_API_KEY"] = GOOGLE_API_KEY +if OPENROUTER_API_KEY: + os.environ["OPENROUTER_API_KEY"] = OPENROUTER_API_KEY +if AWS_ACCESS_KEY_ID: + os.environ["AWS_ACCESS_KEY_ID"] = AWS_ACCESS_KEY_ID +if AWS_SECRET_ACCESS_KEY: + os.environ["AWS_SECRET_ACCESS_KEY"] = AWS_SECRET_ACCESS_KEY +if AWS_REGION: + os.environ["AWS_REGION"] = AWS_REGION +if AWS_ROLE_ARN: + os.environ["AWS_ROLE_ARN"] = AWS_ROLE_ARN + +# Wiki authentication settings +raw_auth_mode = os.environ.get('DEEPWIKI_AUTH_MODE', 'False') +WIKI_AUTH_MODE = raw_auth_mode.lower() in ['true', '1', 't'] +WIKI_AUTH_CODE = os.environ.get('DEEPWIKI_AUTH_CODE', '') + +# Embedder settings +EMBEDDER_TYPE = os.environ.get('DEEPWIKI_EMBEDDER_TYPE', 'openai').lower() + +# Get configuration directory from environment variable, or use default if not set +CONFIG_DIR = os.environ.get('DEEPWIKI_CONFIG_DIR', None) + +# Client class mapping +CLIENT_CLASSES = { + "GoogleGenAIClient": GoogleGenAIClient, + "GoogleEmbedderClient": GoogleEmbedderClient, + "OpenAIClient": OpenAIClient, + "OpenRouterClient": OpenRouterClient, + "OllamaClient": OllamaClient, + "BedrockClient": BedrockClient, + "AzureAIClient": AzureAIClient, + "DashscopeClient": DashscopeClient +} + +def replace_env_placeholders(config: Union[Dict[str, Any], List[Any], str, Any]) -> Union[Dict[str, Any], List[Any], str, Any]: + """ + Recursively replace placeholders like "${ENV_VAR}" in string values + within a nested configuration structure (dicts, lists, strings) + with environment variable values. Logs a warning if a placeholder is not found. + """ + pattern = re.compile(r"\$\{([A-Z0-9_]+)\}") + + def replacer(match: re.Match[str]) -> str: + env_var_name = match.group(1) + original_placeholder = match.group(0) + env_var_value = os.environ.get(env_var_name) + if env_var_value is None: + logger.warning( + f"Environment variable placeholder '{original_placeholder}' was not found in the environment. " + f"The placeholder string will be used as is." + ) + return original_placeholder + return env_var_value + + if isinstance(config, dict): + return {k: replace_env_placeholders(v) for k, v in config.items()} + elif isinstance(config, list): + return [replace_env_placeholders(item) for item in config] + elif isinstance(config, str): + return pattern.sub(replacer, config) + else: + # Handles numbers, booleans, None, etc. + return config + +# Load JSON configuration file +def load_json_config(filename): + try: + # If environment variable is set, use the directory specified by it + if CONFIG_DIR: + config_path = Path(CONFIG_DIR) / filename + else: + # Otherwise use default directory + config_path = Path(__file__).parent / "config" / filename + + logger.info(f"Loading configuration from {config_path}") + + if not config_path.exists(): + logger.warning(f"Configuration file {config_path} does not exist") + return {} + + with open(config_path, 'r', encoding='utf-8') as f: + config = json.load(f) + config = replace_env_placeholders(config) + return config + except Exception as e: + logger.error(f"Error loading configuration file {filename}: {str(e)}") + return {} + +# Load generator model configuration +def load_generator_config(): + generator_config = load_json_config("generator.json") + + # Add client classes to each provider + if "providers" in generator_config: + for provider_id, provider_config in generator_config["providers"].items(): + # Try to set client class from client_class + if provider_config.get("client_class") in CLIENT_CLASSES: + provider_config["model_client"] = CLIENT_CLASSES[provider_config["client_class"]] + # Fall back to default mapping based on provider_id + elif provider_id in ["google", "openai", "openrouter", "ollama", "bedrock", "azure", "dashscope"]: + default_map = { + "google": GoogleGenAIClient, + "openai": OpenAIClient, + "openrouter": OpenRouterClient, + "ollama": OllamaClient, + "bedrock": BedrockClient, + "azure": AzureAIClient, + "dashscope": DashscopeClient + } + provider_config["model_client"] = default_map[provider_id] + else: + logger.warning(f"Unknown provider or client class: {provider_id}") + + return generator_config + +# Load embedder configuration +def load_embedder_config(): + embedder_config = load_json_config("embedder.json") + + # Process client classes + for key in ["embedder", "embedder_ollama", "embedder_google"]: + if key in embedder_config and "client_class" in embedder_config[key]: + class_name = embedder_config[key]["client_class"] + if class_name in CLIENT_CLASSES: + embedder_config[key]["model_client"] = CLIENT_CLASSES[class_name] + + return embedder_config + +def get_embedder_config(): + """ + Get the current embedder configuration based on DEEPWIKI_EMBEDDER_TYPE. + + Returns: + dict: The embedder configuration with model_client resolved + """ + embedder_type = EMBEDDER_TYPE + if embedder_type == 'google' and 'embedder_google' in configs: + return configs.get("embedder_google", {}) + elif embedder_type == 'ollama' and 'embedder_ollama' in configs: + return configs.get("embedder_ollama", {}) + else: + return configs.get("embedder", {}) + +def is_ollama_embedder(): + """ + Check if the current embedder configuration uses OllamaClient. + + Returns: + bool: True if using OllamaClient, False otherwise + """ + embedder_config = get_embedder_config() + if not embedder_config: + return False + + # Check if model_client is OllamaClient + model_client = embedder_config.get("model_client") + if model_client: + return model_client.__name__ == "OllamaClient" + + # Fallback: check client_class string + client_class = embedder_config.get("client_class", "") + return client_class == "OllamaClient" + +def is_google_embedder(): + """ + Check if the current embedder configuration uses GoogleEmbedderClient. + + Returns: + bool: True if using GoogleEmbedderClient, False otherwise + """ + embedder_config = get_embedder_config() + if not embedder_config: + return False + + # Check if model_client is GoogleEmbedderClient + model_client = embedder_config.get("model_client") + if model_client: + return model_client.__name__ == "GoogleEmbedderClient" + + # Fallback: check client_class string + client_class = embedder_config.get("client_class", "") + return client_class == "GoogleEmbedderClient" + +def get_embedder_type(): + """ + Get the current embedder type based on configuration. + + Returns: + str: 'ollama', 'google', or 'openai' (default) + """ + if is_ollama_embedder(): + return 'ollama' + elif is_google_embedder(): + return 'google' + else: + return 'openai' + +# Load repository and file filters configuration +def load_repo_config(): + return load_json_config("repo.json") + +# Load language configuration +def load_lang_config(): + default_config = { + "supported_languages": { + "en": "English", + "ja": "Japanese (日本語)", + "zh": "Mandarin Chinese (中文)", + "zh-tw": "Traditional Chinese (繁體中文)", + "es": "Spanish (Español)", + "kr": "Korean (한국어)", + "vi": "Vietnamese (Tiếng Việt)", + "pt-br": "Brazilian Portuguese (Português Brasileiro)", + "fr": "Français (French)", + "ru": "Русский (Russian)" + }, + "default": "en" + } + + loaded_config = load_json_config("lang.json") # Let load_json_config handle path and loading + + if not loaded_config: + return default_config + + if "supported_languages" not in loaded_config or "default" not in loaded_config: + logger.warning("Language configuration file 'lang.json' is malformed. Using default language configuration.") + return default_config + + return loaded_config + +# Default excluded directories and files +DEFAULT_EXCLUDED_DIRS: List[str] = [ + # Virtual environments and package managers + "./.venv/", "./venv/", "./env/", "./virtualenv/", + "./node_modules/", "./bower_components/", "./jspm_packages/", + # Version control + "./.git/", "./.svn/", "./.hg/", "./.bzr/", + # Cache and compiled files + "./__pycache__/", "./.pytest_cache/", "./.mypy_cache/", "./.ruff_cache/", "./.coverage/", + # Build and distribution + "./dist/", "./build/", "./out/", "./target/", "./bin/", "./obj/", + # Documentation + "./docs/", "./_docs/", "./site-docs/", "./_site/", + # IDE specific + "./.idea/", "./.vscode/", "./.vs/", "./.eclipse/", "./.settings/", + # Logs and temporary files + "./logs/", "./log/", "./tmp/", "./temp/", +] + +DEFAULT_EXCLUDED_FILES: List[str] = [ + "yarn.lock", "pnpm-lock.yaml", "npm-shrinkwrap.json", "poetry.lock", + "Pipfile.lock", "requirements.txt.lock", "Cargo.lock", "composer.lock", + ".lock", ".DS_Store", "Thumbs.db", "desktop.ini", "*.lnk", ".env", + ".env.*", "*.env", "*.cfg", "*.ini", ".flaskenv", ".gitignore", + ".gitattributes", ".gitmodules", ".github", ".gitlab-ci.yml", + ".prettierrc", ".eslintrc", ".eslintignore", ".stylelintrc", + ".editorconfig", ".jshintrc", ".pylintrc", ".flake8", "mypy.ini", + "pyproject.toml", "tsconfig.json", "webpack.config.js", "babel.config.js", + "rollup.config.js", "jest.config.js", "karma.conf.js", "vite.config.js", + "next.config.js", "*.min.js", "*.min.css", "*.bundle.js", "*.bundle.css", + "*.map", "*.gz", "*.zip", "*.tar", "*.tgz", "*.rar", "*.7z", "*.iso", + "*.dmg", "*.img", "*.msix", "*.appx", "*.appxbundle", "*.xap", "*.ipa", + "*.deb", "*.rpm", "*.msi", "*.exe", "*.dll", "*.so", "*.dylib", "*.o", + "*.obj", "*.jar", "*.war", "*.ear", "*.jsm", "*.class", "*.pyc", "*.pyd", + "*.pyo", "__pycache__", "*.a", "*.lib", "*.lo", "*.la", "*.slo", "*.dSYM", + "*.egg", "*.egg-info", "*.dist-info", "*.eggs", "node_modules", + "bower_components", "jspm_packages", "lib-cov", "coverage", "htmlcov", + ".nyc_output", ".tox", "dist", "build", "bld", "out", "bin", "target", + "packages/*/dist", "packages/*/build", ".output" +] + +# Initialize empty configuration +configs = {} + +# Load all configuration files +generator_config = load_generator_config() +embedder_config = load_embedder_config() +repo_config = load_repo_config() +lang_config = load_lang_config() + +# Update configuration +if generator_config: + configs["default_provider"] = generator_config.get("default_provider", "google") + configs["providers"] = generator_config.get("providers", {}) + +# Update embedder configuration +if embedder_config: + for key in ["embedder", "embedder_ollama", "embedder_google", "retriever", "text_splitter"]: + if key in embedder_config: + configs[key] = embedder_config[key] + +# Update repository configuration +if repo_config: + for key in ["file_filters", "repository"]: + if key in repo_config: + configs[key] = repo_config[key] + +# Update language configuration +if lang_config: + configs["lang_config"] = lang_config + + +def get_model_config(provider="google", model=None): + """ + Get configuration for the specified provider and model + + Parameters: + provider (str): Model provider ('google', 'openai', 'openrouter', 'ollama', 'bedrock') + model (str): Model name, or None to use default model + + Returns: + dict: Configuration containing model_client, model and other parameters + """ + # Get provider configuration + if "providers" not in configs: + raise ValueError("Provider configuration not loaded") + + provider_config = configs["providers"].get(provider) + if not provider_config: + raise ValueError(f"Configuration for provider '{provider}' not found") + + model_client = provider_config.get("model_client") + if not model_client: + raise ValueError(f"Model client not specified for provider '{provider}'") + + # If model not provided, use default model for the provider + if not model: + model = provider_config.get("default_model") + if not model: + raise ValueError(f"No default model specified for provider '{provider}'") + + # Get model parameters (if present) + model_params = {} + if model in provider_config.get("models", {}): + model_params = provider_config["models"][model] + else: + default_model = provider_config.get("default_model") + model_params = provider_config["models"][default_model] + + # Prepare base configuration + result = { + "model_client": model_client, + } + + # Provider-specific adjustments + if provider == "ollama": + # Ollama uses a slightly different parameter structure + if "options" in model_params: + result["model_kwargs"] = {"model": model, **model_params["options"]} + else: + result["model_kwargs"] = {"model": model} + else: + # Standard structure for other providers + result["model_kwargs"] = {"model": model, **model_params} + + return result diff --git a/reference-deepwiki/deepwiki-open-main/api/config/embedder.json b/reference-deepwiki/deepwiki-open-main/api/config/embedder.json new file mode 100644 index 0000000..f0ab52d --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/config/embedder.json @@ -0,0 +1,33 @@ +{ + "embedder": { + "client_class": "OpenAIClient", + "batch_size": 500, + "model_kwargs": { + "model": "text-embedding-3-small", + "dimensions": 256, + "encoding_format": "float" + } + }, + "embedder_ollama": { + "client_class": "OllamaClient", + "model_kwargs": { + "model": "nomic-embed-text" + } + }, + "embedder_google": { + "client_class": "GoogleEmbedderClient", + "batch_size": 100, + "model_kwargs": { + "model": "text-embedding-004", + "task_type": "SEMANTIC_SIMILARITY" + } + }, + "retriever": { + "top_k": 20 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 350, + "chunk_overlap": 100 + } +} diff --git a/reference-deepwiki/deepwiki-open-main/api/config/embedder.json.bak b/reference-deepwiki/deepwiki-open-main/api/config/embedder.json.bak new file mode 100644 index 0000000..a70bdb4 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/config/embedder.json.bak @@ -0,0 +1,19 @@ +{ + "embedder": { + "client_class": "OpenAIClient", + "batch_size": 500, + "model_kwargs": { + "model": "text-embedding-3-small", + "dimensions": 256, + "encoding_format": "float" + } + }, + "retriever": { + "top_k": 20 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 350, + "chunk_overlap": 100 + } +} diff --git a/reference-deepwiki/deepwiki-open-main/api/config/embedder.ollama.json.bak b/reference-deepwiki/deepwiki-open-main/api/config/embedder.ollama.json.bak new file mode 100644 index 0000000..9d31649 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/config/embedder.ollama.json.bak @@ -0,0 +1,16 @@ +{ + "embedder": { + "client_class": "OllamaClient", + "model_kwargs": { + "model": "nomic-embed-text" + } + }, + "retriever": { + "top_k": 20 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 350, + "chunk_overlap": 100 + } +} diff --git a/reference-deepwiki/deepwiki-open-main/api/config/embedder.openai_compatible.json.bak b/reference-deepwiki/deepwiki-open-main/api/config/embedder.openai_compatible.json.bak new file mode 100644 index 0000000..dfcfcda --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/config/embedder.openai_compatible.json.bak @@ -0,0 +1,29 @@ +{ + "embedder": { + "client_class": "OpenAIClient", + "initialize_kwargs": { + "api_key": "${OPENAI_API_KEY}", + "base_url": "${OPENAI_BASE_URL}" + }, + "batch_size": 10, + "model_kwargs": { + "model": "text-embedding-v3", + "dimensions": 256, + "encoding_format": "float" + } + }, + "embedder_ollama": { + "client_class": "OllamaClient", + "model_kwargs": { + "model": "nomic-embed-text" + } + }, + "retriever": { + "top_k": 20 + }, + "text_splitter": { + "split_by": "word", + "chunk_size": 350, + "chunk_overlap": 100 + } +} diff --git a/reference-deepwiki/deepwiki-open-main/api/config/generator.json b/reference-deepwiki/deepwiki-open-main/api/config/generator.json new file mode 100644 index 0000000..f881790 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/config/generator.json @@ -0,0 +1,199 @@ +{ + "default_provider": "google", + "providers": { + "dashscope": { + "default_model": "qwen-plus", + "supportsCustomModel": true, + "models": { + "qwen-plus": { + "temperature": 0.7, + "top_p": 0.8 + }, + "qwen-turbo": { + "temperature": 0.7, + "top_p": 0.8 + }, + "deepseek-r1": { + "temperature": 0.7, + "top_p": 0.8 + } + } + }, + "google": { + "default_model": "gemini-2.5-flash", + "supportsCustomModel": true, + "models": { + "gemini-2.5-flash": { + "temperature": 1.0, + "top_p": 0.8, + "top_k": 20 + }, + "gemini-2.5-flash-lite": { + "temperature": 1.0, + "top_p": 0.8, + "top_k": 20 + }, + "gemini-2.5-pro": { + "temperature": 1.0, + "top_p": 0.8, + "top_k": 20 + } + } + }, + "openai": { + "default_model": "gpt-5-nano", + "supportsCustomModel": true, + "models": { + "gpt-5": { + "temperature": 1.0 + }, + "gpt-5-nano": { + "temperature": 1.0 + }, + "gpt-5-mini": { + "temperature": 1.0 + }, + "gpt-4o": { + "temperature": 0.7, + "top_p": 0.8 + }, + "gpt-4.1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "o1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "o3": { + "temperature": 1.0 + }, + "o4-mini": { + "temperature": 1.0 + } + } + }, + "openrouter": { + "default_model": "openai/gpt-5-nano", + "supportsCustomModel": true, + "models": { + "openai/gpt-5-nano": { + "temperature": 0.7, + "top_p": 0.8 + }, + "openai/gpt-4o": { + "temperature": 0.7, + "top_p": 0.8 + }, + "deepseek/deepseek-r1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "openai/gpt-4.1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "openai/o1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "openai/o3": { + "temperature": 1.0 + }, + "openai/o4-mini": { + "temperature": 1.0 + }, + "anthropic/claude-3.7-sonnet": { + "temperature": 0.7, + "top_p": 0.8 + }, + "anthropic/claude-3.5-sonnet": { + "temperature": 0.7, + "top_p": 0.8 + } + } + }, + "ollama": { + "default_model": "qwen3:1.7b", + "supportsCustomModel": true, + "models": { + "qwen3:1.7b": { + "options": { + "temperature": 0.7, + "top_p": 0.8, + "num_ctx": 32000 + } + }, + "llama3:8b": { + "options": { + "temperature": 0.7, + "top_p": 0.8, + "num_ctx": 8000 + } + }, + "qwen3:8b": { + "options": { + "temperature": 0.7, + "top_p": 0.8, + "num_ctx": 32000 + } + } + } + }, + "bedrock": { + "client_class": "BedrockClient", + "default_model": "anthropic.claude-3-sonnet-20240229-v1:0", + "supportsCustomModel": true, + "models": { + "anthropic.claude-3-sonnet-20240229-v1:0": { + "temperature": 0.7, + "top_p": 0.8 + }, + "anthropic.claude-3-haiku-20240307-v1:0": { + "temperature": 0.7, + "top_p": 0.8 + }, + "anthropic.claude-3-opus-20240229-v1:0": { + "temperature": 0.7, + "top_p": 0.8 + }, + "amazon.titan-text-express-v1": { + "temperature": 0.7, + "top_p": 0.8 + }, + "cohere.command-r-v1:0": { + "temperature": 0.7, + "top_p": 0.8 + }, + "ai21.j2-ultra-v1": { + "temperature": 0.7, + "top_p": 0.8 + } + } + }, + "azure": { + "client_class": "AzureAIClient", + "default_model": "gpt-4o", + "supportsCustomModel": true, + "models": { + "gpt-4o": { + "temperature": 0.7, + "top_p": 0.8 + }, + "gpt-4": { + "temperature": 0.7, + "top_p": 0.8 + }, + "gpt-35-turbo": { + "temperature": 0.7, + "top_p": 0.8 + }, + "gpt-4-turbo": { + "temperature": 0.7, + "top_p": 0.8 + } + } + } + } +} + diff --git a/reference-deepwiki/deepwiki-open-main/api/config/lang.json b/reference-deepwiki/deepwiki-open-main/api/config/lang.json new file mode 100644 index 0000000..ca25771 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/config/lang.json @@ -0,0 +1,15 @@ +{ + "supported_languages": { + "en": "English", + "ja": "Japanese (日本語)", + "zh": "Mandarin Chinese (中文)", + "zh-tw": "Traditional Chinese (繁體中文)", + "es": "Spanish (Español)", + "kr": "Korean (한국어)", + "vi": "Vietnamese (Tiếng Việt)", + "pt-br": "Brazilian Portuguese (Português Brasileiro)", + "fr": "Français (French)", + "ru": "Русский (Russian)" + }, + "default": "en" +} diff --git a/reference-deepwiki/deepwiki-open-main/api/config/repo.json b/reference-deepwiki/deepwiki-open-main/api/config/repo.json new file mode 100644 index 0000000..52c3150 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/config/repo.json @@ -0,0 +1,128 @@ +{ + "file_filters": { + "excluded_dirs": [ + "./.venv/", + "./venv/", + "./env/", + "./virtualenv/", + "./node_modules/", + "./bower_components/", + "./jspm_packages/", + "./.git/", + "./.svn/", + "./.hg/", + "./.bzr/" + ], + "excluded_files": [ + "yarn.lock", + "pnpm-lock.yaml", + "npm-shrinkwrap.json", + "poetry.lock", + "Pipfile.lock", + "requirements.txt.lock", + "Cargo.lock", + "composer.lock", + ".lock", + ".DS_Store", + "Thumbs.db", + "desktop.ini", + "*.lnk", + ".env", + ".env.*", + "*.env", + "*.cfg", + "*.ini", + ".flaskenv", + ".gitignore", + ".gitattributes", + ".gitmodules", + ".github", + ".gitlab-ci.yml", + ".prettierrc", + ".eslintrc", + ".eslintignore", + ".stylelintrc", + ".editorconfig", + ".jshintrc", + ".pylintrc", + ".flake8", + "mypy.ini", + "pyproject.toml", + "tsconfig.json", + "webpack.config.js", + "babel.config.js", + "rollup.config.js", + "jest.config.js", + "karma.conf.js", + "vite.config.js", + "next.config.js", + "*.min.js", + "*.min.css", + "*.bundle.js", + "*.bundle.css", + "*.map", + "*.gz", + "*.zip", + "*.tar", + "*.tgz", + "*.rar", + "*.7z", + "*.iso", + "*.dmg", + "*.img", + "*.msix", + "*.appx", + "*.appxbundle", + "*.xap", + "*.ipa", + "*.deb", + "*.rpm", + "*.msi", + "*.exe", + "*.dll", + "*.so", + "*.dylib", + "*.o", + "*.obj", + "*.jar", + "*.war", + "*.ear", + "*.jsm", + "*.class", + "*.pyc", + "*.pyd", + "*.pyo", + "__pycache__", + "*.a", + "*.lib", + "*.lo", + "*.la", + "*.slo", + "*.dSYM", + "*.egg", + "*.egg-info", + "*.dist-info", + "*.eggs", + "node_modules", + "bower_components", + "jspm_packages", + "lib-cov", + "coverage", + "htmlcov", + ".nyc_output", + ".tox", + "dist", + "build", + "bld", + "out", + "bin", + "target", + "packages/*/dist", + "packages/*/build", + ".output" + ] + }, + "repository": { + "max_size_mb": 50000 + } +} diff --git a/reference-deepwiki/deepwiki-open-main/api/dashscope_client.py b/reference-deepwiki/deepwiki-open-main/api/dashscope_client.py new file mode 100644 index 0000000..c727954 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/dashscope_client.py @@ -0,0 +1,914 @@ +"""Dashscope (Alibaba Cloud) ModelClient integration.""" + +import os +import pickle +from typing import ( + Dict, + Optional, + Any, + Callable, + Generator, + Union, + Literal, + List, + Sequence, +) + +import logging +import backoff +from copy import deepcopy +from tqdm import tqdm + +# optional import +from adalflow.utils.lazy_import import safe_import, OptionalPackages + +openai = safe_import(OptionalPackages.OPENAI.value[0], OptionalPackages.OPENAI.value[1]) + +from openai import OpenAI, AsyncOpenAI, Stream +from openai import ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, +) +from openai.types import ( + Completion, + CreateEmbeddingResponse, +) +from openai.types.chat import ChatCompletionChunk, ChatCompletion + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ( + ModelType, + EmbedderOutput, + CompletionUsage, + GeneratorOutput, + Document, + Embedding, + EmbedderOutputType, + EmbedderInputType, +) +from adalflow.core.component import DataComponent +from adalflow.core.embedder import ( + BatchEmbedderOutputType, + BatchEmbedderInputType, +) +import adalflow.core.functional as F +from adalflow.components.model_client.utils import parse_embedding_response + +from api.logging_config import setup_logging + +# # Disable tqdm progress bars +# os.environ["TQDM_DISABLE"] = "1" + +setup_logging() +log = logging.getLogger(__name__) + +def get_first_message_content(completion: ChatCompletion) -> str: + """When we only need the content of the first message.""" + log.info(f"🔍 get_first_message_content called with: {type(completion)}") + log.debug(f"raw completion: {completion}") + + try: + if hasattr(completion, 'choices') and len(completion.choices) > 0: + choice = completion.choices[0] + if hasattr(choice, 'message') and hasattr(choice.message, 'content'): + content = choice.message.content + log.info(f"✅ Successfully extracted content: {type(content)}, length: {len(content) if content else 0}") + return content + else: + log.error("❌ Choice doesn't have message.content") + return str(completion) + else: + log.error("❌ Completion doesn't have choices") + return str(completion) + except Exception as e: + log.error(f"❌ Error in get_first_message_content: {e}") + return str(completion) + + +def parse_stream_response(completion: ChatCompletionChunk) -> str: + """Parse the response of the stream API.""" + return completion.choices[0].delta.content + + +def handle_streaming_response(generator: Stream[ChatCompletionChunk]): + """Handle the streaming response.""" + for completion in generator: + log.debug(f"Raw chunk completion: {completion}") + parsed_content = parse_stream_response(completion) + yield parsed_content + + +class DashscopeClient(ModelClient): + """A component wrapper for the Dashscope (Alibaba Cloud) API client. + + Dashscope provides access to Alibaba Cloud's Qwen and other models through an OpenAI-compatible API. + + Args: + api_key (Optional[str], optional): Dashscope API key. Defaults to None. + workspace_id (Optional[str], optional): Dashscope workspace ID. Defaults to None. + base_url (str): The API base URL. Defaults to "https://dashscope.aliyuncs.com/compatible-mode/v1". + env_api_key_name (str): Environment variable name for the API key. Defaults to "DASHSCOPE_API_KEY". + env_workspace_id_name (str): Environment variable name for the workspace ID. Defaults to "DASHSCOPE_WORKSPACE_ID". + + References: + - Dashscope API Documentation: https://help.aliyun.com/zh/dashscope/ + """ + + def __init__( + self, + api_key: Optional[str] = None, + workspace_id: Optional[str] = None, + chat_completion_parser: Callable[[Completion], Any] = None, + input_type: Literal["text", "messages"] = "text", + base_url: Optional[str] = None, + env_base_url_name: str = "DASHSCOPE_BASE_URL", + env_api_key_name: str = "DASHSCOPE_API_KEY", + env_workspace_id_name: str = "DASHSCOPE_WORKSPACE_ID", + ): + super().__init__() + self._api_key = api_key + self._workspace_id = workspace_id + self._env_api_key_name = env_api_key_name + self._env_workspace_id_name = env_workspace_id_name + self._env_base_url_name = env_base_url_name + self.base_url = base_url or os.getenv(self._env_base_url_name, "https://dashscope.aliyuncs.com/compatible-mode/v1") + self.sync_client = self.init_sync_client() + self.async_client = None + + # Force use of get_first_message_content to ensure string output + self.chat_completion_parser = get_first_message_content + self._input_type = input_type + self._api_kwargs = {} + + def _prepare_client_config(self): + """ + Private helper method to prepare client configuration. + + Returns: + tuple: (api_key, workspace_id, base_url) for client initialization + + Raises: + ValueError: If API key is not provided + """ + api_key = self._api_key or os.getenv(self._env_api_key_name) + workspace_id = self._workspace_id or os.getenv(self._env_workspace_id_name) + + if not api_key: + raise ValueError( + f"Environment variable {self._env_api_key_name} must be set" + ) + + if not workspace_id: + log.warning(f"Environment variable {self._env_workspace_id_name} not set. Some features may not work properly.") + + # For Dashscope, we need to include the workspace ID in the base URL if provided + base_url = self.base_url + if workspace_id: + # Add workspace ID to headers or URL as required by Dashscope + base_url = f"{self.base_url.rstrip('/')}" + + return api_key, workspace_id, base_url + + def init_sync_client(self): + api_key, workspace_id, base_url = self._prepare_client_config() + + client = OpenAI(api_key=api_key, base_url=base_url) + + # Store workspace_id for later use in requests + if workspace_id: + client._workspace_id = workspace_id + + return client + + def init_async_client(self): + api_key, workspace_id, base_url = self._prepare_client_config() + + client = AsyncOpenAI(api_key=api_key, base_url=base_url) + + # Store workspace_id for later use in requests + if workspace_id: + client._workspace_id = workspace_id + + return client + + def parse_chat_completion( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> "GeneratorOutput": + """Parse the completion response to a GeneratorOutput.""" + try: + # If the completion is already a GeneratorOutput, return it directly (prevent recursion) + if isinstance(completion, GeneratorOutput): + return completion + + # Check if it's a ChatCompletion object (non-streaming response) + if hasattr(completion, 'choices') and hasattr(completion, 'usage'): + # ALWAYS extract the string content directly + try: + # Direct extraction of message content + if (hasattr(completion, 'choices') and + len(completion.choices) > 0 and + hasattr(completion.choices[0], 'message') and + hasattr(completion.choices[0].message, 'content')): + + content = completion.choices[0].message.content + if isinstance(content, str): + parsed_data = content + else: + parsed_data = str(content) + else: + # Fallback: convert entire completion to string + parsed_data = str(completion) + + except Exception as e: + # Ultimate fallback + parsed_data = str(completion) + + return GeneratorOutput( + data=parsed_data, + usage=CompletionUsage( + completion_tokens=completion.usage.completion_tokens, + prompt_tokens=completion.usage.prompt_tokens, + total_tokens=completion.usage.total_tokens, + ), + raw_response=str(completion), + ) + else: + # Handle streaming response - collect all content parts into a single string + content_parts = [] + usage_info = None + for chunk in completion: + if chunk.choices[0].delta.content: + content_parts.append(chunk.choices[0].delta.content) + # Try to get usage info from the last chunk + if hasattr(chunk, 'usage') and chunk.usage: + usage_info = chunk.usage + + # Join all content parts into a single string + full_content = ''.join(content_parts) + + # Create usage object + usage = None + if usage_info: + usage = CompletionUsage( + completion_tokens=usage_info.completion_tokens, + prompt_tokens=usage_info.prompt_tokens, + total_tokens=usage_info.total_tokens, + ) + + return GeneratorOutput( + data=full_content, + usage=usage, + raw_response="streaming" + ) + except Exception as e: + log.error(f"Error parsing completion: {e}") + raise + + def track_completion_usage( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> CompletionUsage: + """Track the completion usage.""" + if isinstance(completion, ChatCompletion): + return CompletionUsage( + completion_tokens=completion.usage.completion_tokens, + prompt_tokens=completion.usage.prompt_tokens, + total_tokens=completion.usage.total_tokens, + ) + else: + # For streaming, we can't track usage accurately + return CompletionUsage(completion_tokens=0, prompt_tokens=0, total_tokens=0) + + def parse_embedding_response( + self, response: CreateEmbeddingResponse + ) -> EmbedderOutput: + """Parse the embedding response to a EmbedderOutput.""" + # Add detailed debugging + try: + result = parse_embedding_response(response) + if result.data: + log.info(f"🔍 Number of embeddings: {len(result.data)}") + if len(result.data) > 0: + log.info(f"🔍 First embedding length: {len(result.data[0].embedding) if hasattr(result.data[0], 'embedding') else 'N/A'}") + else: + log.warning(f"🔍 No embedding data found in result") + return result + except Exception as e: + log.error(f"🔍 Error parsing DashScope embedding response: {e}") + log.error(f"🔍 Raw response details: {repr(response)}") + return EmbedderOutput(data=[], error=str(e), raw_response=response) + + def convert_inputs_to_api_kwargs( + self, + input: Optional[Any] = None, + model_kwargs: Dict = {}, + model_type: ModelType = ModelType.UNDEFINED, + ) -> Dict: + """Convert inputs to API kwargs.""" + final_model_kwargs = model_kwargs.copy() + + if model_type == ModelType.LLM: + messages = [] + if isinstance(input, str): + messages = [{"role": "user", "content": input}] + elif isinstance(input, list): + messages = input + else: + raise ValueError(f"Unsupported input type: {type(input)}") + + api_kwargs = { + "messages": messages, + **final_model_kwargs + } + + # Add workspace ID to headers if available + workspace_id = getattr(self.sync_client, '_workspace_id', None) or getattr(self.async_client, '_workspace_id', None) + if workspace_id: + # Dashscope may require workspace ID in headers + if 'extra_headers' not in api_kwargs: + api_kwargs['extra_headers'] = {} + api_kwargs['extra_headers']['X-DashScope-WorkSpace'] = workspace_id + + return api_kwargs + + elif model_type == ModelType.EMBEDDER: + # Convert Documents to text strings for embedding + processed_input = input + if isinstance(input, list): + # Extract text from Document objects + processed_input = [] + for item in input: + if hasattr(item, 'text'): + # It's a Document object, extract text + processed_input.append(item.text) + elif isinstance(item, str): + # It's already a string + processed_input.append(item) + else: + # Try to convert to string + processed_input.append(str(item)) + elif hasattr(input, 'text'): + # Single Document object + processed_input = input.text + elif isinstance(input, str): + # Single string + processed_input = input + else: + # Convert to string as fallback + processed_input = str(input) + + api_kwargs = { + "input": processed_input, + **final_model_kwargs + } + + # Add workspace ID to headers if available + workspace_id = getattr(self.sync_client, '_workspace_id', None) or getattr(self.async_client, '_workspace_id', None) + if workspace_id: + if 'extra_headers' not in api_kwargs: + api_kwargs['extra_headers'] = {} + api_kwargs['extra_headers']['X-DashScope-WorkSpace'] = workspace_id + + return api_kwargs + else: + raise ValueError(f"model_type {model_type} is not supported") + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """Call the Dashscope API.""" + if model_type == ModelType.LLM: + if not api_kwargs.get("stream", False): + # For non-streaming, enable_thinking must be false. + # Pass it via extra_body to avoid TypeError from openai client validation. + extra_body = api_kwargs.get("extra_body", {}) + extra_body["enable_thinking"] = False + api_kwargs["extra_body"] = extra_body + + completion = self.sync_client.chat.completions.create(**api_kwargs) + + if api_kwargs.get("stream", False): + return handle_streaming_response(completion) + else: + return self.parse_chat_completion(completion) + elif model_type == ModelType.EMBEDDER: + # Extract input texts from api_kwargs + texts = api_kwargs.get("input", []) + + if not texts: + log.warning("😭 No input texts provided") + return EmbedderOutput(data=[], error="No input texts provided", raw_response=None) + + # Ensure texts is a list + if isinstance(texts, str): + texts = [texts] + + # Filter out empty or None texts - following HuggingFace client pattern + valid_texts = [] + valid_indices = [] + for i, text in enumerate(texts): + if text and isinstance(text, str) and text.strip(): + valid_texts.append(text) + valid_indices.append(i) + else: + log.warning(f"🔍 Skipping empty or invalid text at index {i}: type={type(text)}, length={len(text) if hasattr(text, '__len__') else 'N/A'}, repr={repr(text)[:100]}") + + if not valid_texts: + log.error("😭 No valid texts found after filtering") + return EmbedderOutput(data=[], error="No valid texts found after filtering", raw_response=None) + + if len(valid_texts) != len(texts): + filtered_count = len(texts) - len(valid_texts) + log.warning(f"🔍 Filtered out {filtered_count} empty/invalid texts out of {len(texts)} total texts") + + # Create modified api_kwargs with only valid texts + filtered_api_kwargs = api_kwargs.copy() + filtered_api_kwargs["input"] = valid_texts + + log.info(f"🔍 DashScope embedding API call with {len(valid_texts)} valid texts out of {len(texts)} total") + + try: + response = self.sync_client.embeddings.create(**filtered_api_kwargs) + log.info(f"🔍 DashScope API call successful, response type: {type(response)}") + result = self.parse_embedding_response(response) + + # If we filtered texts, we need to create embeddings for the original indices + if len(valid_texts) != len(texts): + log.info(f"🔍 Creating embeddings for {len(texts)} original positions") + + # Get the correct embedding dimension from the first valid embedding + embedding_dim = None # Must be determined from a successful response + if result.data and len(result.data) > 0 and hasattr(result.data[0], 'embedding'): + embedding_dim = len(result.data[0].embedding) + log.info(f"🔍 Using embedding dimension: {embedding_dim}") + + final_data = [] + valid_idx = 0 + for i in range(len(texts)): + if i in valid_indices: + # Use the embedding from valid texts + final_data.append(result.data[valid_idx]) + valid_idx += 1 + else: + # Create zero embedding for filtered texts with correct dimension + log.warning(f"🔍 Creating zero embedding for filtered text at index {i}") + final_data.append(Embedding( + embedding=[0.0] * embedding_dim, # Use correct embedding dimension + index=i + )) + + result = EmbedderOutput( + data=final_data, + error=None, + raw_response=result.raw_response + ) + + return result + + except Exception as e: + log.error(f"🔍 DashScope API call failed: {e}") + return EmbedderOutput(data=[], error=str(e), raw_response=None) + else: + raise ValueError(f"model_type {model_type} is not supported") + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + async def acall( + self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED + ): + """Async call to the Dashscope API.""" + if not self.async_client: + self.async_client = self.init_async_client() + + if model_type == ModelType.LLM: + if not api_kwargs.get("stream", False): + # For non-streaming, enable_thinking must be false. + extra_body = api_kwargs.get("extra_body", {}) + extra_body["enable_thinking"] = False + api_kwargs["extra_body"] = extra_body + + completion = await self.async_client.chat.completions.create(**api_kwargs) + + if api_kwargs.get("stream", False): + return handle_streaming_response(completion) + else: + return self.parse_chat_completion(completion) + elif model_type == ModelType.EMBEDDER: + # Extract input texts from api_kwargs + texts = api_kwargs.get("input", []) + + if not texts: + log.warning("😭 No input texts provided") + return EmbedderOutput(data=[], error="No input texts provided", raw_response=None) + + # Ensure texts is a list + if isinstance(texts, str): + texts = [texts] + + # Filter out empty or None texts - following HuggingFace client pattern + valid_texts = [] + valid_indices = [] + for i, text in enumerate(texts): + if text and isinstance(text, str) and text.strip(): + valid_texts.append(text) + valid_indices.append(i) + else: + log.warning(f"🔍 Skipping empty or invalid text at index {i}: type={type(text)}, length={len(text) if hasattr(text, '__len__') else 'N/A'}, repr={repr(text)[:100]}") + + if not valid_texts: + log.error("😭 No valid texts found after filtering") + return EmbedderOutput(data=[], error="No valid texts found after filtering", raw_response=None) + + if len(valid_texts) != len(texts): + filtered_count = len(texts) - len(valid_texts) + log.warning(f"🔍 Filtered out {filtered_count} empty/invalid texts out of {len(texts)} total texts") + + # Create modified api_kwargs with only valid texts + filtered_api_kwargs = api_kwargs.copy() + filtered_api_kwargs["input"] = valid_texts + + log.info(f"🔍 DashScope async embedding API call with {len(valid_texts)} valid texts out of {len(texts)} total") + + try: + response = await self.async_client.embeddings.create(**filtered_api_kwargs) + log.info(f"🔍 DashScope async API call successful, response type: {type(response)}") + result = self.parse_embedding_response(response) + + # If we filtered texts, we need to create embeddings for the original indices + if len(valid_texts) != len(texts): + log.info(f"🔍 Creating embeddings for {len(texts)} original positions") + + # Get the correct embedding dimension from the first valid embedding + embedding_dim = 256 # Default fallback based on config + if result.data and len(result.data) > 0 and hasattr(result.data[0], 'embedding'): + embedding_dim = len(result.data[0].embedding) + log.info(f"🔍 Using embedding dimension: {embedding_dim}") + + final_data = [] + valid_idx = 0 + for i in range(len(texts)): + if i in valid_indices: + # Use the embedding from valid texts + final_data.append(result.data[valid_idx]) + valid_idx += 1 + else: + # Create zero embedding for filtered texts with correct dimension + log.warning(f"🔍 Creating zero embedding for filtered text at index {i}") + final_data.append(Embedding( + embedding=[0.0] * embedding_dim, # Use correct embedding dimension + index=i + )) + + result = EmbedderOutput( + data=final_data, + error=None, + raw_response=result.raw_response + ) + + return result + + except Exception as e: + log.error(f"🔍 DashScope async API call failed: {e}") + return EmbedderOutput(data=[], error=str(e), raw_response=None) + else: + raise ValueError(f"model_type {model_type} is not supported") + + @classmethod + def from_dict(cls, data: Dict[str, Any]): + """Create an instance from a dictionary.""" + return cls(**data) + + def to_dict(self) -> Dict[str, Any]: + """Convert to dictionary.""" + return { + "api_key": self._api_key, + "workspace_id": self._workspace_id, + "base_url": self.base_url, + "input_type": self._input_type, + } + + def __getstate__(self): + """ + Customize serialization to exclude non-picklable client objects. + This method is called by pickle when saving the object's state. + """ + state = self.__dict__.copy() + # Remove the unpicklable client instances + if 'sync_client' in state: + del state['sync_client'] + if 'async_client' in state: + del state['async_client'] + return state + + def __setstate__(self, state): + """ + Customize deserialization to re-create the client objects. + This method is called by pickle when loading the object's state. + """ + self.__dict__.update(state) + # Re-initialize the clients after unpickling + self.sync_client = self.init_sync_client() + self.async_client = None # It will be lazily initialized when acall is used + + +class DashScopeEmbedder(DataComponent): + r""" + A user-facing component that orchestrates an embedder model via the DashScope model client and output processors. + + Args: + model_client (ModelClient): The DashScope model client to use for the embedder. + model_kwargs (Dict[str, Any], optional): The model kwargs to pass to the model client. Defaults to {}. + output_processors (Optional[Component], optional): The output processors after model call. Defaults to None. + """ + + model_type: ModelType = ModelType.EMBEDDER + model_client: ModelClient + output_processors: Optional[DataComponent] + + def __init__( + self, + *, + model_client: ModelClient, + model_kwargs: Dict[str, Any] = {}, + output_processors: Optional[DataComponent] = None, + ) -> None: + + super().__init__(model_kwargs=model_kwargs) + if not isinstance(model_kwargs, Dict): + raise TypeError( + f"{type(self).__name__} requires a dictionary for model_kwargs, not a string" + ) + self.model_kwargs = model_kwargs.copy() + + if not isinstance(model_client, ModelClient): + raise TypeError( + f"{type(self).__name__} requires a ModelClient instance for model_client." + ) + self.model_client = model_client + self.output_processors = output_processors + + def call( + self, + input: EmbedderInputType, + model_kwargs: Optional[Dict] = {}, + ) -> EmbedderOutputType: + log.debug(f"Calling {self.__class__.__name__} with input: {input}") + api_kwargs = self.model_client.convert_inputs_to_api_kwargs( + input=input, + model_kwargs=self._compose_model_kwargs(**model_kwargs), + model_type=self.model_type, + ) + try: + output = self.model_client.call( + api_kwargs=api_kwargs, model_type=self.model_type + ) + except Exception as e: + log.error(f"🤡 Error calling the DashScope model: {e}") + output = EmbedderOutput(error=str(e)) + return output + + async def acall( + self, + input: EmbedderInputType, + model_kwargs: Optional[Dict] = {}, + ) -> EmbedderOutputType: + log.debug(f"Calling {self.__class__.__name__} with input: {input}") + api_kwargs = self.model_client.convert_inputs_to_api_kwargs( + input=input, + model_kwargs=self._compose_model_kwargs(**model_kwargs), + model_type=self.model_type, + ) + output: EmbedderOutputType = None + try: + response = await self.model_client.acall( + api_kwargs=api_kwargs, model_type=self.model_type + ) + output = self.model_client.parse_embedding_response(response) + except Exception as e: + log.error(f"Error calling the DashScope model: {e}") + output = EmbedderOutput(error=str(e)) + + output.input = [input] if isinstance(input, str) else input + log.debug(f"Output from {self.__class__.__name__}: {output}") + return output + + def _compose_model_kwargs(self, **model_kwargs) -> Dict[str, object]: + return F.compose_model_kwargs(self.model_kwargs, model_kwargs) + +# Batch Embedding Components for DashScope +class DashScopeBatchEmbedder(DataComponent): + """Batch embedder specifically designed for DashScope API""" + + def __init__(self, embedder, batch_size: int = 100, embedding_cache_file_name: str = "default") -> None: + super().__init__(batch_size=batch_size) + self.embedder = embedder + self.batch_size = batch_size + if self.batch_size > 25: + log.warning(f"DashScope batch embedder initialization, batch size: {self.batch_size}, note that DashScope batch embedding size cannot exceed 25, automatically set to 25") + self.batch_size = 25 + self.cache_path = f'./embedding_cache/{embedding_cache_file_name}_{self.embedder.__class__.__name__}_dashscope_embeddings.pkl' + + def call( + self, input: BatchEmbedderInputType, model_kwargs: Optional[Dict] = {}, force_recreate: bool = False + ) -> BatchEmbedderOutputType: + """ + Batch call to DashScope embedder + + Args: + input: List of input texts + model_kwargs: Model parameters + force_recreate: Whether to force recreation + + Returns: + Batch embedding output + """ + # Check cache first + + if not force_recreate and os.path.exists(self.cache_path): + try: + with open(self.cache_path, 'rb') as f: + embeddings = pickle.load(f) + log.info(f"Loaded cached DashScope embeddings from: {self.cache_path}") + return embeddings + except Exception as e: + log.warning(f"Failed to load cache file {self.cache_path}: {e}, proceeding with fresh embedding") + + if isinstance(input, str): + input = [input] + + n = len(input) + embeddings: List[EmbedderOutput] = [] + + log.info(f"Starting DashScope batch embedding processing, total {n} texts, batch size: {self.batch_size}") + + for i in tqdm( + range(0, n, self.batch_size), + desc="DashScope batch embedding", + disable=False, + ): + batch_input = input[i : min(i + self.batch_size, n)] + + try: + # Use correct calling method: directly call embedder instance + batch_output = self.embedder( + input=batch_input, model_kwargs=model_kwargs + ) + embeddings.append(batch_output) + + # Validate batch output + if batch_output.error: + log.error(f"Batch {i//self.batch_size + 1} embedding failed: {batch_output.error}") + elif batch_output.data: + log.debug(f"Batch {i//self.batch_size + 1} successfully generated {len(batch_output.data)} embedding vectors") + else: + log.warning(f"Batch {i//self.batch_size + 1} returned no embedding data") + + except Exception as e: + log.error(f"Batch {i//self.batch_size + 1} processing exception: {e}") + # Create error embedding output + error_output = EmbedderOutput( + data=[], + error=str(e), + raw_response=None + ) + embeddings.append(error_output) + + log.info(f"DashScope batch embedding completed, processed {len(embeddings)} batches") + + # Save to cache + try: + if not os.path.exists('./embedding_cache'): + os.makedirs('./embedding_cache') + with open(self.cache_path, 'wb') as f: + pickle.dump(embeddings, f) + log.info(f"Saved DashScope embeddings cache to: {self.cache_path}") + except Exception as e: + log.warning(f"Failed to save cache to {self.cache_path}: {e}") + + return embeddings + + def __call__(self, input: BatchEmbedderInputType, model_kwargs: Optional[Dict] = {}, force_recreate: bool = False) -> BatchEmbedderOutputType: + """ + Call operator interface, delegates to call method + """ + return self.call(input=input, model_kwargs=model_kwargs, force_recreate=force_recreate) + + +class DashScopeToEmbeddings(DataComponent): + """Component that converts document sequences to embedding vector sequences, specifically optimized for DashScope API""" + + def __init__(self, embedder, batch_size: int = 100, force_recreate_db: bool = False, embedding_cache_file_name: str = "default") -> None: + super().__init__(batch_size=batch_size) + self.embedder = embedder + self.batch_size = batch_size + self.batch_embedder = DashScopeBatchEmbedder(embedder=embedder, batch_size=batch_size, embedding_cache_file_name=embedding_cache_file_name) + self.force_recreate_db = force_recreate_db + + def __call__(self, input: List[Document]) -> List[Document]: + """ + Process list of documents, generating embedding vectors for each document + + Args: + input: List of input documents + + Returns: + List of documents containing embedding vectors + """ + output = deepcopy(input) + + # Convert to text list + embedder_input: List[str] = [chunk.text for chunk in output] + + log.info(f"Starting to process embeddings for {len(embedder_input)} documents") + + # Batch process embeddings + outputs: List[EmbedderOutput] = self.batch_embedder( + input=embedder_input, + force_recreate=self.force_recreate_db + ) + + # Validate output + total_embeddings = 0 + error_batches = 0 + + for batch_output in outputs: + if batch_output.error: + error_batches += 1 + log.error(f"Found error batch: {batch_output.error}") + elif batch_output.data: + total_embeddings += len(batch_output.data) + + log.info(f"Embedding statistics: total {total_embeddings} valid embeddings, {error_batches} error batches") + + # Assign embedding vectors back to documents + doc_idx = 0 + for batch_idx, batch_output in tqdm( + enumerate(outputs), + desc="Assigning embedding vectors to documents", + disable=False + ): + if batch_output.error: + # Create empty vectors for documents in error batches + batch_size_actual = min(self.batch_size, len(output) - doc_idx) + log.warning(f"Creating empty vectors for {batch_size_actual} documents in batch {batch_idx}") + + for i in range(batch_size_actual): + if doc_idx < len(output): + output[doc_idx].vector = [] + doc_idx += 1 + else: + # Assign normal embedding vectors + for embedding in batch_output.data: + if doc_idx < len(output): + if hasattr(embedding, 'embedding'): + output[doc_idx].vector = embedding.embedding + else: + log.warning(f"Invalid embedding format for document {doc_idx}") + output[doc_idx].vector = [] + doc_idx += 1 + + # Validate results + valid_count = 0 + empty_count = 0 + + for doc in output: + if hasattr(doc, 'vector') and doc.vector and len(doc.vector) > 0: + valid_count += 1 + else: + empty_count += 1 + + log.info(f"Embedding results: {valid_count} valid vectors, {empty_count} empty vectors") + + if valid_count == 0: + log.error("❌ All documents have empty embedding vectors!") + elif empty_count > 0: + log.warning(f"⚠️ Found {empty_count} empty embedding vectors") + else: + log.info("✅ All documents successfully generated embedding vectors") + + return output + + def _extra_repr(self) -> str: + return f"batch_size={self.batch_size}" \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/api/data_pipeline.py b/reference-deepwiki/deepwiki-open-main/api/data_pipeline.py new file mode 100644 index 0000000..fcea34c --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/data_pipeline.py @@ -0,0 +1,881 @@ +import adalflow as adal +from adalflow.core.types import Document, List +from adalflow.components.data_process import TextSplitter, ToEmbeddings +import os +import subprocess +import json +import tiktoken +import logging +import base64 +import re +import glob +from adalflow.utils import get_adalflow_default_root_path +from adalflow.core.db import LocalDB +from api.config import configs, DEFAULT_EXCLUDED_DIRS, DEFAULT_EXCLUDED_FILES +from api.ollama_patch import OllamaDocumentProcessor +from urllib.parse import urlparse, urlunparse, quote +import requests +from requests.exceptions import RequestException + +from api.tools.embedder import get_embedder + +# Configure logging +logger = logging.getLogger(__name__) + +# Maximum token limit for OpenAI embedding models +MAX_EMBEDDING_TOKENS = 8192 + +def count_tokens(text: str, embedder_type: str = None, is_ollama_embedder: bool = None) -> int: + """ + Count the number of tokens in a text string using tiktoken. + + Args: + text (str): The text to count tokens for. + embedder_type (str, optional): The embedder type ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + + Returns: + int: The number of tokens in the text. + """ + try: + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + + # Determine embedder type if not specified + if embedder_type is None: + from api.config import get_embedder_type + embedder_type = get_embedder_type() + + # Choose encoding based on embedder type + if embedder_type == 'ollama': + # Ollama typically uses cl100k_base encoding + encoding = tiktoken.get_encoding("cl100k_base") + elif embedder_type == 'google': + # Google uses similar tokenization to GPT models for rough estimation + encoding = tiktoken.get_encoding("cl100k_base") + else: # OpenAI or default + # Use OpenAI embedding model encoding + encoding = tiktoken.encoding_for_model("text-embedding-3-small") + + return len(encoding.encode(text)) + except Exception as e: + # Fallback to a simple approximation if tiktoken fails + logger.warning(f"Error counting tokens with tiktoken: {e}") + # Rough approximation: 4 characters per token + return len(text) // 4 + +def download_repo(repo_url: str, local_path: str, type: str = "github", access_token: str = None) -> str: + """ + Downloads a Git repository (GitHub, GitLab, or Bitbucket) to a specified local path. + + Args: + repo_url (str): The URL of the Git repository to clone. + local_path (str): The local directory where the repository will be cloned. + access_token (str, optional): Access token for private repositories. + + Returns: + str: The output message from the `git` command. + """ + try: + # Check if Git is installed + logger.info(f"Preparing to clone repository to {local_path}") + subprocess.run( + ["git", "--version"], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + # Check if repository already exists + if os.path.exists(local_path) and os.listdir(local_path): + # Directory exists and is not empty + logger.warning(f"Repository already exists at {local_path}. Using existing repository.") + return f"Using existing repository at {local_path}" + + # Ensure the local path exists + os.makedirs(local_path, exist_ok=True) + + # Prepare the clone URL with access token if provided + clone_url = repo_url + if access_token: + parsed = urlparse(repo_url) + # Determine the repository type and format the URL accordingly + if type == "github": + # Format: https://{token}@{domain}/owner/repo.git + # Works for both github.com and enterprise GitHub domains + clone_url = urlunparse((parsed.scheme, f"{access_token}@{parsed.netloc}", parsed.path, '', '', '')) + elif type == "gitlab": + # Format: https://oauth2:{token}@gitlab.com/owner/repo.git + clone_url = urlunparse((parsed.scheme, f"oauth2:{access_token}@{parsed.netloc}", parsed.path, '', '', '')) + elif type == "bitbucket": + # Format: https://x-token-auth:{token}@bitbucket.org/owner/repo.git + clone_url = urlunparse((parsed.scheme, f"x-token-auth:{access_token}@{parsed.netloc}", parsed.path, '', '', '')) + + logger.info("Using access token for authentication") + + # Clone the repository + logger.info(f"Cloning repository from {repo_url} to {local_path}") + # We use repo_url in the log to avoid exposing the token in logs + result = subprocess.run( + ["git", "clone", "--depth=1", "--single-branch", clone_url, local_path], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + logger.info("Repository cloned successfully") + return result.stdout.decode("utf-8") + + except subprocess.CalledProcessError as e: + error_msg = e.stderr.decode('utf-8') + # Sanitize error message to remove any tokens + if access_token and access_token in error_msg: + error_msg = error_msg.replace(access_token, "***TOKEN***") + raise ValueError(f"Error during cloning: {error_msg}") + except Exception as e: + raise ValueError(f"An unexpected error occurred: {str(e)}") + +# Alias for backward compatibility +download_github_repo = download_repo + +def read_all_documents(path: str, embedder_type: str = None, is_ollama_embedder: bool = None, + excluded_dirs: List[str] = None, excluded_files: List[str] = None, + included_dirs: List[str] = None, included_files: List[str] = None): + """ + Recursively reads all documents in a directory and its subdirectories. + + Args: + path (str): The root directory path. + embedder_type (str, optional): The embedder type ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + excluded_dirs (List[str], optional): List of directories to exclude from processing. + Overrides the default configuration if provided. + excluded_files (List[str], optional): List of file patterns to exclude from processing. + Overrides the default configuration if provided. + included_dirs (List[str], optional): List of directories to include exclusively. + When provided, only files in these directories will be processed. + included_files (List[str], optional): List of file patterns to include exclusively. + When provided, only files matching these patterns will be processed. + + Returns: + list: A list of Document objects with metadata. + """ + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + documents = [] + # File extensions to look for, prioritizing code files + code_extensions = [".py", ".js", ".ts", ".java", ".cpp", ".c", ".h", ".hpp", ".go", ".rs", + ".jsx", ".tsx", ".html", ".css", ".php", ".swift", ".cs"] + doc_extensions = [".md", ".txt", ".rst", ".json", ".yaml", ".yml"] + + # Determine filtering mode: inclusion or exclusion + use_inclusion_mode = (included_dirs is not None and len(included_dirs) > 0) or (included_files is not None and len(included_files) > 0) + + if use_inclusion_mode: + # Inclusion mode: only process specified directories and files + final_included_dirs = set(included_dirs) if included_dirs else set() + final_included_files = set(included_files) if included_files else set() + + logger.info(f"Using inclusion mode") + logger.info(f"Included directories: {list(final_included_dirs)}") + logger.info(f"Included files: {list(final_included_files)}") + + # Convert to lists for processing + included_dirs = list(final_included_dirs) + included_files = list(final_included_files) + excluded_dirs = [] + excluded_files = [] + else: + # Exclusion mode: use default exclusions plus any additional ones + final_excluded_dirs = set(DEFAULT_EXCLUDED_DIRS) + final_excluded_files = set(DEFAULT_EXCLUDED_FILES) + + # Add any additional excluded directories from config + if "file_filters" in configs and "excluded_dirs" in configs["file_filters"]: + final_excluded_dirs.update(configs["file_filters"]["excluded_dirs"]) + + # Add any additional excluded files from config + if "file_filters" in configs and "excluded_files" in configs["file_filters"]: + final_excluded_files.update(configs["file_filters"]["excluded_files"]) + + # Add any explicitly provided excluded directories and files + if excluded_dirs is not None: + final_excluded_dirs.update(excluded_dirs) + + if excluded_files is not None: + final_excluded_files.update(excluded_files) + + # Convert back to lists for compatibility + excluded_dirs = list(final_excluded_dirs) + excluded_files = list(final_excluded_files) + included_dirs = [] + included_files = [] + + logger.info(f"Using exclusion mode") + logger.info(f"Excluded directories: {excluded_dirs}") + logger.info(f"Excluded files: {excluded_files}") + + logger.info(f"Reading documents from {path}") + + def should_process_file(file_path: str, use_inclusion: bool, included_dirs: List[str], included_files: List[str], + excluded_dirs: List[str], excluded_files: List[str]) -> bool: + """ + Determine if a file should be processed based on inclusion/exclusion rules. + + Args: + file_path (str): The file path to check + use_inclusion (bool): Whether to use inclusion mode + included_dirs (List[str]): List of directories to include + included_files (List[str]): List of files to include + excluded_dirs (List[str]): List of directories to exclude + excluded_files (List[str]): List of files to exclude + + Returns: + bool: True if the file should be processed, False otherwise + """ + file_path_parts = os.path.normpath(file_path).split(os.sep) + file_name = os.path.basename(file_path) + + if use_inclusion: + # Inclusion mode: file must be in included directories or match included files + is_included = False + + # Check if file is in an included directory + if included_dirs: + for included in included_dirs: + clean_included = included.strip("./").rstrip("/") + if clean_included in file_path_parts: + is_included = True + break + + # Check if file matches included file patterns + if not is_included and included_files: + for included_file in included_files: + if file_name == included_file or file_name.endswith(included_file): + is_included = True + break + + # If no inclusion rules are specified for a category, allow all files from that category + if not included_dirs and not included_files: + is_included = True + elif not included_dirs and included_files: + # Only file patterns specified, allow all directories + pass # is_included is already set based on file patterns + elif included_dirs and not included_files: + # Only directory patterns specified, allow all files in included directories + pass # is_included is already set based on directory patterns + + return is_included + else: + # Exclusion mode: file must not be in excluded directories or match excluded files + is_excluded = False + + # Check if file is in an excluded directory + for excluded in excluded_dirs: + clean_excluded = excluded.strip("./").rstrip("/") + if clean_excluded in file_path_parts: + is_excluded = True + break + + # Check if file matches excluded file patterns + if not is_excluded: + for excluded_file in excluded_files: + if file_name == excluded_file: + is_excluded = True + break + + return not is_excluded + + # Process code files first + for ext in code_extensions: + files = glob.glob(f"{path}/**/*{ext}", recursive=True) + for file_path in files: + # Check if file should be processed based on inclusion/exclusion rules + if not should_process_file(file_path, use_inclusion_mode, included_dirs, included_files, excluded_dirs, excluded_files): + continue + + try: + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + relative_path = os.path.relpath(file_path, path) + + # Determine if this is an implementation file + is_implementation = ( + not relative_path.startswith("test_") + and not relative_path.startswith("app_") + and "test" not in relative_path.lower() + ) + + # Check token count + token_count = count_tokens(content, embedder_type) + if token_count > MAX_EMBEDDING_TOKENS * 10: + logger.warning(f"Skipping large file {relative_path}: Token count ({token_count}) exceeds limit") + continue + + doc = Document( + text=content, + meta_data={ + "file_path": relative_path, + "type": ext[1:], + "is_code": True, + "is_implementation": is_implementation, + "title": relative_path, + "token_count": token_count, + }, + ) + documents.append(doc) + except Exception as e: + logger.error(f"Error reading {file_path}: {e}") + + # Then process documentation files + for ext in doc_extensions: + files = glob.glob(f"{path}/**/*{ext}", recursive=True) + for file_path in files: + # Check if file should be processed based on inclusion/exclusion rules + if not should_process_file(file_path, use_inclusion_mode, included_dirs, included_files, excluded_dirs, excluded_files): + continue + + try: + with open(file_path, "r", encoding="utf-8") as f: + content = f.read() + relative_path = os.path.relpath(file_path, path) + + # Check token count + token_count = count_tokens(content, embedder_type) + if token_count > MAX_EMBEDDING_TOKENS: + logger.warning(f"Skipping large file {relative_path}: Token count ({token_count}) exceeds limit") + continue + + doc = Document( + text=content, + meta_data={ + "file_path": relative_path, + "type": ext[1:], + "is_code": False, + "is_implementation": False, + "title": relative_path, + "token_count": token_count, + }, + ) + documents.append(doc) + except Exception as e: + logger.error(f"Error reading {file_path}: {e}") + + logger.info(f"Found {len(documents)} documents") + return documents + +def prepare_data_pipeline(embedder_type: str = None, is_ollama_embedder: bool = None): + """ + Creates and returns the data transformation pipeline. + + Args: + embedder_type (str, optional): The embedder type ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + + Returns: + adal.Sequential: The data transformation pipeline + """ + from api.config import get_embedder_config, get_embedder_type + + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + + # Determine embedder type if not specified + if embedder_type is None: + embedder_type = get_embedder_type() + + splitter = TextSplitter(**configs["text_splitter"]) + embedder_config = get_embedder_config() + + embedder = get_embedder(embedder_type=embedder_type) + + # Choose appropriate processor based on embedder type + if embedder_type == 'ollama': + # Use Ollama document processor for single-document processing + embedder_transformer = OllamaDocumentProcessor(embedder=embedder) + else: + # Use batch processing for OpenAI and Google embedders + batch_size = embedder_config.get("batch_size", 500) + embedder_transformer = ToEmbeddings( + embedder=embedder, batch_size=batch_size + ) + + data_transformer = adal.Sequential( + splitter, embedder_transformer + ) # sequential will chain together splitter and embedder + return data_transformer + +def transform_documents_and_save_to_db( + documents: List[Document], db_path: str, embedder_type: str = None, is_ollama_embedder: bool = None +) -> LocalDB: + """ + Transforms a list of documents and saves them to a local database. + + Args: + documents (list): A list of `Document` objects. + db_path (str): The path to the local database file. + embedder_type (str, optional): The embedder type ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + """ + # Get the data transformer + data_transformer = prepare_data_pipeline(embedder_type, is_ollama_embedder) + + # Save the documents to a local database + db = LocalDB() + db.register_transformer(transformer=data_transformer, key="split_and_embed") + db.load(documents) + db.transform(key="split_and_embed") + os.makedirs(os.path.dirname(db_path), exist_ok=True) + db.save_state(filepath=db_path) + return db + +def get_github_file_content(repo_url: str, file_path: str, access_token: str = None) -> str: + """ + Retrieves the content of a file from a GitHub repository using the GitHub API. + Supports both public GitHub (github.com) and GitHub Enterprise (custom domains). + + Args: + repo_url (str): The URL of the GitHub repository + (e.g., "https://github.com/username/repo" or "https://github.company.com/username/repo") + file_path (str): The path to the file within the repository (e.g., "src/main.py") + access_token (str, optional): GitHub personal access token for private repositories + + Returns: + str: The content of the file as a string + + Raises: + ValueError: If the file cannot be fetched or if the URL is not a valid GitHub URL + """ + try: + # Parse the repository URL to support both github.com and enterprise GitHub + parsed_url = urlparse(repo_url) + if not parsed_url.scheme or not parsed_url.netloc: + raise ValueError("Not a valid GitHub repository URL") + + # Check if it's a GitHub-like URL structure + path_parts = parsed_url.path.strip('/').split('/') + if len(path_parts) < 2: + raise ValueError("Invalid GitHub URL format - expected format: https://domain/owner/repo") + + owner = path_parts[-2] + repo = path_parts[-1].replace(".git", "") + + # Determine the API base URL + if parsed_url.netloc == "github.com": + # Public GitHub + api_base = "https://api.github.com" + else: + # GitHub Enterprise - API is typically at https://domain/api/v3/ + api_base = f"{parsed_url.scheme}://{parsed_url.netloc}/api/v3" + + # Use GitHub API to get file content + # The API endpoint for getting file content is: /repos/{owner}/{repo}/contents/{path} + api_url = f"{api_base}/repos/{owner}/{repo}/contents/{file_path}" + + # Fetch file content from GitHub API + headers = {} + if access_token: + headers["Authorization"] = f"token {access_token}" + logger.info(f"Fetching file content from GitHub API: {api_url}") + try: + response = requests.get(api_url, headers=headers) + response.raise_for_status() + except RequestException as e: + raise ValueError(f"Error fetching file content: {e}") + try: + content_data = response.json() + except json.JSONDecodeError: + raise ValueError("Invalid response from GitHub API") + + # Check if we got an error response + if "message" in content_data and "documentation_url" in content_data: + raise ValueError(f"GitHub API error: {content_data['message']}") + + # GitHub API returns file content as base64 encoded string + if "content" in content_data and "encoding" in content_data: + if content_data["encoding"] == "base64": + # The content might be split into lines, so join them first + content_base64 = content_data["content"].replace("\n", "") + content = base64.b64decode(content_base64).decode("utf-8") + return content + else: + raise ValueError(f"Unexpected encoding: {content_data['encoding']}") + else: + raise ValueError("File content not found in GitHub API response") + + except Exception as e: + raise ValueError(f"Failed to get file content: {str(e)}") + +def get_gitlab_file_content(repo_url: str, file_path: str, access_token: str = None) -> str: + """ + Retrieves the content of a file from a GitLab repository (cloud or self-hosted). + + Args: + repo_url (str): The GitLab repo URL (e.g., "https://gitlab.com/username/repo" or "http://localhost/group/project") + file_path (str): File path within the repository (e.g., "src/main.py") + access_token (str, optional): GitLab personal access token + + Returns: + str: File content + + Raises: + ValueError: If anything fails + """ + try: + # Parse and validate the URL + parsed_url = urlparse(repo_url) + if not parsed_url.scheme or not parsed_url.netloc: + raise ValueError("Not a valid GitLab repository URL") + + gitlab_domain = f"{parsed_url.scheme}://{parsed_url.netloc}" + if parsed_url.port not in (None, 80, 443): + gitlab_domain += f":{parsed_url.port}" + path_parts = parsed_url.path.strip("/").split("/") + if len(path_parts) < 2: + raise ValueError("Invalid GitLab URL format — expected something like https://gitlab.domain.com/group/project") + + # Build project path and encode for API + project_path = "/".join(path_parts).replace(".git", "") + encoded_project_path = quote(project_path, safe='') + + # Encode file path + encoded_file_path = quote(file_path, safe='') + + # Try to get the default branch from the project info + default_branch = None + try: + project_info_url = f"{gitlab_domain}/api/v4/projects/{encoded_project_path}" + project_headers = {} + if access_token: + project_headers["PRIVATE-TOKEN"] = access_token + + project_response = requests.get(project_info_url, headers=project_headers) + if project_response.status_code == 200: + project_data = project_response.json() + default_branch = project_data.get('default_branch', 'main') + logger.info(f"Found default branch: {default_branch}") + else: + logger.warning(f"Could not fetch project info, using 'main' as default branch") + default_branch = 'main' + except Exception as e: + logger.warning(f"Error fetching project info: {e}, using 'main' as default branch") + default_branch = 'main' + + api_url = f"{gitlab_domain}/api/v4/projects/{encoded_project_path}/repository/files/{encoded_file_path}/raw?ref={default_branch}" + # Fetch file content from GitLab API + headers = {} + if access_token: + headers["PRIVATE-TOKEN"] = access_token + logger.info(f"Fetching file content from GitLab API: {api_url}") + try: + response = requests.get(api_url, headers=headers) + response.raise_for_status() + content = response.text + except RequestException as e: + raise ValueError(f"Error fetching file content: {e}") + + # Check for GitLab error response (JSON instead of raw file) + if content.startswith("{") and '"message":' in content: + try: + error_data = json.loads(content) + if "message" in error_data: + raise ValueError(f"GitLab API error: {error_data['message']}") + except json.JSONDecodeError: + pass + + return content + + except Exception as e: + raise ValueError(f"Failed to get file content: {str(e)}") + +def get_bitbucket_file_content(repo_url: str, file_path: str, access_token: str = None) -> str: + """ + Retrieves the content of a file from a Bitbucket repository using the Bitbucket API. + + Args: + repo_url (str): The URL of the Bitbucket repository (e.g., "https://bitbucket.org/username/repo") + file_path (str): The path to the file within the repository (e.g., "src/main.py") + access_token (str, optional): Bitbucket personal access token for private repositories + + Returns: + str: The content of the file as a string + """ + try: + # Extract owner and repo name from Bitbucket URL + if not (repo_url.startswith("https://bitbucket.org/") or repo_url.startswith("http://bitbucket.org/")): + raise ValueError("Not a valid Bitbucket repository URL") + + parts = repo_url.rstrip('/').split('/') + if len(parts) < 5: + raise ValueError("Invalid Bitbucket URL format") + + owner = parts[-2] + repo = parts[-1].replace(".git", "") + + # Try to get the default branch from the repository info + default_branch = None + try: + repo_info_url = f"https://api.bitbucket.org/2.0/repositories/{owner}/{repo}" + repo_headers = {} + if access_token: + repo_headers["Authorization"] = f"Bearer {access_token}" + + repo_response = requests.get(repo_info_url, headers=repo_headers) + if repo_response.status_code == 200: + repo_data = repo_response.json() + default_branch = repo_data.get('mainbranch', {}).get('name', 'main') + logger.info(f"Found default branch: {default_branch}") + else: + logger.warning(f"Could not fetch repository info, using 'main' as default branch") + default_branch = 'main' + except Exception as e: + logger.warning(f"Error fetching repository info: {e}, using 'main' as default branch") + default_branch = 'main' + + # Use Bitbucket API to get file content + # The API endpoint for getting file content is: /2.0/repositories/{owner}/{repo}/src/{branch}/{path} + api_url = f"https://api.bitbucket.org/2.0/repositories/{owner}/{repo}/src/{default_branch}/{file_path}" + + # Fetch file content from Bitbucket API + headers = {} + if access_token: + headers["Authorization"] = f"Bearer {access_token}" + logger.info(f"Fetching file content from Bitbucket API: {api_url}") + try: + response = requests.get(api_url, headers=headers) + if response.status_code == 200: + content = response.text + elif response.status_code == 404: + raise ValueError("File not found on Bitbucket. Please check the file path and repository.") + elif response.status_code == 401: + raise ValueError("Unauthorized access to Bitbucket. Please check your access token.") + elif response.status_code == 403: + raise ValueError("Forbidden access to Bitbucket. You might not have permission to access this file.") + elif response.status_code == 500: + raise ValueError("Internal server error on Bitbucket. Please try again later.") + else: + response.raise_for_status() + content = response.text + return content + except RequestException as e: + raise ValueError(f"Error fetching file content: {e}") + + except Exception as e: + raise ValueError(f"Failed to get file content: {str(e)}") + + +def get_file_content(repo_url: str, file_path: str, type: str = "github", access_token: str = None) -> str: + """ + Retrieves the content of a file from a Git repository (GitHub or GitLab). + + Args: + repo_url (str): The URL of the repository + file_path (str): The path to the file within the repository + access_token (str, optional): Access token for private repositories + + Returns: + str: The content of the file as a string + + Raises: + ValueError: If the file cannot be fetched or if the URL is not valid + """ + if type == "github": + return get_github_file_content(repo_url, file_path, access_token) + elif type == "gitlab": + return get_gitlab_file_content(repo_url, file_path, access_token) + elif type == "bitbucket": + return get_bitbucket_file_content(repo_url, file_path, access_token) + else: + raise ValueError("Unsupported repository URL. Only GitHub and GitLab are supported.") + +class DatabaseManager: + """ + Manages the creation, loading, transformation, and persistence of LocalDB instances. + """ + + def __init__(self): + self.db = None + self.repo_url_or_path = None + self.repo_paths = None + + def prepare_database(self, repo_url_or_path: str, type: str = "github", access_token: str = None, + embedder_type: str = None, is_ollama_embedder: bool = None, + excluded_dirs: List[str] = None, excluded_files: List[str] = None, + included_dirs: List[str] = None, included_files: List[str] = None) -> List[Document]: + """ + Create a new database from the repository. + + Args: + repo_url_or_path (str): The URL or local path of the repository + access_token (str, optional): Access token for private repositories + embedder_type (str, optional): Embedder type to use ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + excluded_dirs (List[str], optional): List of directories to exclude from processing + excluded_files (List[str], optional): List of file patterns to exclude from processing + included_dirs (List[str], optional): List of directories to include exclusively + included_files (List[str], optional): List of file patterns to include exclusively + + Returns: + List[Document]: List of Document objects + """ + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + + self.reset_database() + self._create_repo(repo_url_or_path, type, access_token) + return self.prepare_db_index(embedder_type=embedder_type, excluded_dirs=excluded_dirs, excluded_files=excluded_files, + included_dirs=included_dirs, included_files=included_files) + + def reset_database(self): + """ + Reset the database to its initial state. + """ + self.db = None + self.repo_url_or_path = None + self.repo_paths = None + + def _extract_repo_name_from_url(self, repo_url_or_path: str, repo_type: str) -> str: + # Extract owner and repo name to create unique identifier + url_parts = repo_url_or_path.rstrip('/').split('/') + + if repo_type in ["github", "gitlab", "bitbucket"] and len(url_parts) >= 5: + # GitHub URL format: https://github.com/owner/repo + # GitLab URL format: https://gitlab.com/owner/repo or https://gitlab.com/group/subgroup/repo + # Bitbucket URL format: https://bitbucket.org/owner/repo + owner = url_parts[-2] + repo = url_parts[-1].replace(".git", "") + repo_name = f"{owner}_{repo}" + else: + repo_name = url_parts[-1].replace(".git", "") + return repo_name + + def _create_repo(self, repo_url_or_path: str, repo_type: str = "github", access_token: str = None) -> None: + """ + Download and prepare all paths. + Paths: + ~/.adalflow/repos/{owner}_{repo_name} (for url, local path will be the same) + ~/.adalflow/databases/{owner}_{repo_name}.pkl + + Args: + repo_url_or_path (str): The URL or local path of the repository + access_token (str, optional): Access token for private repositories + """ + logger.info(f"Preparing repo storage for {repo_url_or_path}...") + + try: + root_path = get_adalflow_default_root_path() + + os.makedirs(root_path, exist_ok=True) + # url + if repo_url_or_path.startswith("https://") or repo_url_or_path.startswith("http://"): + # Extract the repository name from the URL + repo_name = self._extract_repo_name_from_url(repo_url_or_path, repo_type) + logger.info(f"Extracted repo name: {repo_name}") + + save_repo_dir = os.path.join(root_path, "repos", repo_name) + + # Check if the repository directory already exists and is not empty + if not (os.path.exists(save_repo_dir) and os.listdir(save_repo_dir)): + # Only download if the repository doesn't exist or is empty + download_repo(repo_url_or_path, save_repo_dir, repo_type, access_token) + else: + logger.info(f"Repository already exists at {save_repo_dir}. Using existing repository.") + else: # local path + repo_name = os.path.basename(repo_url_or_path) + save_repo_dir = repo_url_or_path + + save_db_file = os.path.join(root_path, "databases", f"{repo_name}.pkl") + os.makedirs(save_repo_dir, exist_ok=True) + os.makedirs(os.path.dirname(save_db_file), exist_ok=True) + + self.repo_paths = { + "save_repo_dir": save_repo_dir, + "save_db_file": save_db_file, + } + self.repo_url_or_path = repo_url_or_path + logger.info(f"Repo paths: {self.repo_paths}") + + except Exception as e: + logger.error(f"Failed to create repository structure: {e}") + raise + + def prepare_db_index(self, embedder_type: str = None, is_ollama_embedder: bool = None, + excluded_dirs: List[str] = None, excluded_files: List[str] = None, + included_dirs: List[str] = None, included_files: List[str] = None) -> List[Document]: + """ + Prepare the indexed database for the repository. + + Args: + embedder_type (str, optional): Embedder type to use ('openai', 'google', 'ollama'). + If None, will be determined from configuration. + is_ollama_embedder (bool, optional): DEPRECATED. Use embedder_type instead. + If None, will be determined from configuration. + excluded_dirs (List[str], optional): List of directories to exclude from processing + excluded_files (List[str], optional): List of file patterns to exclude from processing + included_dirs (List[str], optional): List of directories to include exclusively + included_files (List[str], optional): List of file patterns to include exclusively + + Returns: + List[Document]: List of Document objects + """ + # Handle backward compatibility + if embedder_type is None and is_ollama_embedder is not None: + embedder_type = 'ollama' if is_ollama_embedder else None + # check the database + if self.repo_paths and os.path.exists(self.repo_paths["save_db_file"]): + logger.info("Loading existing database...") + try: + self.db = LocalDB.load_state(self.repo_paths["save_db_file"]) + documents = self.db.get_transformed_data(key="split_and_embed") + if documents: + logger.info(f"Loaded {len(documents)} documents from existing database") + return documents + except Exception as e: + logger.error(f"Error loading existing database: {e}") + # Continue to create a new database + + # prepare the database + logger.info("Creating new database...") + documents = read_all_documents( + self.repo_paths["save_repo_dir"], + embedder_type=embedder_type, + excluded_dirs=excluded_dirs, + excluded_files=excluded_files, + included_dirs=included_dirs, + included_files=included_files + ) + self.db = transform_documents_and_save_to_db( + documents, self.repo_paths["save_db_file"], embedder_type=embedder_type + ) + logger.info(f"Total documents: {len(documents)}") + transformed_docs = self.db.get_transformed_data(key="split_and_embed") + logger.info(f"Total transformed documents: {len(transformed_docs)}") + return transformed_docs + + def prepare_retriever(self, repo_url_or_path: str, type: str = "github", access_token: str = None): + """ + Prepare the retriever for a repository. + This is a compatibility method for the isolated API. + + Args: + repo_url_or_path (str): The URL or local path of the repository + access_token (str, optional): Access token for private repositories + + Returns: + List[Document]: List of Document objects + """ + return self.prepare_database(repo_url_or_path, type, access_token) diff --git a/reference-deepwiki/deepwiki-open-main/api/google_embedder_client.py b/reference-deepwiki/deepwiki-open-main/api/google_embedder_client.py new file mode 100644 index 0000000..b604fd8 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/google_embedder_client.py @@ -0,0 +1,231 @@ +"""Google AI Embeddings ModelClient integration.""" + +import os +import logging +import backoff +from typing import Dict, Any, Optional, List, Sequence + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ModelType, EmbedderOutput + +try: + import google.generativeai as genai + from google.generativeai.types.text_types import EmbeddingDict, BatchEmbeddingDict +except ImportError: + raise ImportError("google-generativeai is required. Install it with 'pip install google-generativeai'") + +log = logging.getLogger(__name__) + + +class GoogleEmbedderClient(ModelClient): + __doc__ = r"""A component wrapper for Google AI Embeddings API client. + + This client provides access to Google's embedding models through the Google AI API. + It supports text embeddings for various tasks including semantic similarity, + retrieval, and classification. + + Args: + api_key (Optional[str]): Google AI API key. Defaults to None. + If not provided, will use the GOOGLE_API_KEY environment variable. + env_api_key_name (str): Environment variable name for the API key. + Defaults to "GOOGLE_API_KEY". + + Example: + ```python + from api.google_embedder_client import GoogleEmbedderClient + import adalflow as adal + + client = GoogleEmbedderClient() + embedder = adal.Embedder( + model_client=client, + model_kwargs={ + "model": "text-embedding-004", + "task_type": "SEMANTIC_SIMILARITY" + } + ) + ``` + + References: + - Google AI Embeddings: https://ai.google.dev/gemini-api/docs/embeddings + - Available models: text-embedding-004, embedding-001 + """ + + def __init__( + self, + api_key: Optional[str] = None, + env_api_key_name: str = "GOOGLE_API_KEY", + ): + """Initialize Google AI Embeddings client. + + Args: + api_key: Google AI API key. If not provided, uses environment variable. + env_api_key_name: Name of environment variable containing API key. + """ + super().__init__() + self._api_key = api_key + self._env_api_key_name = env_api_key_name + self._initialize_client() + + def _initialize_client(self): + """Initialize the Google AI client with API key.""" + api_key = self._api_key or os.getenv(self._env_api_key_name) + if not api_key: + raise ValueError( + f"Environment variable {self._env_api_key_name} must be set" + ) + genai.configure(api_key=api_key) + + def parse_embedding_response(self, response) -> EmbedderOutput: + """Parse Google AI embedding response to EmbedderOutput format. + + Args: + response: Google AI embedding response (EmbeddingDict or BatchEmbeddingDict) + + Returns: + EmbedderOutput with parsed embeddings + """ + try: + from adalflow.core.types import Embedding + + embedding_data = [] + + if isinstance(response, dict): + if 'embedding' in response: + embedding_value = response['embedding'] + if isinstance(embedding_value, list) and len(embedding_value) > 0: + # Check if it's a single embedding (list of floats) or batch (list of lists) + if isinstance(embedding_value[0], (int, float)): + # Single embedding response: {'embedding': [float, ...]} + embedding_data = [Embedding(embedding=embedding_value, index=0)] + else: + # Batch embeddings response: {'embedding': [[float, ...], [float, ...], ...]} + embedding_data = [ + Embedding(embedding=emb_list, index=i) + for i, emb_list in enumerate(embedding_value) + ] + else: + log.warning(f"Empty or invalid embedding data: {embedding_value}") + embedding_data = [] + elif 'embeddings' in response: + # Alternative batch format: {'embeddings': [{'embedding': [float, ...]}, ...]} + embedding_data = [ + Embedding(embedding=item['embedding'], index=i) + for i, item in enumerate(response['embeddings']) + ] + else: + log.warning(f"Unexpected response structure: {response.keys()}") + embedding_data = [] + elif hasattr(response, 'embeddings'): + # Custom batch response object from our implementation + embedding_data = [ + Embedding(embedding=emb, index=i) + for i, emb in enumerate(response.embeddings) + ] + else: + log.warning(f"Unexpected response type: {type(response)}") + embedding_data = [] + + return EmbedderOutput( + data=embedding_data, + error=None, + raw_response=response + ) + except Exception as e: + log.error(f"Error parsing Google AI embedding response: {e}") + return EmbedderOutput( + data=[], + error=str(e), + raw_response=response + ) + + def convert_inputs_to_api_kwargs( + self, + input: Optional[Any] = None, + model_kwargs: Dict = {}, + model_type: ModelType = ModelType.UNDEFINED, + ) -> Dict: + """Convert inputs to Google AI API format. + + Args: + input: Text input(s) to embed + model_kwargs: Model parameters including model name and task_type + model_type: Should be ModelType.EMBEDDER for this client + + Returns: + Dict: API kwargs for Google AI embedding call + """ + if model_type != ModelType.EMBEDDER: + raise ValueError(f"GoogleEmbedderClient only supports EMBEDDER model type, got {model_type}") + + # Ensure input is a list + if isinstance(input, str): + content = [input] + elif isinstance(input, Sequence): + content = list(input) + else: + raise TypeError("input must be a string or sequence of strings") + + final_model_kwargs = model_kwargs.copy() + + # Handle single vs batch embedding + if len(content) == 1: + final_model_kwargs["content"] = content[0] + else: + final_model_kwargs["contents"] = content + + # Set default task type if not provided + if "task_type" not in final_model_kwargs: + final_model_kwargs["task_type"] = "SEMANTIC_SIMILARITY" + + # Set default model if not provided + if "model" not in final_model_kwargs: + final_model_kwargs["model"] = "text-embedding-004" + + return final_model_kwargs + + @backoff.on_exception( + backoff.expo, + (Exception,), # Google AI may raise various exceptions + max_time=5, + ) + def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """Call Google AI embedding API. + + Args: + api_kwargs: API parameters + model_type: Should be ModelType.EMBEDDER + + Returns: + Google AI embedding response + """ + if model_type != ModelType.EMBEDDER: + raise ValueError(f"GoogleEmbedderClient only supports EMBEDDER model type") + + log.info(f"Google AI Embeddings API kwargs: {api_kwargs}") + + try: + # Use embed_content for single text or batch embedding + if "content" in api_kwargs: + # Single embedding + response = genai.embed_content(**api_kwargs) + elif "contents" in api_kwargs: + # Batch embedding - Google AI supports batch natively + contents = api_kwargs.pop("contents") + response = genai.embed_content(content=contents, **api_kwargs) + else: + raise ValueError("Either 'content' or 'contents' must be provided") + + return response + + except Exception as e: + log.error(f"Error calling Google AI Embeddings API: {e}") + raise + + async def acall(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """Async call to Google AI embedding API. + + Note: Google AI Python client doesn't have async support yet, + so this falls back to synchronous call. + """ + # Google AI client doesn't have async support yet + return self.call(api_kwargs, model_type) \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/api/logging_config.py b/reference-deepwiki/deepwiki-open-main/api/logging_config.py new file mode 100644 index 0000000..d2726c6 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/logging_config.py @@ -0,0 +1,85 @@ +import logging +import os +from pathlib import Path +from logging.handlers import RotatingFileHandler + + +class IgnoreLogChangeDetectedFilter(logging.Filter): + def filter(self, record: logging.LogRecord): + return "Detected file change in" not in record.getMessage() + + +def setup_logging(format: str = None): + """ + Configure logging for the application with log rotation. + + Environment variables: + LOG_LEVEL: Log level (default: INFO) + LOG_FILE_PATH: Path to log file (default: logs/application.log) + LOG_MAX_SIZE: Max size in MB before rotating (default: 10MB) + LOG_BACKUP_COUNT: Number of backup files to keep (default: 5) + + Ensures log directory exists, prevents path traversal, and configures + both rotating file and console handlers. + """ + # Determine log directory and default file path + base_dir = Path(__file__).parent + log_dir = base_dir / "logs" + log_dir.mkdir(parents=True, exist_ok=True) + default_log_file = log_dir / "application.log" + + # Get log level from environment + log_level_str = os.environ.get("LOG_LEVEL", "INFO").upper() + log_level = getattr(logging, log_level_str, logging.INFO) + + # Get log file path + log_file_path = Path(os.environ.get("LOG_FILE_PATH", str(default_log_file))) + + # Secure path check: must be inside logs/ directory + log_dir_resolved = log_dir.resolve() + resolved_path = log_file_path.resolve() + if not str(resolved_path).startswith(str(log_dir_resolved) + os.sep): + raise ValueError(f"LOG_FILE_PATH '{log_file_path}' is outside the trusted log directory '{log_dir_resolved}'") + + # Ensure parent directories exist + resolved_path.parent.mkdir(parents=True, exist_ok=True) + + # Get max log file size (default: 10MB) + try: + max_mb = int(os.environ.get("LOG_MAX_SIZE", 10)) # 10MB default + max_bytes = max_mb * 1024 * 1024 + except (TypeError, ValueError): + max_bytes = 10 * 1024 * 1024 # fallback to 10MB on error + + # Get backup count (default: 5) + try: + backup_count = int(os.environ.get("LOG_BACKUP_COUNT", 5)) + except ValueError: + backup_count = 5 + + # Configure format + log_format = format or "%(asctime)s - %(levelname)s - %(name)s - %(filename)s:%(lineno)d - %(message)s" + + # Create handlers + file_handler = RotatingFileHandler(resolved_path, maxBytes=max_bytes, backupCount=backup_count, encoding="utf-8") + console_handler = logging.StreamHandler() + + # Set format for both handlers + formatter = logging.Formatter(log_format) + file_handler.setFormatter(formatter) + console_handler.setFormatter(formatter) + + # Add filter to suppress "Detected file change" messages + file_handler.addFilter(IgnoreLogChangeDetectedFilter()) + console_handler.addFilter(IgnoreLogChangeDetectedFilter()) + + # Apply logging configuration + logging.basicConfig(level=log_level, handlers=[file_handler, console_handler], force=True) + + # Log configuration info + logger = logging.getLogger(__name__) + logger.debug( + f"Logging configured: level={log_level_str}, " + f"file={resolved_path}, max_size={max_bytes} bytes, " + f"backup_count={backup_count}" + ) diff --git a/reference-deepwiki/deepwiki-open-main/api/main.py b/reference-deepwiki/deepwiki-open-main/api/main.py new file mode 100644 index 0000000..791e31b --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/main.py @@ -0,0 +1,79 @@ +import os +import sys +import logging +from dotenv import load_dotenv + +# Load environment variables from .env file +load_dotenv() + +from api.logging_config import setup_logging + +# Configure logging +setup_logging() +logger = logging.getLogger(__name__) + +# Configure watchfiles logger to show file paths +watchfiles_logger = logging.getLogger("watchfiles.main") +watchfiles_logger.setLevel(logging.DEBUG) # Enable DEBUG to see file paths + +# Add the current directory to the path so we can import the api package +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Apply watchfiles monkey patch BEFORE uvicorn import +is_development = os.environ.get("NODE_ENV") != "production" +if is_development: + import watchfiles + current_dir = os.path.dirname(os.path.abspath(__file__)) + logs_dir = os.path.join(current_dir, "logs") + + original_watch = watchfiles.watch + def patched_watch(*args, **kwargs): + # Only watch the api directory but exclude logs subdirectory + # Instead of watching the entire api directory, watch specific subdirectories + api_subdirs = [] + for item in os.listdir(current_dir): + item_path = os.path.join(current_dir, item) + if os.path.isdir(item_path) and item != "logs": + api_subdirs.append(item_path) + + # Also add Python files in the api root directory + api_subdirs.append(current_dir + "/*.py") + + return original_watch(*api_subdirs, **kwargs) + watchfiles.watch = patched_watch + +import uvicorn + +# Check for required environment variables +required_env_vars = ['GOOGLE_API_KEY', 'OPENAI_API_KEY'] +missing_vars = [var for var in required_env_vars if not os.environ.get(var)] +if missing_vars: + logger.warning(f"Missing environment variables: {', '.join(missing_vars)}") + logger.warning("Some functionality may not work correctly without these variables.") + +# Configure Google Generative AI +import google.generativeai as genai +from api.config import GOOGLE_API_KEY + +if GOOGLE_API_KEY: + genai.configure(api_key=GOOGLE_API_KEY) +else: + logger.warning("GOOGLE_API_KEY not configured") + +if __name__ == "__main__": + # Get port from environment variable or use default + port = int(os.environ.get("PORT", 8001)) + + # Import the app here to ensure environment variables are set first + from api.api import app + + logger.info(f"Starting Streaming API on port {port}") + + # Run the FastAPI app with uvicorn + uvicorn.run( + "api.api:app", + host="0.0.0.0", + port=port, + reload=is_development, + reload_excludes=["**/logs/*", "**/__pycache__/*", "**/*.pyc"] if is_development else None, + ) diff --git a/reference-deepwiki/deepwiki-open-main/api/ollama_patch.py b/reference-deepwiki/deepwiki-open-main/api/ollama_patch.py new file mode 100644 index 0000000..fb985df --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/ollama_patch.py @@ -0,0 +1,105 @@ +from typing import Sequence, List +from copy import deepcopy +from tqdm import tqdm +import logging +import adalflow as adal +from adalflow.core.types import Document +from adalflow.core.component import DataComponent +import requests +import os + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +logger = logging.getLogger(__name__) + +class OllamaModelNotFoundError(Exception): + """Custom exception for when Ollama model is not found""" + pass + +def check_ollama_model_exists(model_name: str, ollama_host: str = None) -> bool: + """ + Check if an Ollama model exists before attempting to use it. + + Args: + model_name: Name of the model to check + ollama_host: Ollama host URL, defaults to localhost:11434 + + Returns: + bool: True if model exists, False otherwise + """ + if ollama_host is None: + ollama_host = os.getenv("OLLAMA_HOST", "http://localhost:11434") + + try: + # Remove /api prefix if present and add it back + if ollama_host.endswith('/api'): + ollama_host = ollama_host[:-4] + + response = requests.get(f"{ollama_host}/api/tags", timeout=5) + if response.status_code == 200: + models_data = response.json() + available_models = [model.get('name', '').split(':')[0] for model in models_data.get('models', [])] + model_base_name = model_name.split(':')[0] # Remove tag if present + + is_available = model_base_name in available_models + if is_available: + logger.info(f"Ollama model '{model_name}' is available") + else: + logger.warning(f"Ollama model '{model_name}' is not available. Available models: {available_models}") + return is_available + else: + logger.warning(f"Could not check Ollama models, status code: {response.status_code}") + return False + except requests.exceptions.RequestException as e: + logger.warning(f"Could not connect to Ollama to check models: {e}") + return False + except Exception as e: + logger.warning(f"Error checking Ollama model availability: {e}") + return False + +class OllamaDocumentProcessor(DataComponent): + """ + Process documents for Ollama embeddings by processing one document at a time. + Adalflow Ollama Client does not support batch embedding, so we need to process each document individually. + """ + def __init__(self, embedder: adal.Embedder) -> None: + super().__init__() + self.embedder = embedder + + def __call__(self, documents: Sequence[Document]) -> Sequence[Document]: + output = deepcopy(documents) + logger.info(f"Processing {len(output)} documents individually for Ollama embeddings") + + successful_docs = [] + expected_embedding_size = None + + for i, doc in enumerate(tqdm(output, desc="Processing documents for Ollama embeddings")): + try: + # Get embedding for a single document + result = self.embedder(input=doc.text) + if result.data and len(result.data) > 0: + embedding = result.data[0].embedding + + # Validate embedding size consistency + if expected_embedding_size is None: + expected_embedding_size = len(embedding) + logger.info(f"Expected embedding size set to: {expected_embedding_size}") + elif len(embedding) != expected_embedding_size: + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.warning(f"Document '{file_path}' has inconsistent embedding size {len(embedding)} != {expected_embedding_size}, skipping") + continue + + # Assign the embedding to the document + output[i].vector = embedding + successful_docs.append(output[i]) + else: + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.warning(f"Failed to get embedding for document '{file_path}', skipping") + except Exception as e: + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.error(f"Error processing document '{file_path}': {e}, skipping") + + logger.info(f"Successfully processed {len(successful_docs)}/{len(output)} documents with consistent embeddings") + return successful_docs \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/api/openai_client.py b/reference-deepwiki/deepwiki-open-main/api/openai_client.py new file mode 100644 index 0000000..bc75ed5 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/openai_client.py @@ -0,0 +1,629 @@ +"""OpenAI ModelClient integration.""" + +import os +import base64 +from typing import ( + Dict, + Sequence, + Optional, + List, + Any, + TypeVar, + Callable, + Generator, + Union, + Literal, +) +import re + +import logging +import backoff + +# optional import +from adalflow.utils.lazy_import import safe_import, OptionalPackages +from openai.types.chat.chat_completion import Choice + +openai = safe_import(OptionalPackages.OPENAI.value[0], OptionalPackages.OPENAI.value[1]) + +from openai import OpenAI, AsyncOpenAI, Stream +from openai import ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, +) +from openai.types import ( + Completion, + CreateEmbeddingResponse, + Image, +) +from openai.types.chat import ChatCompletionChunk, ChatCompletion, ChatCompletionMessage + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ( + ModelType, + EmbedderOutput, + TokenLogProb, + CompletionUsage, + GeneratorOutput, +) +from adalflow.components.model_client.utils import parse_embedding_response + +log = logging.getLogger(__name__) +T = TypeVar("T") + + +# completion parsing functions and you can combine them into one singple chat completion parser +def get_first_message_content(completion: ChatCompletion) -> str: + r"""When we only need the content of the first message. + It is the default parser for chat completion.""" + log.debug(f"raw completion: {completion}") + return completion.choices[0].message.content + + +# def _get_chat_completion_usage(completion: ChatCompletion) -> OpenAICompletionUsage: +# return completion.usage + + +# A simple heuristic to estimate token count for estimating number of tokens in a Streaming response +def estimate_token_count(text: str) -> int: + """ + Estimate the token count of a given text. + + Args: + text (str): The text to estimate token count for. + + Returns: + int: Estimated token count. + """ + # Split the text into tokens using spaces as a simple heuristic + tokens = text.split() + + # Return the number of tokens + return len(tokens) + + +def parse_stream_response(completion: ChatCompletionChunk) -> str: + r"""Parse the response of the stream API.""" + return completion.choices[0].delta.content + + +def handle_streaming_response(generator: Stream[ChatCompletionChunk]): + r"""Handle the streaming response.""" + for completion in generator: + log.debug(f"Raw chunk completion: {completion}") + parsed_content = parse_stream_response(completion) + yield parsed_content + + +def get_all_messages_content(completion: ChatCompletion) -> List[str]: + r"""When the n > 1, get all the messages content.""" + return [c.message.content for c in completion.choices] + + +def get_probabilities(completion: ChatCompletion) -> List[List[TokenLogProb]]: + r"""Get the probabilities of each token in the completion.""" + log_probs = [] + for c in completion.choices: + content = c.logprobs.content + print(content) + log_probs_for_choice = [] + for openai_token_logprob in content: + token = openai_token_logprob.token + logprob = openai_token_logprob.logprob + log_probs_for_choice.append(TokenLogProb(token=token, logprob=logprob)) + log_probs.append(log_probs_for_choice) + return log_probs + + +class OpenAIClient(ModelClient): + __doc__ = r"""A component wrapper for the OpenAI API client. + + Supports both embedding and chat completion APIs, including multimodal capabilities. + + Users can: + 1. Simplify use of ``Embedder`` and ``Generator`` components by passing `OpenAIClient()` as the `model_client`. + 2. Use this as a reference to create their own API client or extend this class by copying and modifying the code. + + Note: + We recommend avoiding `response_format` to enforce output data type or `tools` and `tool_choice` in `model_kwargs` when calling the API. + OpenAI's internal formatting and added prompts are unknown. Instead: + - Use :ref:`OutputParser` for response parsing and formatting. + + For multimodal inputs, provide images in `model_kwargs["images"]` as a path, URL, or list of them. + The model must support vision capabilities (e.g., `gpt-4o`, `gpt-4o-mini`, `o1`, `o1-mini`). + + For image generation, use `model_type=ModelType.IMAGE_GENERATION` and provide: + - model: `"dall-e-3"` or `"dall-e-2"` + - prompt: Text description of the image to generate + - size: `"1024x1024"`, `"1024x1792"`, or `"1792x1024"` for DALL-E 3; `"256x256"`, `"512x512"`, or `"1024x1024"` for DALL-E 2 + - quality: `"standard"` or `"hd"` (DALL-E 3 only) + - n: Number of images to generate (1 for DALL-E 3, 1-10 for DALL-E 2) + - response_format: `"url"` or `"b64_json"` + + Args: + api_key (Optional[str], optional): OpenAI API key. Defaults to `None`. + chat_completion_parser (Callable[[Completion], Any], optional): A function to parse the chat completion into a `str`. Defaults to `None`. + The default parser is `get_first_message_content`. + base_url (str): The API base URL to use when initializing the client. + Defaults to `"https://api.openai.com"`, but can be customized for third-party API providers or self-hosted models. + env_api_key_name (str): The environment variable name for the API key. Defaults to `"OPENAI_API_KEY"`. + + References: + - OpenAI API Overview: https://platform.openai.com/docs/introduction + - Embeddings Guide: https://platform.openai.com/docs/guides/embeddings + - Chat Completion Models: https://platform.openai.com/docs/guides/text-generation + - Vision Models: https://platform.openai.com/docs/guides/vision + - Image Generation: https://platform.openai.com/docs/guides/images + """ + + def __init__( + self, + api_key: Optional[str] = None, + chat_completion_parser: Callable[[Completion], Any] = None, + input_type: Literal["text", "messages"] = "text", + base_url: Optional[str] = None, + env_base_url_name: str = "OPENAI_BASE_URL", + env_api_key_name: str = "OPENAI_API_KEY", + ): + r"""It is recommended to set the OPENAI_API_KEY environment variable instead of passing it as an argument. + + Args: + api_key (Optional[str], optional): OpenAI API key. Defaults to None. + base_url (str): The API base URL to use when initializing the client. + env_api_key_name (str): The environment variable name for the API key. Defaults to `"OPENAI_API_KEY"`. + """ + super().__init__() + self._api_key = api_key + self._env_api_key_name = env_api_key_name + self._env_base_url_name = env_base_url_name + self.base_url = base_url or os.getenv(self._env_base_url_name, "https://api.openai.com/v1") + self.sync_client = self.init_sync_client() + self.async_client = None # only initialize if the async call is called + self.chat_completion_parser = ( + chat_completion_parser or get_first_message_content + ) + self._input_type = input_type + self._api_kwargs = {} # add api kwargs when the OpenAI Client is called + + def init_sync_client(self): + api_key = self._api_key or os.getenv(self._env_api_key_name) + if not api_key: + raise ValueError( + f"Environment variable {self._env_api_key_name} must be set" + ) + return OpenAI(api_key=api_key, base_url=self.base_url) + + def init_async_client(self): + api_key = self._api_key or os.getenv(self._env_api_key_name) + if not api_key: + raise ValueError( + f"Environment variable {self._env_api_key_name} must be set" + ) + return AsyncOpenAI(api_key=api_key, base_url=self.base_url) + + # def _parse_chat_completion(self, completion: ChatCompletion) -> "GeneratorOutput": + # # TODO: raw output it is better to save the whole completion as a source of truth instead of just the message + # try: + # data = self.chat_completion_parser(completion) + # usage = self.track_completion_usage(completion) + # return GeneratorOutput( + # data=data, error=None, raw_response=str(data), usage=usage + # ) + # except Exception as e: + # log.error(f"Error parsing the completion: {e}") + # return GeneratorOutput(data=None, error=str(e), raw_response=completion) + + def parse_chat_completion( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> "GeneratorOutput": + """Parse the completion, and put it into the raw_response.""" + log.debug(f"completion: {completion}, parser: {self.chat_completion_parser}") + try: + data = self.chat_completion_parser(completion) + except Exception as e: + log.error(f"Error parsing the completion: {e}") + return GeneratorOutput(data=None, error=str(e), raw_response=completion) + + try: + usage = self.track_completion_usage(completion) + return GeneratorOutput( + data=None, error=None, raw_response=data, usage=usage + ) + except Exception as e: + log.error(f"Error tracking the completion usage: {e}") + return GeneratorOutput(data=None, error=str(e), raw_response=data) + + def track_completion_usage( + self, + completion: Union[ChatCompletion, Generator[ChatCompletionChunk, None, None]], + ) -> CompletionUsage: + + try: + usage: CompletionUsage = CompletionUsage( + completion_tokens=completion.usage.completion_tokens, + prompt_tokens=completion.usage.prompt_tokens, + total_tokens=completion.usage.total_tokens, + ) + return usage + except Exception as e: + log.error(f"Error tracking the completion usage: {e}") + return CompletionUsage( + completion_tokens=None, prompt_tokens=None, total_tokens=None + ) + + def parse_embedding_response( + self, response: CreateEmbeddingResponse + ) -> EmbedderOutput: + r"""Parse the embedding response to a structure Adalflow components can understand. + + Should be called in ``Embedder``. + """ + try: + return parse_embedding_response(response) + except Exception as e: + log.error(f"Error parsing the embedding response: {e}") + return EmbedderOutput(data=[], error=str(e), raw_response=response) + + def convert_inputs_to_api_kwargs( + self, + input: Optional[Any] = None, + model_kwargs: Dict = {}, + model_type: ModelType = ModelType.UNDEFINED, + ) -> Dict: + r""" + Specify the API input type and output api_kwargs that will be used in _call and _acall methods. + Convert the Component's standard input, and system_input(chat model) and model_kwargs into API-specific format. + For multimodal inputs, images can be provided in model_kwargs["images"] as a string path, URL, or list of them. + The model specified in model_kwargs["model"] must support multimodal capabilities when using images. + + Args: + input: The input text or messages to process + model_kwargs: Additional parameters including: + - images: Optional image source(s) as path, URL, or list of them + - detail: Image detail level ('auto', 'low', or 'high'), defaults to 'auto' + - model: The model to use (must support multimodal inputs if images are provided) + model_type: The type of model (EMBEDDER or LLM) + + Returns: + Dict: API-specific kwargs for the model call + """ + + final_model_kwargs = model_kwargs.copy() + if model_type == ModelType.EMBEDDER: + if isinstance(input, str): + input = [input] + # convert input to input + if not isinstance(input, Sequence): + raise TypeError("input must be a sequence of text") + final_model_kwargs["input"] = input + elif model_type == ModelType.LLM: + # convert input to messages + messages: List[Dict[str, str]] = [] + images = final_model_kwargs.pop("images", None) + detail = final_model_kwargs.pop("detail", "auto") + + if self._input_type == "messages": + system_start_tag = "" + system_end_tag = "" + user_start_tag = "" + user_end_tag = "" + + # new regex pattern to ignore special characters such as \n + pattern = ( + rf"{system_start_tag}\s*(.*?)\s*{system_end_tag}\s*" + rf"{user_start_tag}\s*(.*?)\s*{user_end_tag}" + ) + + # Compile the regular expression + + # re.DOTALL is to allow . to match newline so that (.*?) does not match in a single line + regex = re.compile(pattern, re.DOTALL) + # Match the pattern + match = regex.match(input) + system_prompt, input_str = None, None + + if match: + system_prompt = match.group(1) + input_str = match.group(2) + else: + print("No match found.") + if system_prompt and input_str: + messages.append({"role": "system", "content": system_prompt}) + if images: + content = [{"type": "text", "text": input_str}] + if isinstance(images, (str, dict)): + images = [images] + for img in images: + content.append(self._prepare_image_content(img, detail)) + messages.append({"role": "user", "content": content}) + else: + messages.append({"role": "user", "content": input_str}) + if len(messages) == 0: + if images: + content = [{"type": "text", "text": input}] + if isinstance(images, (str, dict)): + images = [images] + for img in images: + content.append(self._prepare_image_content(img, detail)) + messages.append({"role": "user", "content": content}) + else: + messages.append({"role": "user", "content": input}) + final_model_kwargs["messages"] = messages + elif model_type == ModelType.IMAGE_GENERATION: + # For image generation, input is the prompt + final_model_kwargs["prompt"] = input + # Ensure model is specified + if "model" not in final_model_kwargs: + raise ValueError("model must be specified for image generation") + # Set defaults for DALL-E 3 if not specified + final_model_kwargs["size"] = final_model_kwargs.get("size", "1024x1024") + final_model_kwargs["quality"] = final_model_kwargs.get( + "quality", "standard" + ) + final_model_kwargs["n"] = final_model_kwargs.get("n", 1) + final_model_kwargs["response_format"] = final_model_kwargs.get( + "response_format", "url" + ) + + # Handle image edits and variations + image = final_model_kwargs.get("image") + if isinstance(image, str) and os.path.isfile(image): + final_model_kwargs["image"] = self._encode_image(image) + + mask = final_model_kwargs.get("mask") + if isinstance(mask, str) and os.path.isfile(mask): + final_model_kwargs["mask"] = self._encode_image(mask) + else: + raise ValueError(f"model_type {model_type} is not supported") + + return final_model_kwargs + + def parse_image_generation_response(self, response: List[Image]) -> GeneratorOutput: + """Parse the image generation response into a GeneratorOutput.""" + try: + # Extract URLs or base64 data from the response + data = [img.url or img.b64_json for img in response] + # For single image responses, unwrap from list + if len(data) == 1: + data = data[0] + return GeneratorOutput( + data=data, + raw_response=str(response), + ) + except Exception as e: + log.error(f"Error parsing image generation response: {e}") + return GeneratorOutput(data=None, error=str(e), raw_response=str(response)) + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED): + """ + kwargs is the combined input and model_kwargs. Support streaming call. + """ + log.info(f"api_kwargs: {api_kwargs}") + self._api_kwargs = api_kwargs + if model_type == ModelType.EMBEDDER: + return self.sync_client.embeddings.create(**api_kwargs) + elif model_type == ModelType.LLM: + if "stream" in api_kwargs and api_kwargs.get("stream", False): + log.debug("streaming call") + self.chat_completion_parser = handle_streaming_response + return self.sync_client.chat.completions.create(**api_kwargs) + else: + log.debug("non-streaming call converted to streaming") + # Make a copy of api_kwargs to avoid modifying the original + streaming_kwargs = api_kwargs.copy() + streaming_kwargs["stream"] = True + + # Get streaming response + stream_response = self.sync_client.chat.completions.create(**streaming_kwargs) + + # Accumulate all content from the stream + accumulated_content = "" + id = "" + model = "" + created = 0 + for chunk in stream_response: + id = getattr(chunk, "id", None) or id + model = getattr(chunk, "model", None) or model + created = getattr(chunk, "created", 0) or created + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + accumulated_content += text or "" + # Return the mock completion object that will be processed by the chat_completion_parser + return ChatCompletion( + id = id, + model=model, + created=created, + object="chat.completion", + choices=[Choice( + index=0, + finish_reason="stop", + message=ChatCompletionMessage(content=accumulated_content, role="assistant") + )] + ) + elif model_type == ModelType.IMAGE_GENERATION: + # Determine which image API to call based on the presence of image/mask + if "image" in api_kwargs: + if "mask" in api_kwargs: + # Image edit + response = self.sync_client.images.edit(**api_kwargs) + else: + # Image variation + response = self.sync_client.images.create_variation(**api_kwargs) + else: + # Image generation + response = self.sync_client.images.generate(**api_kwargs) + return response.data + else: + raise ValueError(f"model_type {model_type} is not supported") + + @backoff.on_exception( + backoff.expo, + ( + APITimeoutError, + InternalServerError, + RateLimitError, + UnprocessableEntityError, + BadRequestError, + ), + max_time=5, + ) + async def acall( + self, api_kwargs: Dict = {}, model_type: ModelType = ModelType.UNDEFINED + ): + """ + kwargs is the combined input and model_kwargs + """ + # store the api kwargs in the client + self._api_kwargs = api_kwargs + if self.async_client is None: + self.async_client = self.init_async_client() + if model_type == ModelType.EMBEDDER: + return await self.async_client.embeddings.create(**api_kwargs) + elif model_type == ModelType.LLM: + return await self.async_client.chat.completions.create(**api_kwargs) + elif model_type == ModelType.IMAGE_GENERATION: + # Determine which image API to call based on the presence of image/mask + if "image" in api_kwargs: + if "mask" in api_kwargs: + # Image edit + response = await self.async_client.images.edit(**api_kwargs) + else: + # Image variation + response = await self.async_client.images.create_variation( + **api_kwargs + ) + else: + # Image generation + response = await self.async_client.images.generate(**api_kwargs) + return response.data + else: + raise ValueError(f"model_type {model_type} is not supported") + + @classmethod + def from_dict(cls: type[T], data: Dict[str, Any]) -> T: + obj = super().from_dict(data) + # recreate the existing clients + obj.sync_client = obj.init_sync_client() + obj.async_client = obj.init_async_client() + return obj + + def to_dict(self) -> Dict[str, Any]: + r"""Convert the component to a dictionary.""" + # TODO: not exclude but save yes or no for recreating the clients + exclude = [ + "sync_client", + "async_client", + ] # unserializable object + output = super().to_dict(exclude=exclude) + return output + + def _encode_image(self, image_path: str) -> str: + """Encode image to base64 string. + + Args: + image_path: Path to image file. + + Returns: + Base64 encoded image string. + + Raises: + ValueError: If the file cannot be read or doesn't exist. + """ + try: + with open(image_path, "rb") as image_file: + return base64.b64encode(image_file.read()).decode("utf-8") + except FileNotFoundError: + raise ValueError(f"Image file not found: {image_path}") + except PermissionError: + raise ValueError(f"Permission denied when reading image file: {image_path}") + except Exception as e: + raise ValueError(f"Error encoding image {image_path}: {str(e)}") + + def _prepare_image_content( + self, image_source: Union[str, Dict[str, Any]], detail: str = "auto" + ) -> Dict[str, Any]: + """Prepare image content for API request. + + Args: + image_source: Either a path to local image or a URL. + detail: Image detail level ('auto', 'low', or 'high'). + + Returns: + Formatted image content for API request. + """ + if isinstance(image_source, str): + if image_source.startswith(("http://", "https://")): + return { + "type": "image_url", + "image_url": {"url": image_source, "detail": detail}, + } + else: + base64_image = self._encode_image(image_source) + return { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{base64_image}", + "detail": detail, + }, + } + return image_source + + +# Example usage: +if __name__ == "__main__": + from adalflow.core import Generator + from adalflow.utils import setup_env + + # log = get_logger(level="DEBUG") + + setup_env() + prompt_kwargs = {"input_str": "What is the meaning of life?"} + + gen = Generator( + model_client=OpenAIClient(), + model_kwargs={"model": "gpt-4o", "stream": False}, + ) + gen_response = gen(prompt_kwargs) + print(f"gen_response: {gen_response}") + + # for genout in gen_response.data: + # print(f"genout: {genout}") + + # test that to_dict and from_dict works + # model_client = OpenAIClient() + # model_client_dict = model_client.to_dict() + # from_dict_model_client = OpenAIClient.from_dict(model_client_dict) + # assert model_client_dict == from_dict_model_client.to_dict() + + +if __name__ == "__main__": + import adalflow as adal + + # setup env or pass the api_key + from adalflow.utils import setup_env + + setup_env() + + openai_llm = adal.Generator( + model_client=OpenAIClient(), model_kwargs={"model": "gpt-4o"} + ) + resopnse = openai_llm(prompt_kwargs={"input_str": "What is LLM?"}) + print(resopnse) diff --git a/reference-deepwiki/deepwiki-open-main/api/openrouter_client.py b/reference-deepwiki/deepwiki-open-main/api/openrouter_client.py new file mode 100644 index 0000000..b71c477 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/openrouter_client.py @@ -0,0 +1,525 @@ +"""OpenRouter ModelClient integration.""" + +from typing import Dict, Sequence, Optional, Any, List +import logging +import json +import aiohttp +import requests +from requests.exceptions import RequestException, Timeout + +from adalflow.core.model_client import ModelClient +from adalflow.core.types import ( + CompletionUsage, + ModelType, + GeneratorOutput, +) + +log = logging.getLogger(__name__) + +class OpenRouterClient(ModelClient): + __doc__ = r"""A component wrapper for the OpenRouter API client. + + OpenRouter provides a unified API that gives access to hundreds of AI models through a single endpoint. + The API is compatible with OpenAI's API format with a few small differences. + + Visit https://openrouter.ai/docs for more details. + + Example: + ```python + from api.openrouter_client import OpenRouterClient + + client = OpenRouterClient() + generator = adal.Generator( + model_client=client, + model_kwargs={"model": "openai/gpt-4o"} + ) + ``` + """ + + def __init__(self, *args, **kwargs) -> None: + """Initialize the OpenRouter client.""" + super().__init__(*args, **kwargs) + self.sync_client = self.init_sync_client() + self.async_client = None # Initialize async client only when needed + + def init_sync_client(self): + """Initialize the synchronous OpenRouter client.""" + from api.config import OPENROUTER_API_KEY + api_key = OPENROUTER_API_KEY + if not api_key: + log.warning("OPENROUTER_API_KEY not configured") + + # OpenRouter doesn't have a dedicated client library, so we'll use requests directly + return { + "api_key": api_key, + "base_url": "https://openrouter.ai/api/v1" + } + + def init_async_client(self): + """Initialize the asynchronous OpenRouter client.""" + from api.config import OPENROUTER_API_KEY + api_key = OPENROUTER_API_KEY + if not api_key: + log.warning("OPENROUTER_API_KEY not configured") + + # For async, we'll use aiohttp + return { + "api_key": api_key, + "base_url": "https://openrouter.ai/api/v1" + } + + def convert_inputs_to_api_kwargs( + self, input: Any, model_kwargs: Dict = None, model_type: ModelType = None + ) -> Dict: + """Convert AdalFlow inputs to OpenRouter API format.""" + model_kwargs = model_kwargs or {} + + if model_type == ModelType.LLM: + # Handle LLM generation + messages = [] + + # Convert input to messages format if it's a string + if isinstance(input, str): + messages = [{"role": "user", "content": input}] + elif isinstance(input, list) and all(isinstance(msg, dict) for msg in input): + messages = input + else: + raise ValueError(f"Unsupported input format for OpenRouter: {type(input)}") + + # For debugging + log.info(f"Messages for OpenRouter: {messages}") + + api_kwargs = { + "messages": messages, + **model_kwargs + } + + # Ensure model is specified + if "model" not in api_kwargs: + api_kwargs["model"] = "openai/gpt-3.5-turbo" + + return api_kwargs + + elif model_type == ModelType.EMBEDDING: + # OpenRouter doesn't support embeddings directly + # We could potentially use a specific model through OpenRouter for embeddings + # but for now, we'll raise an error + raise NotImplementedError("OpenRouter client does not support embeddings yet") + + else: + raise ValueError(f"Unsupported model type: {model_type}") + + async def acall(self, api_kwargs: Dict = None, model_type: ModelType = None) -> Any: + """Make an asynchronous call to the OpenRouter API.""" + if not self.async_client: + self.async_client = self.init_async_client() + + # Check if API key is set + if not self.async_client.get("api_key"): + error_msg = "OPENROUTER_API_KEY not configured. Please set this environment variable to use OpenRouter." + log.error(error_msg) + # Instead of raising an exception, return a generator that yields the error message + # This allows the error to be displayed to the user in the streaming response + async def error_generator(): + yield error_msg + return error_generator() + + api_kwargs = api_kwargs or {} + + if model_type == ModelType.LLM: + # Prepare headers + headers = { + "Authorization": f"Bearer {self.async_client['api_key']}", + "Content-Type": "application/json", + "HTTP-Referer": "https://github.com/AsyncFuncAI/deepwiki-open", # Optional + "X-Title": "DeepWiki" # Optional + } + + # Always use non-streaming mode for OpenRouter + api_kwargs["stream"] = False + + # Make the API call + try: + log.info(f"Making async OpenRouter API call to {self.async_client['base_url']}/chat/completions") + log.info(f"Request headers: {headers}") + log.info(f"Request body: {api_kwargs}") + + async with aiohttp.ClientSession() as session: + try: + async with session.post( + f"{self.async_client['base_url']}/chat/completions", + headers=headers, + json=api_kwargs, + timeout=60 + ) as response: + if response.status != 200: + error_text = await response.text() + log.error(f"OpenRouter API error ({response.status}): {error_text}") + + # Return a generator that yields the error message + async def error_response_generator(): + yield f"OpenRouter API error ({response.status}): {error_text}" + return error_response_generator() + + # Get the full response + data = await response.json() + log.info(f"Received response from OpenRouter: {data}") + + # Create a generator that yields the content + async def content_generator(): + if "choices" in data and len(data["choices"]) > 0: + choice = data["choices"][0] + if "message" in choice and "content" in choice["message"]: + content = choice["message"]["content"] + log.info("Successfully retrieved response") + + # Check if the content is XML and ensure it's properly formatted + if content.strip().startswith("<") and ">" in content: + # It's likely XML, let's make sure it's properly formatted + try: + # Extract the XML content + xml_content = content + + # Check if it's a wiki_structure XML + if "" in xml_content: + log.info("Found wiki_structure XML, ensuring proper format") + + # Extract just the wiki_structure XML + import re + wiki_match = re.search(r'[\s\S]*?<\/wiki_structure>', xml_content) + if wiki_match: + # Get the raw XML + raw_xml = wiki_match.group(0) + + # Clean the XML by removing any leading/trailing whitespace + # and ensuring it's properly formatted + clean_xml = raw_xml.strip() + + # Try to fix common XML issues + try: + # Replace problematic characters in XML + fixed_xml = clean_xml + + # Replace & with & if not already part of an entity + fixed_xml = re.sub(r'&(?!amp;|lt;|gt;|apos;|quot;)', '&', fixed_xml) + + # Fix other common XML issues + fixed_xml = fixed_xml.replace('', '>') + + # Try to parse the fixed XML + from xml.dom.minidom import parseString + dom = parseString(fixed_xml) + + # Get the pretty-printed XML with proper indentation + pretty_xml = dom.toprettyxml() + + # Remove XML declaration + if pretty_xml.startswith('')+2:].strip() + + log.info(f"Extracted and validated XML: {pretty_xml[:100]}...") + yield pretty_xml + except Exception as xml_parse_error: + log.warning(f"XML validation failed: {str(xml_parse_error)}, using raw XML") + + # If XML validation fails, try a more aggressive approach + try: + # Use regex to extract just the structure without any problematic characters + import re + + # Extract the basic structure + structure_match = re.search(r'(.*?)', clean_xml, re.DOTALL) + if structure_match: + structure = structure_match.group(1).strip() + + # Rebuild a clean XML structure + clean_structure = "\n" + + # Extract title + title_match = re.search(r'(.*?)', structure, re.DOTALL) + if title_match: + title = title_match.group(1).strip() + clean_structure += f" {title}\n" + + # Extract description + desc_match = re.search(r'(.*?)', structure, re.DOTALL) + if desc_match: + desc = desc_match.group(1).strip() + clean_structure += f" {desc}\n" + + # Add pages section + clean_structure += " \n" + + # Extract pages + pages = re.findall(r'(.*?)', structure, re.DOTALL) + for page_id, page_content in pages: + clean_structure += f' \n' + + # Extract page title + page_title_match = re.search(r'(.*?)', page_content, re.DOTALL) + if page_title_match: + page_title = page_title_match.group(1).strip() + clean_structure += f" {page_title}\n" + + # Extract page description + page_desc_match = re.search(r'(.*?)', page_content, re.DOTALL) + if page_desc_match: + page_desc = page_desc_match.group(1).strip() + clean_structure += f" {page_desc}\n" + + # Extract importance + importance_match = re.search(r'(.*?)', page_content, re.DOTALL) + if importance_match: + importance = importance_match.group(1).strip() + clean_structure += f" {importance}\n" + + # Extract relevant files + clean_structure += " \n" + file_paths = re.findall(r'(.*?)', page_content, re.DOTALL) + for file_path in file_paths: + clean_structure += f" {file_path.strip()}\n" + clean_structure += " \n" + + # Extract related pages + clean_structure += " \n" + related_pages = re.findall(r'(.*?)', page_content, re.DOTALL) + for related in related_pages: + clean_structure += f" {related.strip()}\n" + clean_structure += " \n" + + clean_structure += " \n" + + clean_structure += " \n" + + log.info("Successfully rebuilt clean XML structure") + yield clean_structure + else: + log.warning("Could not extract wiki structure, using raw XML") + yield clean_xml + except Exception as rebuild_error: + log.warning(f"Failed to rebuild XML: {str(rebuild_error)}, using raw XML") + yield clean_xml + else: + # If we can't extract it, just yield the original content + log.warning("Could not extract wiki_structure XML, yielding original content") + yield xml_content + else: + # For other XML content, just yield it as is + yield content + except Exception as xml_error: + log.error(f"Error processing XML content: {str(xml_error)}") + yield content + else: + # Not XML, just yield the content + yield content + else: + log.error(f"Unexpected response format: {data}") + yield "Error: Unexpected response format from OpenRouter API" + else: + log.error(f"No choices in response: {data}") + yield "Error: No response content from OpenRouter API" + + return content_generator() + except aiohttp.ClientError as e: + e_client = e + log.error(f"Connection error with OpenRouter API: {str(e_client)}") + + # Return a generator that yields the error message + async def connection_error_generator(): + yield f"Connection error with OpenRouter API: {str(e_client)}. Please check your internet connection and that the OpenRouter API is accessible." + return connection_error_generator() + + except RequestException as e: + e_req = e + log.error(f"Error calling OpenRouter API asynchronously: {str(e_req)}") + + # Return a generator that yields the error message + async def request_error_generator(): + yield f"Error calling OpenRouter API: {str(e_req)}" + return request_error_generator() + + except Exception as e: + e_unexp = e + log.error(f"Unexpected error calling OpenRouter API asynchronously: {str(e_unexp)}") + + # Return a generator that yields the error message + async def unexpected_error_generator(): + yield f"Unexpected error calling OpenRouter API: {str(e_unexp)}" + return unexpected_error_generator() + + else: + error_msg = f"Unsupported model type: {model_type}" + log.error(error_msg) + + # Return a generator that yields the error message + async def model_type_error_generator(): + yield error_msg + return model_type_error_generator() + + def _process_completion_response(self, data: Dict) -> GeneratorOutput: + """Process a non-streaming completion response from OpenRouter.""" + try: + # Extract the completion text from the response + if not data.get("choices"): + raise ValueError(f"No choices in OpenRouter response: {data}") + + choice = data["choices"][0] + + if "message" in choice: + content = choice["message"].get("content", "") + elif "text" in choice: + content = choice.get("text", "") + else: + raise ValueError(f"Unexpected response format from OpenRouter: {choice}") + + # Extract usage information if available + usage = None + if "usage" in data: + usage = CompletionUsage( + prompt_tokens=data["usage"].get("prompt_tokens", 0), + completion_tokens=data["usage"].get("completion_tokens", 0), + total_tokens=data["usage"].get("total_tokens", 0) + ) + + # Create and return the GeneratorOutput + return GeneratorOutput( + data=content, + usage=usage, + raw_response=data + ) + + except Exception as e_proc: + log.error(f"Error processing OpenRouter completion response: {str(e_proc)}") + raise + + def _process_streaming_response(self, response): + """Process a streaming response from OpenRouter.""" + try: + log.info("Starting to process streaming response from OpenRouter") + buffer = "" + + for chunk in response.iter_content(chunk_size=1024, decode_unicode=True): + try: + # Add chunk to buffer + buffer += chunk + + # Process complete lines in the buffer + while '\n' in buffer: + line, buffer = buffer.split('\n', 1) + line = line.strip() + + if not line: + continue + + log.debug(f"Processing line: {line}") + + # Skip SSE comments (lines starting with :) + if line.startswith(':'): + log.debug(f"Skipping SSE comment: {line}") + continue + + if line.startswith("data: "): + data = line[6:] # Remove "data: " prefix + + # Check for stream end + if data == "[DONE]": + log.info("Received [DONE] marker") + break + + try: + data_obj = json.loads(data) + log.debug(f"Parsed JSON data: {data_obj}") + + # Extract content from delta + if "choices" in data_obj and len(data_obj["choices"]) > 0: + choice = data_obj["choices"][0] + + if "delta" in choice and "content" in choice["delta"] and choice["delta"]["content"]: + content = choice["delta"]["content"] + log.debug(f"Yielding delta content: {content}") + yield content + elif "text" in choice: + log.debug(f"Yielding text content: {choice['text']}") + yield choice["text"] + else: + log.debug(f"No content found in choice: {choice}") + else: + log.debug(f"No choices found in data: {data_obj}") + + except json.JSONDecodeError: + log.warning(f"Failed to parse SSE data: {data}") + continue + except Exception as e_chunk: + log.error(f"Error processing streaming chunk: {str(e_chunk)}") + yield f"Error processing response chunk: {str(e_chunk)}" + except Exception as e_stream: + log.error(f"Error in streaming response: {str(e_stream)}") + yield f"Error in streaming response: {str(e_stream)}" + + async def _process_async_streaming_response(self, response): + """Process an asynchronous streaming response from OpenRouter.""" + buffer = "" + try: + log.info("Starting to process async streaming response from OpenRouter") + async for chunk in response.content: + try: + # Convert bytes to string and add to buffer + if isinstance(chunk, bytes): + chunk_str = chunk.decode('utf-8') + else: + chunk_str = str(chunk) + + buffer += chunk_str + + # Process complete lines in the buffer + while '\n' in buffer: + line, buffer = buffer.split('\n', 1) + line = line.strip() + + if not line: + continue + + log.debug(f"Processing line: {line}") + + # Skip SSE comments (lines starting with :) + if line.startswith(':'): + log.debug(f"Skipping SSE comment: {line}") + continue + + if line.startswith("data: "): + data = line[6:] # Remove "data: " prefix + + # Check for stream end + if data == "[DONE]": + log.info("Received [DONE] marker") + break + + try: + data_obj = json.loads(data) + log.debug(f"Parsed JSON data: {data_obj}") + + # Extract content from delta + if "choices" in data_obj and len(data_obj["choices"]) > 0: + choice = data_obj["choices"][0] + + if "delta" in choice and "content" in choice["delta"] and choice["delta"]["content"]: + content = choice["delta"]["content"] + log.debug(f"Yielding delta content: {content}") + yield content + elif "text" in choice: + log.debug(f"Yielding text content: {choice['text']}") + yield choice["text"] + else: + log.debug(f"No content found in choice: {choice}") + else: + log.debug(f"No choices found in data: {data_obj}") + + except json.JSONDecodeError: + log.warning(f"Failed to parse SSE data: {data}") + continue + except Exception as e_chunk: + log.error(f"Error processing streaming chunk: {str(e_chunk)}") + yield f"Error processing response chunk: {str(e_chunk)}" + except Exception as e_stream: + log.error(f"Error in async streaming response: {str(e_stream)}") + yield f"Error in streaming response: {str(e_stream)}" diff --git a/reference-deepwiki/deepwiki-open-main/api/prompts.py b/reference-deepwiki/deepwiki-open-main/api/prompts.py new file mode 100644 index 0000000..61ef0a4 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/prompts.py @@ -0,0 +1,191 @@ +"""Module containing all prompts used in the DeepWiki project.""" + +# System prompt for RAG +RAG_SYSTEM_PROMPT = r""" +You are a code assistant which answers user questions on a Github Repo. +You will receive user query, relevant context, and past conversation history. + +LANGUAGE DETECTION AND RESPONSE: +- Detect the language of the user's query +- Respond in the SAME language as the user's query +- IMPORTANT:If a specific language is requested in the prompt, prioritize that language over the query language + +FORMAT YOUR RESPONSE USING MARKDOWN: +- Use proper markdown syntax for all formatting +- For code blocks, use triple backticks with language specification (```python, ```javascript, etc.) +- Use ## headings for major sections +- Use bullet points or numbered lists where appropriate +- Format tables using markdown table syntax when presenting structured data +- Use **bold** and *italic* for emphasis +- When referencing file paths, use `inline code` formatting + +IMPORTANT FORMATTING RULES: +1. DO NOT include ```markdown fences at the beginning or end of your answer +2. Start your response directly with the content +3. The content will already be rendered as markdown, so just provide the raw markdown content + +Think step by step and ensure your answer is well-structured and visually organized. +""" + +# Template for RAG +RAG_TEMPLATE = r""" +{system_prompt} +{output_format_str} + +{# OrderedDict of DialogTurn #} +{% if conversation_history %} + +{% for key, dialog_turn in conversation_history.items() %} +{{key}}. +User: {{dialog_turn.user_query.query_str}} +You: {{dialog_turn.assistant_response.response_str}} +{% endfor %} + +{% endif %} +{% if contexts %} + +{% for context in contexts %} +{{loop.index}}. +File Path: {{context.meta_data.get('file_path', 'unknown')}} +Content: {{context.text}} +{% endfor %} + +{% endif %} + +{{input_str}} + +""" + +# System prompts for simple chat +DEEP_RESEARCH_FIRST_ITERATION_PROMPT = """ +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are conducting a multi-turn Deep Research process to thoroughly investigate the specific topic in the user's query. +Your goal is to provide detailed, focused information EXCLUSIVELY about this topic. +IMPORTANT:You MUST respond in {language_name} language. + + + +- This is the first iteration of a multi-turn research process focused EXCLUSIVELY on the user's query +- Start your response with "## Research Plan" +- Outline your approach to investigating this specific topic +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- Clearly state the specific topic you're researching to maintain focus throughout all iterations +- Identify the key aspects you'll need to research +- Provide initial findings based on the information available +- End with "## Next Steps" indicating what you'll investigate in the next iteration +- Do NOT provide a final conclusion yet - this is just the beginning of the research +- Do NOT include general repository information unless directly relevant to the query +- Focus EXCLUSIVELY on the specific topic being researched - do not drift to related topics +- Your research MUST directly address the original question +- NEVER respond with just "Continue the research" as an answer - always provide substantive research findings +- Remember that this topic will be maintained across all research iterations + + +""" + +DEEP_RESEARCH_FINAL_ITERATION_PROMPT = """ +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are in the final iteration of a Deep Research process focused EXCLUSIVELY on the latest user query. +Your goal is to synthesize all previous findings and provide a comprehensive conclusion that directly addresses this specific topic and ONLY this topic. +IMPORTANT:You MUST respond in {language_name} language. + + + +- This is the final iteration of the research process +- CAREFULLY review the entire conversation history to understand all previous findings +- Synthesize ALL findings from previous iterations into a comprehensive conclusion +- Start with "## Final Conclusion" +- Your conclusion MUST directly address the original question +- Stay STRICTLY focused on the specific topic - do not drift to related topics +- Include specific code references and implementation details related to the topic +- Highlight the most important discoveries and insights about this specific functionality +- Provide a complete and definitive answer to the original question +- Do NOT include general repository information unless directly relevant to the query +- Focus exclusively on the specific topic being researched +- NEVER respond with "Continue the research" as an answer - always provide a complete conclusion +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- Ensure your conclusion builds on and references key findings from previous iterations + + +""" + +DEEP_RESEARCH_INTERMEDIATE_ITERATION_PROMPT = """ +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are currently in iteration {research_iteration} of a Deep Research process focused EXCLUSIVELY on the latest user query. +Your goal is to build upon previous research iterations and go deeper into this specific topic without deviating from it. +IMPORTANT:You MUST respond in {language_name} language. + + + +- CAREFULLY review the conversation history to understand what has been researched so far +- Your response MUST build on previous research iterations - do not repeat information already covered +- Identify gaps or areas that need further exploration related to this specific topic +- Focus on one specific aspect that needs deeper investigation in this iteration +- Start your response with "## Research Update {{research_iteration}}" +- Clearly explain what you're investigating in this iteration +- Provide new insights that weren't covered in previous iterations +- If this is iteration 3, prepare for a final conclusion in the next iteration +- Do NOT include general repository information unless directly relevant to the query +- Focus EXCLUSIVELY on the specific topic being researched - do not drift to related topics +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- NEVER respond with just "Continue the research" as an answer - always provide substantive research findings +- Your research MUST directly address the original question +- Maintain continuity with previous research iterations - this is a continuous investigation + + +""" + +SIMPLE_CHAT_SYSTEM_PROMPT = """ +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You provide direct, concise, and accurate information about code repositories. +You NEVER start responses with markdown headers or code fences. +IMPORTANT:You MUST respond in {language_name} language. + + + +- Answer the user's question directly without ANY preamble or filler phrases +- DO NOT include any rationale, explanation, or extra comments. +- DO NOT start with preambles like "Okay, here's a breakdown" or "Here's an explanation" +- DO NOT start with markdown headers like "## Analysis of..." or any file path references +- DO NOT start with ```markdown code fences +- DO NOT end your response with ``` closing fences +- DO NOT start by repeating or acknowledging the question +- JUST START with the direct answer to the question + + +```markdown +## Analysis of `adalflow/adalflow/datasets/gsm8k.py` + +This file contains... +``` + + +- Format your response with proper markdown including headings, lists, and code blocks WITHIN your answer +- For code analysis, organize your response with clear sections +- Think step by step and structure your answer logically +- Start with the most relevant information that directly addresses the user's query +- Be precise and technical when discussing code +- Your response language should be in the same language as the user's query + + +""" diff --git a/reference-deepwiki/deepwiki-open-main/api/rag.py b/reference-deepwiki/deepwiki-open-main/api/rag.py new file mode 100644 index 0000000..6908a93 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/rag.py @@ -0,0 +1,445 @@ +import logging +import weakref +import re +from dataclasses import dataclass +from typing import Any, List, Tuple, Dict +from uuid import uuid4 + +import adalflow as adal + +from api.tools.embedder import get_embedder +from api.prompts import RAG_SYSTEM_PROMPT as system_prompt, RAG_TEMPLATE + +# Create our own implementation of the conversation classes +@dataclass +class UserQuery: + query_str: str + +@dataclass +class AssistantResponse: + response_str: str + +@dataclass +class DialogTurn: + id: str + user_query: UserQuery + assistant_response: AssistantResponse + +class CustomConversation: + """Custom implementation of Conversation to fix the list assignment index out of range error""" + + def __init__(self): + self.dialog_turns = [] + + def append_dialog_turn(self, dialog_turn): + """Safely append a dialog turn to the conversation""" + if not hasattr(self, 'dialog_turns'): + self.dialog_turns = [] + self.dialog_turns.append(dialog_turn) + +# Import other adalflow components +from adalflow.components.retriever.faiss_retriever import FAISSRetriever +from api.config import configs +from api.data_pipeline import DatabaseManager + +# Configure logging +logger = logging.getLogger(__name__) + +# Maximum token limit for embedding models +MAX_INPUT_TOKENS = 7500 # Safe threshold below 8192 token limit + +class Memory(adal.core.component.DataComponent): + """Simple conversation management with a list of dialog turns.""" + + def __init__(self): + super().__init__() + # Use our custom implementation instead of the original Conversation class + self.current_conversation = CustomConversation() + + def call(self) -> Dict: + """Return the conversation history as a dictionary.""" + all_dialog_turns = {} + try: + # Check if dialog_turns exists and is a list + if hasattr(self.current_conversation, 'dialog_turns'): + if self.current_conversation.dialog_turns: + logger.info(f"Memory content: {len(self.current_conversation.dialog_turns)} turns") + for i, turn in enumerate(self.current_conversation.dialog_turns): + if hasattr(turn, 'id') and turn.id is not None: + all_dialog_turns[turn.id] = turn + logger.info(f"Added turn {i+1} with ID {turn.id} to memory") + else: + logger.warning(f"Skipping invalid turn object in memory: {turn}") + else: + logger.info("Dialog turns list exists but is empty") + else: + logger.info("No dialog_turns attribute in current_conversation") + # Try to initialize it + self.current_conversation.dialog_turns = [] + except Exception as e: + logger.error(f"Error accessing dialog turns: {str(e)}") + # Try to recover + try: + self.current_conversation = CustomConversation() + logger.info("Recovered by creating new conversation") + except Exception as e2: + logger.error(f"Failed to recover: {str(e2)}") + + logger.info(f"Returning {len(all_dialog_turns)} dialog turns from memory") + return all_dialog_turns + + def add_dialog_turn(self, user_query: str, assistant_response: str) -> bool: + """ + Add a dialog turn to the conversation history. + + Args: + user_query: The user's query + assistant_response: The assistant's response + + Returns: + bool: True if successful, False otherwise + """ + try: + # Create a new dialog turn using our custom implementation + dialog_turn = DialogTurn( + id=str(uuid4()), + user_query=UserQuery(query_str=user_query), + assistant_response=AssistantResponse(response_str=assistant_response), + ) + + # Make sure the current_conversation has the append_dialog_turn method + if not hasattr(self.current_conversation, 'append_dialog_turn'): + logger.warning("current_conversation does not have append_dialog_turn method, creating new one") + # Initialize a new conversation if needed + self.current_conversation = CustomConversation() + + # Ensure dialog_turns exists + if not hasattr(self.current_conversation, 'dialog_turns'): + logger.warning("dialog_turns not found, initializing empty list") + self.current_conversation.dialog_turns = [] + + # Safely append the dialog turn + self.current_conversation.dialog_turns.append(dialog_turn) + logger.info(f"Successfully added dialog turn, now have {len(self.current_conversation.dialog_turns)} turns") + return True + + except Exception as e: + logger.error(f"Error adding dialog turn: {str(e)}") + # Try to recover by creating a new conversation + try: + self.current_conversation = CustomConversation() + dialog_turn = DialogTurn( + id=str(uuid4()), + user_query=UserQuery(query_str=user_query), + assistant_response=AssistantResponse(response_str=assistant_response), + ) + self.current_conversation.dialog_turns.append(dialog_turn) + logger.info("Recovered from error by creating new conversation") + return True + except Exception as e2: + logger.error(f"Failed to recover from error: {str(e2)}") + return False + + +from dataclasses import dataclass, field + +@dataclass +class RAGAnswer(adal.DataClass): + rationale: str = field(default="", metadata={"desc": "Chain of thoughts for the answer."}) + answer: str = field(default="", metadata={"desc": "Answer to the user query, formatted in markdown for beautiful rendering with react-markdown. DO NOT include ``` triple backticks fences at the beginning or end of your answer."}) + + __output_fields__ = ["rationale", "answer"] + +class RAG(adal.Component): + """RAG with one repo. + If you want to load a new repos, call prepare_retriever(repo_url_or_path) first.""" + + def __init__(self, provider="google", model=None, use_s3: bool = False): # noqa: F841 - use_s3 is kept for compatibility + """ + Initialize the RAG component. + + Args: + provider: Model provider to use (google, openai, openrouter, ollama) + model: Model name to use with the provider + use_s3: Whether to use S3 for database storage (default: False) + """ + super().__init__() + + self.provider = provider + self.model = model + + # Import the helper functions + from api.config import get_embedder_config, get_embedder_type + + # Determine embedder type based on current configuration + self.embedder_type = get_embedder_type() + self.is_ollama_embedder = (self.embedder_type == 'ollama') # Backward compatibility + + # Check if Ollama model exists before proceeding + if self.is_ollama_embedder: + from api.ollama_patch import check_ollama_model_exists + from api.config import get_embedder_config + + embedder_config = get_embedder_config() + if embedder_config and embedder_config.get("model_kwargs", {}).get("model"): + model_name = embedder_config["model_kwargs"]["model"] + if not check_ollama_model_exists(model_name): + raise Exception(f"Ollama model '{model_name}' not found. Please run 'ollama pull {model_name}' to install it.") + + # Initialize components + self.memory = Memory() + self.embedder = get_embedder(embedder_type=self.embedder_type) + + self_weakref = weakref.ref(self) + # Patch: ensure query embedding is always single string for Ollama + def single_string_embedder(query): + # Accepts either a string or a list, always returns embedding for a single string + if isinstance(query, list): + if len(query) != 1: + raise ValueError("Ollama embedder only supports a single string") + query = query[0] + instance = self_weakref() + assert instance is not None, "RAG instance is no longer available, but the query embedder was called." + return instance.embedder(input=query) + + # Use single string embedder for Ollama, regular embedder for others + self.query_embedder = single_string_embedder if self.is_ollama_embedder else self.embedder + + self.initialize_db_manager() + + # Set up the output parser + data_parser = adal.DataClassParser(data_class=RAGAnswer, return_data_class=True) + + # Format instructions to ensure proper output structure + format_instructions = data_parser.get_output_format_str() + """ + +IMPORTANT FORMATTING RULES: +1. DO NOT include your thinking or reasoning process in the output +2. Provide only the final, polished answer +3. DO NOT include ```markdown fences at the beginning or end of your answer +4. DO NOT wrap your response in any kind of fences +5. Start your response directly with the content +6. The content will already be rendered as markdown +7. Do not use backslashes before special characters like [ ] { } in your answer +8. When listing tags or similar items, write them as plain text without escape characters +9. For pipe characters (|) in text, write them directly without escaping them""" + + # Get model configuration based on provider and model + from api.config import get_model_config + generator_config = get_model_config(self.provider, self.model) + + # Set up the main generator + self.generator = adal.Generator( + template=RAG_TEMPLATE, + prompt_kwargs={ + "output_format_str": format_instructions, + "conversation_history": self.memory(), + "system_prompt": system_prompt, + "contexts": None, + }, + model_client=generator_config["model_client"](), + model_kwargs=generator_config["model_kwargs"], + output_processors=data_parser, + ) + + + def initialize_db_manager(self): + """Initialize the database manager with local storage""" + self.db_manager = DatabaseManager() + self.transformed_docs = [] + + def _validate_and_filter_embeddings(self, documents: List) -> List: + """ + Validate embeddings and filter out documents with invalid or mismatched embedding sizes. + + Args: + documents: List of documents with embeddings + + Returns: + List of documents with valid embeddings of consistent size + """ + if not documents: + logger.warning("No documents provided for embedding validation") + return [] + + valid_documents = [] + embedding_sizes = {} + + # First pass: collect all embedding sizes and count occurrences + for i, doc in enumerate(documents): + if not hasattr(doc, 'vector') or doc.vector is None: + logger.warning(f"Document {i} has no embedding vector, skipping") + continue + + try: + if isinstance(doc.vector, list): + embedding_size = len(doc.vector) + elif hasattr(doc.vector, 'shape'): + embedding_size = doc.vector.shape[0] if len(doc.vector.shape) == 1 else doc.vector.shape[-1] + elif hasattr(doc.vector, '__len__'): + embedding_size = len(doc.vector) + else: + logger.warning(f"Document {i} has invalid embedding vector type: {type(doc.vector)}, skipping") + continue + + if embedding_size == 0: + logger.warning(f"Document {i} has empty embedding vector, skipping") + continue + + embedding_sizes[embedding_size] = embedding_sizes.get(embedding_size, 0) + 1 + + except Exception as e: + logger.warning(f"Error checking embedding size for document {i}: {str(e)}, skipping") + continue + + if not embedding_sizes: + logger.error("No valid embeddings found in any documents") + return [] + + # Find the most common embedding size (this should be the correct one) + target_size = max(embedding_sizes.keys(), key=lambda k: embedding_sizes[k]) + logger.info(f"Target embedding size: {target_size} (found in {embedding_sizes[target_size]} documents)") + + # Log all embedding sizes found + for size, count in embedding_sizes.items(): + if size != target_size: + logger.warning(f"Found {count} documents with incorrect embedding size {size}, will be filtered out") + + # Second pass: filter documents with the target embedding size + for i, doc in enumerate(documents): + if not hasattr(doc, 'vector') or doc.vector is None: + continue + + try: + if isinstance(doc.vector, list): + embedding_size = len(doc.vector) + elif hasattr(doc.vector, 'shape'): + embedding_size = doc.vector.shape[0] if len(doc.vector.shape) == 1 else doc.vector.shape[-1] + elif hasattr(doc.vector, '__len__'): + embedding_size = len(doc.vector) + else: + continue + + if embedding_size == target_size: + valid_documents.append(doc) + else: + # Log which document is being filtered out + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.warning(f"Filtering out document '{file_path}' due to embedding size mismatch: {embedding_size} != {target_size}") + + except Exception as e: + file_path = getattr(doc, 'meta_data', {}).get('file_path', f'document_{i}') + logger.warning(f"Error validating embedding for document '{file_path}': {str(e)}, skipping") + continue + + logger.info(f"Embedding validation complete: {len(valid_documents)}/{len(documents)} documents have valid embeddings") + + if len(valid_documents) == 0: + logger.error("No documents with valid embeddings remain after filtering") + elif len(valid_documents) < len(documents): + filtered_count = len(documents) - len(valid_documents) + logger.warning(f"Filtered out {filtered_count} documents due to embedding issues") + + return valid_documents + + def prepare_retriever(self, repo_url_or_path: str, type: str = "github", access_token: str = None, + excluded_dirs: List[str] = None, excluded_files: List[str] = None, + included_dirs: List[str] = None, included_files: List[str] = None): + """ + Prepare the retriever for a repository. + Will load database from local storage if available. + + Args: + repo_url_or_path: URL or local path to the repository + access_token: Optional access token for private repositories + excluded_dirs: Optional list of directories to exclude from processing + excluded_files: Optional list of file patterns to exclude from processing + included_dirs: Optional list of directories to include exclusively + included_files: Optional list of file patterns to include exclusively + """ + self.initialize_db_manager() + self.repo_url_or_path = repo_url_or_path + self.transformed_docs = self.db_manager.prepare_database( + repo_url_or_path, + type, + access_token, + embedder_type=self.embedder_type, + excluded_dirs=excluded_dirs, + excluded_files=excluded_files, + included_dirs=included_dirs, + included_files=included_files + ) + logger.info(f"Loaded {len(self.transformed_docs)} documents for retrieval") + + # Validate and filter embeddings to ensure consistent sizes + self.transformed_docs = self._validate_and_filter_embeddings(self.transformed_docs) + + if not self.transformed_docs: + raise ValueError("No valid documents with embeddings found. Cannot create retriever.") + + logger.info(f"Using {len(self.transformed_docs)} documents with valid embeddings for retrieval") + + try: + # Use the appropriate embedder for retrieval + retrieve_embedder = self.query_embedder if self.is_ollama_embedder else self.embedder + self.retriever = FAISSRetriever( + **configs["retriever"], + embedder=retrieve_embedder, + documents=self.transformed_docs, + document_map_func=lambda doc: doc.vector, + ) + logger.info("FAISS retriever created successfully") + except Exception as e: + logger.error(f"Error creating FAISS retriever: {str(e)}") + # Try to provide more specific error information + if "All embeddings should be of the same size" in str(e): + logger.error("Embedding size validation failed. This suggests there are still inconsistent embedding sizes.") + # Log embedding sizes for debugging + sizes = [] + for i, doc in enumerate(self.transformed_docs[:10]): # Check first 10 docs + if hasattr(doc, 'vector') and doc.vector is not None: + try: + if isinstance(doc.vector, list): + size = len(doc.vector) + elif hasattr(doc.vector, 'shape'): + size = doc.vector.shape[0] if len(doc.vector.shape) == 1 else doc.vector.shape[-1] + elif hasattr(doc.vector, '__len__'): + size = len(doc.vector) + else: + size = "unknown" + sizes.append(f"doc_{i}: {size}") + except: + sizes.append(f"doc_{i}: error") + logger.error(f"Sample embedding sizes: {', '.join(sizes)}") + raise + + def call(self, query: str, language: str = "en") -> Tuple[List]: + """ + Process a query using RAG. + + Args: + query: The user's query + + Returns: + Tuple of (RAGAnswer, retrieved_documents) + """ + try: + retrieved_documents = self.retriever(query) + + # Fill in the documents + retrieved_documents[0].documents = [ + self.transformed_docs[doc_index] + for doc_index in retrieved_documents[0].doc_indices + ] + + return retrieved_documents + + except Exception as e: + logger.error(f"Error in RAG call: {str(e)}") + + # Create error response + error_response = RAGAnswer( + rationale="Error occurred while processing the query.", + answer=f"I apologize, but I encountered an error while processing your question. Please try again or rephrase your question." + ) + return error_response, [] diff --git a/reference-deepwiki/deepwiki-open-main/api/requirements.txt b/reference-deepwiki/deepwiki-open-main/api/requirements.txt new file mode 100644 index 0000000..2a06956 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/requirements.txt @@ -0,0 +1,20 @@ +fastapi>=0.95.0 +uvicorn[standard]>=0.21.1 +pydantic>=2.0.0 +google-generativeai>=0.3.0 +tiktoken>=0.5.0 +adalflow>=0.1.0 +numpy>=1.24.0 +faiss-cpu>=1.7.4 +langid>=1.1.6 +requests>=2.28.0 +jinja2>=3.1.2 +python-dotenv>=1.0.0 +openai>=1.76.2 +ollama>=0.4.8 +aiohttp>=3.8.4 +boto3>=1.34.0 +websockets>=11.0.3 +azure-identity>=1.12.0 +azure-core>=1.24.0 + diff --git a/reference-deepwiki/deepwiki-open-main/api/simple_chat.py b/reference-deepwiki/deepwiki-open-main/api/simple_chat.py new file mode 100644 index 0000000..06d329a --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/simple_chat.py @@ -0,0 +1,689 @@ +import logging +import os +from typing import List, Optional +from urllib.parse import unquote + +import google.generativeai as genai +from adalflow.components.model_client.ollama_client import OllamaClient +from adalflow.core.types import ModelType +from fastapi import FastAPI, HTTPException +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import StreamingResponse +from pydantic import BaseModel, Field + +from api.config import get_model_config, configs, OPENROUTER_API_KEY, OPENAI_API_KEY, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY +from api.data_pipeline import count_tokens, get_file_content +from api.openai_client import OpenAIClient +from api.openrouter_client import OpenRouterClient +from api.bedrock_client import BedrockClient +from api.azureai_client import AzureAIClient +from api.rag import RAG +from api.prompts import ( + DEEP_RESEARCH_FIRST_ITERATION_PROMPT, + DEEP_RESEARCH_FINAL_ITERATION_PROMPT, + DEEP_RESEARCH_INTERMEDIATE_ITERATION_PROMPT, + SIMPLE_CHAT_SYSTEM_PROMPT +) + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +logger = logging.getLogger(__name__) + + +# Initialize FastAPI app +app = FastAPI( + title="Simple Chat API", + description="Simplified API for streaming chat completions" +) + +# Configure CORS +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], # Allows all origins + allow_credentials=True, + allow_methods=["*"], # Allows all methods + allow_headers=["*"], # Allows all headers +) + +# Models for the API +class ChatMessage(BaseModel): + role: str # 'user' or 'assistant' + content: str + +class ChatCompletionRequest(BaseModel): + """ + Model for requesting a chat completion. + """ + repo_url: str = Field(..., description="URL of the repository to query") + messages: List[ChatMessage] = Field(..., description="List of chat messages") + filePath: Optional[str] = Field(None, description="Optional path to a file in the repository to include in the prompt") + token: Optional[str] = Field(None, description="Personal access token for private repositories") + type: Optional[str] = Field("github", description="Type of repository (e.g., 'github', 'gitlab', 'bitbucket')") + + # model parameters + provider: str = Field("google", description="Model provider (google, openai, openrouter, ollama, bedrock, azure)") + model: Optional[str] = Field(None, description="Model name for the specified provider") + + language: Optional[str] = Field("en", description="Language for content generation (e.g., 'en', 'ja', 'zh', 'es', 'kr', 'vi')") + excluded_dirs: Optional[str] = Field(None, description="Comma-separated list of directories to exclude from processing") + excluded_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to exclude from processing") + included_dirs: Optional[str] = Field(None, description="Comma-separated list of directories to include exclusively") + included_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to include exclusively") + +@app.post("/chat/completions/stream") +async def chat_completions_stream(request: ChatCompletionRequest): + """Stream a chat completion response directly using Google Generative AI""" + try: + # Check if request contains very large input + input_too_large = False + if request.messages and len(request.messages) > 0: + last_message = request.messages[-1] + if hasattr(last_message, 'content') and last_message.content: + tokens = count_tokens(last_message.content, request.provider == "ollama") + logger.info(f"Request size: {tokens} tokens") + if tokens > 8000: + logger.warning(f"Request exceeds recommended token limit ({tokens} > 7500)") + input_too_large = True + + # Create a new RAG instance for this request + try: + request_rag = RAG(provider=request.provider, model=request.model) + + # Extract custom file filter parameters if provided + excluded_dirs = None + excluded_files = None + included_dirs = None + included_files = None + + if request.excluded_dirs: + excluded_dirs = [unquote(dir_path) for dir_path in request.excluded_dirs.split('\n') if dir_path.strip()] + logger.info(f"Using custom excluded directories: {excluded_dirs}") + if request.excluded_files: + excluded_files = [unquote(file_pattern) for file_pattern in request.excluded_files.split('\n') if file_pattern.strip()] + logger.info(f"Using custom excluded files: {excluded_files}") + if request.included_dirs: + included_dirs = [unquote(dir_path) for dir_path in request.included_dirs.split('\n') if dir_path.strip()] + logger.info(f"Using custom included directories: {included_dirs}") + if request.included_files: + included_files = [unquote(file_pattern) for file_pattern in request.included_files.split('\n') if file_pattern.strip()] + logger.info(f"Using custom included files: {included_files}") + + request_rag.prepare_retriever(request.repo_url, request.type, request.token, excluded_dirs, excluded_files, included_dirs, included_files) + logger.info(f"Retriever prepared for {request.repo_url}") + except ValueError as e: + if "No valid documents with embeddings found" in str(e): + logger.error(f"No valid embeddings found: {str(e)}") + raise HTTPException(status_code=500, detail="No valid document embeddings found. This may be due to embedding size inconsistencies or API errors during document processing. Please try again or check your repository content.") + else: + logger.error(f"ValueError preparing retriever: {str(e)}") + raise HTTPException(status_code=500, detail=f"Error preparing retriever: {str(e)}") + except Exception as e: + logger.error(f"Error preparing retriever: {str(e)}") + # Check for specific embedding-related errors + if "All embeddings should be of the same size" in str(e): + raise HTTPException(status_code=500, detail="Inconsistent embedding sizes detected. Some documents may have failed to embed properly. Please try again.") + else: + raise HTTPException(status_code=500, detail=f"Error preparing retriever: {str(e)}") + + # Validate request + if not request.messages or len(request.messages) == 0: + raise HTTPException(status_code=400, detail="No messages provided") + + last_message = request.messages[-1] + if last_message.role != "user": + raise HTTPException(status_code=400, detail="Last message must be from the user") + + # Process previous messages to build conversation history + for i in range(0, len(request.messages) - 1, 2): + if i + 1 < len(request.messages): + user_msg = request.messages[i] + assistant_msg = request.messages[i + 1] + + if user_msg.role == "user" and assistant_msg.role == "assistant": + request_rag.memory.add_dialog_turn( + user_query=user_msg.content, + assistant_response=assistant_msg.content + ) + + # Check if this is a Deep Research request + is_deep_research = False + research_iteration = 1 + + # Process messages to detect Deep Research requests + for msg in request.messages: + if hasattr(msg, 'content') and msg.content and "[DEEP RESEARCH]" in msg.content: + is_deep_research = True + # Only remove the tag from the last message + if msg == request.messages[-1]: + # Remove the Deep Research tag + msg.content = msg.content.replace("[DEEP RESEARCH]", "").strip() + + # Count research iterations if this is a Deep Research request + if is_deep_research: + research_iteration = sum(1 for msg in request.messages if msg.role == 'assistant') + 1 + logger.info(f"Deep Research request detected - iteration {research_iteration}") + + # Check if this is a continuation request + if "continue" in last_message.content.lower() and "research" in last_message.content.lower(): + # Find the original topic from the first user message + original_topic = None + for msg in request.messages: + if msg.role == "user" and "continue" not in msg.content.lower(): + original_topic = msg.content.replace("[DEEP RESEARCH]", "").strip() + logger.info(f"Found original research topic: {original_topic}") + break + + if original_topic: + # Replace the continuation message with the original topic + last_message.content = original_topic + logger.info(f"Using original topic for research: {original_topic}") + + # Get the query from the last message + query = last_message.content + + # Only retrieve documents if input is not too large + context_text = "" + retrieved_documents = None + + if not input_too_large: + try: + # If filePath exists, modify the query for RAG to focus on the file + rag_query = query + if request.filePath: + # Use the file path to get relevant context about the file + rag_query = f"Contexts related to {request.filePath}" + logger.info(f"Modified RAG query to focus on file: {request.filePath}") + + # Try to perform RAG retrieval + try: + # This will use the actual RAG implementation + retrieved_documents = request_rag(rag_query, language=request.language) + + if retrieved_documents and retrieved_documents[0].documents: + # Format context for the prompt in a more structured way + documents = retrieved_documents[0].documents + logger.info(f"Retrieved {len(documents)} documents") + + # Group documents by file path + docs_by_file = {} + for doc in documents: + file_path = doc.meta_data.get('file_path', 'unknown') + if file_path not in docs_by_file: + docs_by_file[file_path] = [] + docs_by_file[file_path].append(doc) + + # Format context text with file path grouping + context_parts = [] + for file_path, docs in docs_by_file.items(): + # Add file header with metadata + header = f"## File Path: {file_path}\n\n" + # Add document content + content = "\n\n".join([doc.text for doc in docs]) + + context_parts.append(f"{header}{content}") + + # Join all parts with clear separation + context_text = "\n\n" + "-" * 10 + "\n\n".join(context_parts) + else: + logger.warning("No documents retrieved from RAG") + except Exception as e: + logger.error(f"Error in RAG retrieval: {str(e)}") + # Continue without RAG if there's an error + + except Exception as e: + logger.error(f"Error retrieving documents: {str(e)}") + context_text = "" + + # Get repository information + repo_url = request.repo_url + repo_name = repo_url.split("/")[-1] if "/" in repo_url else repo_url + + # Determine repository type + repo_type = request.type + + # Get language information + language_code = request.language or configs["lang_config"]["default"] + supported_langs = configs["lang_config"]["supported_languages"] + language_name = supported_langs.get(language_code, "English") + + # Create system prompt + if is_deep_research: + # Check if this is the first iteration + is_first_iteration = research_iteration == 1 + + # Check if this is the final iteration + is_final_iteration = research_iteration >= 5 + + if is_first_iteration: + system_prompt = DEEP_RESEARCH_FIRST_ITERATION_PROMPT.format( + repo_type=repo_type, + repo_url=repo_url, + repo_name=repo_name, + language_name=language_name + ) + elif is_final_iteration: + system_prompt = DEEP_RESEARCH_FINAL_ITERATION_PROMPT.format( + repo_type=repo_type, + repo_url=repo_url, + repo_name=repo_name, + research_iteration=research_iteration, + language_name=language_name + ) + else: + system_prompt = DEEP_RESEARCH_INTERMEDIATE_ITERATION_PROMPT.format( + repo_type=repo_type, + repo_url=repo_url, + repo_name=repo_name, + research_iteration=research_iteration, + language_name=language_name + ) + else: + system_prompt = SIMPLE_CHAT_SYSTEM_PROMPT.format( + repo_type=repo_type, + repo_url=repo_url, + repo_name=repo_name, + language_name=language_name + ) + + # Fetch file content if provided + file_content = "" + if request.filePath: + try: + file_content = get_file_content(request.repo_url, request.filePath, request.type, request.token) + logger.info(f"Successfully retrieved content for file: {request.filePath}") + except Exception as e: + logger.error(f"Error retrieving file content: {str(e)}") + # Continue without file content if there's an error + + # Format conversation history + conversation_history = "" + for turn_id, turn in request_rag.memory().items(): + if not isinstance(turn_id, int) and hasattr(turn, 'user_query') and hasattr(turn, 'assistant_response'): + conversation_history += f"\n{turn.user_query.query_str}\n{turn.assistant_response.response_str}\n\n" + + # Create the prompt with context + prompt = f"/no_think {system_prompt}\n\n" + + if conversation_history: + prompt += f"\n{conversation_history}\n\n" + + # Check if filePath is provided and fetch file content if it exists + if file_content: + # Add file content to the prompt after conversation history + prompt += f"\n{file_content}\n\n\n" + + # Only include context if it's not empty + CONTEXT_START = "" + CONTEXT_END = "" + if context_text.strip(): + prompt += f"{CONTEXT_START}\n{context_text}\n{CONTEXT_END}\n\n" + else: + # Add a note that we're skipping RAG due to size constraints or because it's the isolated API + logger.info("No context available from RAG") + prompt += "Answering without retrieval augmentation.\n\n" + + prompt += f"\n{query}\n\n\nAssistant: " + + model_config = get_model_config(request.provider, request.model)["model_kwargs"] + + if request.provider == "ollama": + prompt += " /no_think" + + model = OllamaClient() + model_kwargs = { + "model": model_config["model"], + "stream": True, + "options": { + "temperature": model_config["temperature"], + "top_p": model_config["top_p"], + "num_ctx": model_config["num_ctx"] + } + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "openrouter": + logger.info(f"Using OpenRouter with model: {request.model}") + + # Check if OpenRouter API key is set + if not OPENROUTER_API_KEY: + logger.warning("OPENROUTER_API_KEY not configured, but continuing with request") + # We'll let the OpenRouterClient handle this and return a friendly error message + + model = OpenRouterClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"] + } + # Only add top_p if it exists in the model config + if "top_p" in model_config: + model_kwargs["top_p"] = model_config["top_p"] + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "openai": + logger.info(f"Using Openai protocol with model: {request.model}") + + # Check if an API key is set for Openai + if not OPENAI_API_KEY: + logger.warning("OPENAI_API_KEY not configured, but continuing with request") + # We'll let the OpenAIClient handle this and return an error message + + # Initialize Openai client + model = OpenAIClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"] + } + # Only add top_p if it exists in the model config + if "top_p" in model_config: + model_kwargs["top_p"] = model_config["top_p"] + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "bedrock": + logger.info(f"Using AWS Bedrock with model: {request.model}") + + # Check if AWS credentials are set + if not AWS_ACCESS_KEY_ID or not AWS_SECRET_ACCESS_KEY: + logger.warning("AWS_ACCESS_KEY_ID or AWS_SECRET_ACCESS_KEY not configured, but continuing with request") + # We'll let the BedrockClient handle this and return an error message + + # Initialize Bedrock client + model = BedrockClient() + model_kwargs = { + "model": request.model, + "temperature": model_config["temperature"], + "top_p": model_config["top_p"] + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "azure": + logger.info(f"Using Azure AI with model: {request.model}") + + # Initialize Azure AI client + model = AzureAIClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"], + "top_p": model_config["top_p"] + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + else: + # Initialize Google Generative AI model + model = genai.GenerativeModel( + model_name=model_config["model"], + generation_config={ + "temperature": model_config["temperature"], + "top_p": model_config["top_p"], + "top_k": model_config["top_k"] + } + ) + + # Create a streaming response + async def response_stream(): + try: + if request.provider == "ollama": + # Get the response and handle it properly using the previously created api_kwargs + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Ollama + async for chunk in response: + text = getattr(chunk, 'response', None) or getattr(chunk, 'text', None) or str(chunk) + if text and not text.startswith('model=') and not text.startswith('created_at='): + text = text.replace('', '').replace('', '') + yield text + elif request.provider == "openrouter": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making OpenRouter API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from OpenRouter + async for chunk in response: + yield chunk + except Exception as e_openrouter: + logger.error(f"Error with OpenRouter API: {str(e_openrouter)}") + yield f"\nError with OpenRouter API: {str(e_openrouter)}\n\nPlease check that you have set the OPENROUTER_API_KEY environment variable with a valid API key." + elif request.provider == "openai": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making Openai API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Openai + async for chunk in response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + yield text + except Exception as e_openai: + logger.error(f"Error with Openai API: {str(e_openai)}") + yield f"\nError with Openai API: {str(e_openai)}\n\nPlease check that you have set the OPENAI_API_KEY environment variable with a valid API key." + elif request.provider == "bedrock": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making AWS Bedrock API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle response from Bedrock (not streaming yet) + if isinstance(response, str): + yield response + else: + # Try to extract text from the response + yield str(response) + except Exception as e_bedrock: + logger.error(f"Error with AWS Bedrock API: {str(e_bedrock)}") + yield f"\nError with AWS Bedrock API: {str(e_bedrock)}\n\nPlease check that you have set the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables with valid credentials." + elif request.provider == "azure": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making Azure AI API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Azure AI + async for chunk in response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + yield text + except Exception as e_azure: + logger.error(f"Error with Azure AI API: {str(e_azure)}") + yield f"\nError with Azure AI API: {str(e_azure)}\n\nPlease check that you have set the AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_VERSION environment variables with valid values." + else: + # Generate streaming response + response = model.generate_content(prompt, stream=True) + # Stream the response + for chunk in response: + if hasattr(chunk, 'text'): + yield chunk.text + + except Exception as e_outer: + logger.error(f"Error in streaming response: {str(e_outer)}") + error_message = str(e_outer) + + # Check for token limit errors + if "maximum context length" in error_message or "token limit" in error_message or "too many tokens" in error_message: + # If we hit a token limit error, try again without context + logger.warning("Token limit exceeded, retrying without context") + try: + # Create a simplified prompt without context + simplified_prompt = f"/no_think {system_prompt}\n\n" + if conversation_history: + simplified_prompt += f"\n{conversation_history}\n\n" + + # Include file content in the fallback prompt if it was retrieved + if request.filePath and file_content: + simplified_prompt += f"\n{file_content}\n\n\n" + + simplified_prompt += "Answering without retrieval augmentation due to input size constraints.\n\n" + simplified_prompt += f"\n{query}\n\n\nAssistant: " + + if request.provider == "ollama": + simplified_prompt += " /no_think" + + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from Ollama + async for chunk in fallback_response: + text = getattr(chunk, 'response', None) or getattr(chunk, 'text', None) or str(chunk) + if text and not text.startswith('model=') and not text.startswith('created_at='): + text = text.replace('', '').replace('', '') + yield text + elif request.provider == "openrouter": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback OpenRouter API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from OpenRouter + async for chunk in fallback_response: + yield chunk + except Exception as e_fallback: + logger.error(f"Error with OpenRouter API fallback: {str(e_fallback)}") + yield f"\nError with OpenRouter API fallback: {str(e_fallback)}\n\nPlease check that you have set the OPENROUTER_API_KEY environment variable with a valid API key." + elif request.provider == "openai": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback Openai API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from Openai + async for chunk in fallback_response: + text = chunk if isinstance(chunk, str) else getattr(chunk, 'text', str(chunk)) + yield text + except Exception as e_fallback: + logger.error(f"Error with Openai API fallback: {str(e_fallback)}") + yield f"\nError with Openai API fallback: {str(e_fallback)}\n\nPlease check that you have set the OPENAI_API_KEY environment variable with a valid API key." + elif request.provider == "bedrock": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback AWS Bedrock API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle response from Bedrock + if isinstance(fallback_response, str): + yield fallback_response + else: + # Try to extract text from the response + yield str(fallback_response) + except Exception as e_fallback: + logger.error(f"Error with AWS Bedrock API fallback: {str(e_fallback)}") + yield f"\nError with AWS Bedrock API fallback: {str(e_fallback)}\n\nPlease check that you have set the AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables with valid credentials." + elif request.provider == "azure": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback Azure AI API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback response from Azure AI + async for chunk in fallback_response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + yield text + except Exception as e_fallback: + logger.error(f"Error with Azure AI API fallback: {str(e_fallback)}") + yield f"\nError with Azure AI API fallback: {str(e_fallback)}\n\nPlease check that you have set the AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_VERSION environment variables with valid values." + else: + # Initialize Google Generative AI model + model_config = get_model_config(request.provider, request.model) + fallback_model = genai.GenerativeModel( + model_name=model_config["model"], + generation_config={ + "temperature": model_config["model_kwargs"].get("temperature", 0.7), + "top_p": model_config["model_kwargs"].get("top_p", 0.8), + "top_k": model_config["model_kwargs"].get("top_k", 40) + } + ) + + # Get streaming response using simplified prompt + fallback_response = fallback_model.generate_content(simplified_prompt, stream=True) + # Stream the fallback response + for chunk in fallback_response: + if hasattr(chunk, 'text'): + yield chunk.text + except Exception as e2: + logger.error(f"Error in fallback streaming response: {str(e2)}") + yield f"\nI apologize, but your request is too large for me to process. Please try a shorter query or break it into smaller parts." + else: + # For other errors, return the error message + yield f"\nError: {error_message}" + + # Return streaming response + return StreamingResponse(response_stream(), media_type="text/event-stream") + + except HTTPException: + raise + except Exception as e_handler: + error_msg = f"Error in streaming chat completion: {str(e_handler)}" + logger.error(error_msg) + raise HTTPException(status_code=500, detail=error_msg) + +@app.get("/") +async def root(): + """Root endpoint to check if the API is running""" + return {"status": "API is running", "message": "Navigate to /docs for API documentation"} diff --git a/reference-deepwiki/deepwiki-open-main/api/tools/embedder.py b/reference-deepwiki/deepwiki-open-main/api/tools/embedder.py new file mode 100644 index 0000000..fcdab3d --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/tools/embedder.py @@ -0,0 +1,54 @@ +import adalflow as adal + +from api.config import configs, get_embedder_type + + +def get_embedder(is_local_ollama: bool = False, use_google_embedder: bool = False, embedder_type: str = None) -> adal.Embedder: + """Get embedder based on configuration or parameters. + + Args: + is_local_ollama: Legacy parameter for Ollama embedder + use_google_embedder: Legacy parameter for Google embedder + embedder_type: Direct specification of embedder type ('ollama', 'google', 'openai') + + Returns: + adal.Embedder: Configured embedder instance + """ + # Determine which embedder config to use + if embedder_type: + if embedder_type == 'ollama': + embedder_config = configs["embedder_ollama"] + elif embedder_type == 'google': + embedder_config = configs["embedder_google"] + else: # default to openai + embedder_config = configs["embedder"] + elif is_local_ollama: + embedder_config = configs["embedder_ollama"] + elif use_google_embedder: + embedder_config = configs["embedder_google"] + else: + # Auto-detect based on current configuration + current_type = get_embedder_type() + if current_type == 'ollama': + embedder_config = configs["embedder_ollama"] + elif current_type == 'google': + embedder_config = configs["embedder_google"] + else: + embedder_config = configs["embedder"] + + # --- Initialize Embedder --- + model_client_class = embedder_config["model_client"] + if "initialize_kwargs" in embedder_config: + model_client = model_client_class(**embedder_config["initialize_kwargs"]) + else: + model_client = model_client_class() + + # Create embedder with basic parameters + embedder_kwargs = {"model_client": model_client, "model_kwargs": embedder_config["model_kwargs"]} + + embedder = adal.Embedder(**embedder_kwargs) + + # Set batch_size as an attribute if available (not a constructor parameter) + if "batch_size" in embedder_config: + embedder.batch_size = embedder_config["batch_size"] + return embedder diff --git a/reference-deepwiki/deepwiki-open-main/api/websocket_wiki.py b/reference-deepwiki/deepwiki-open-main/api/websocket_wiki.py new file mode 100644 index 0000000..2a7cce9 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/api/websocket_wiki.py @@ -0,0 +1,769 @@ +import logging +import os +from typing import List, Optional, Dict, Any +from urllib.parse import unquote + +import google.generativeai as genai +from adalflow.components.model_client.ollama_client import OllamaClient +from adalflow.core.types import ModelType +from fastapi import WebSocket, WebSocketDisconnect, HTTPException +from pydantic import BaseModel, Field + +from api.config import get_model_config, configs, OPENROUTER_API_KEY, OPENAI_API_KEY +from api.data_pipeline import count_tokens, get_file_content +from api.openai_client import OpenAIClient +from api.openrouter_client import OpenRouterClient +from api.azureai_client import AzureAIClient +from api.dashscope_client import DashscopeClient +from api.rag import RAG + +# Configure logging +from api.logging_config import setup_logging + +setup_logging() +logger = logging.getLogger(__name__) + + +# Models for the API +class ChatMessage(BaseModel): + role: str # 'user' or 'assistant' + content: str + +class ChatCompletionRequest(BaseModel): + """ + Model for requesting a chat completion. + """ + repo_url: str = Field(..., description="URL of the repository to query") + messages: List[ChatMessage] = Field(..., description="List of chat messages") + filePath: Optional[str] = Field(None, description="Optional path to a file in the repository to include in the prompt") + token: Optional[str] = Field(None, description="Personal access token for private repositories") + type: Optional[str] = Field("github", description="Type of repository (e.g., 'github', 'gitlab', 'bitbucket')") + + # model parameters + provider: str = Field("google", description="Model provider (google, openai, openrouter, ollama, azure)") + model: Optional[str] = Field(None, description="Model name for the specified provider") + + language: Optional[str] = Field("en", description="Language for content generation (e.g., 'en', 'ja', 'zh', 'es', 'kr', 'vi')") + excluded_dirs: Optional[str] = Field(None, description="Comma-separated list of directories to exclude from processing") + excluded_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to exclude from processing") + included_dirs: Optional[str] = Field(None, description="Comma-separated list of directories to include exclusively") + included_files: Optional[str] = Field(None, description="Comma-separated list of file patterns to include exclusively") + +async def handle_websocket_chat(websocket: WebSocket): + """ + Handle WebSocket connection for chat completions. + This replaces the HTTP streaming endpoint with a WebSocket connection. + """ + await websocket.accept() + + try: + # Receive and parse the request data + request_data = await websocket.receive_json() + request = ChatCompletionRequest(**request_data) + + # Check if request contains very large input + input_too_large = False + if request.messages and len(request.messages) > 0: + last_message = request.messages[-1] + if hasattr(last_message, 'content') and last_message.content: + tokens = count_tokens(last_message.content, request.provider == "ollama") + logger.info(f"Request size: {tokens} tokens") + if tokens > 8000: + logger.warning(f"Request exceeds recommended token limit ({tokens} > 7500)") + input_too_large = True + + # Create a new RAG instance for this request + try: + request_rag = RAG(provider=request.provider, model=request.model) + + # Extract custom file filter parameters if provided + excluded_dirs = None + excluded_files = None + included_dirs = None + included_files = None + + if request.excluded_dirs: + excluded_dirs = [unquote(dir_path) for dir_path in request.excluded_dirs.split('\n') if dir_path.strip()] + logger.info(f"Using custom excluded directories: {excluded_dirs}") + if request.excluded_files: + excluded_files = [unquote(file_pattern) for file_pattern in request.excluded_files.split('\n') if file_pattern.strip()] + logger.info(f"Using custom excluded files: {excluded_files}") + if request.included_dirs: + included_dirs = [unquote(dir_path) for dir_path in request.included_dirs.split('\n') if dir_path.strip()] + logger.info(f"Using custom included directories: {included_dirs}") + if request.included_files: + included_files = [unquote(file_pattern) for file_pattern in request.included_files.split('\n') if file_pattern.strip()] + logger.info(f"Using custom included files: {included_files}") + + request_rag.prepare_retriever(request.repo_url, request.type, request.token, excluded_dirs, excluded_files, included_dirs, included_files) + logger.info(f"Retriever prepared for {request.repo_url}") + except ValueError as e: + if "No valid documents with embeddings found" in str(e): + logger.error(f"No valid embeddings found: {str(e)}") + await websocket.send_text("Error: No valid document embeddings found. This may be due to embedding size inconsistencies or API errors during document processing. Please try again or check your repository content.") + await websocket.close() + return + else: + logger.error(f"ValueError preparing retriever: {str(e)}") + await websocket.send_text(f"Error preparing retriever: {str(e)}") + await websocket.close() + return + except Exception as e: + logger.error(f"Error preparing retriever: {str(e)}") + # Check for specific embedding-related errors + if "All embeddings should be of the same size" in str(e): + await websocket.send_text("Error: Inconsistent embedding sizes detected. Some documents may have failed to embed properly. Please try again.") + else: + await websocket.send_text(f"Error preparing retriever: {str(e)}") + await websocket.close() + return + + # Validate request + if not request.messages or len(request.messages) == 0: + await websocket.send_text("Error: No messages provided") + await websocket.close() + return + + last_message = request.messages[-1] + if last_message.role != "user": + await websocket.send_text("Error: Last message must be from the user") + await websocket.close() + return + + # Process previous messages to build conversation history + for i in range(0, len(request.messages) - 1, 2): + if i + 1 < len(request.messages): + user_msg = request.messages[i] + assistant_msg = request.messages[i + 1] + + if user_msg.role == "user" and assistant_msg.role == "assistant": + request_rag.memory.add_dialog_turn( + user_query=user_msg.content, + assistant_response=assistant_msg.content + ) + + # Check if this is a Deep Research request + is_deep_research = False + research_iteration = 1 + + # Process messages to detect Deep Research requests + for msg in request.messages: + if hasattr(msg, 'content') and msg.content and "[DEEP RESEARCH]" in msg.content: + is_deep_research = True + # Only remove the tag from the last message + if msg == request.messages[-1]: + # Remove the Deep Research tag + msg.content = msg.content.replace("[DEEP RESEARCH]", "").strip() + + # Count research iterations if this is a Deep Research request + if is_deep_research: + research_iteration = sum(1 for msg in request.messages if msg.role == 'assistant') + 1 + logger.info(f"Deep Research request detected - iteration {research_iteration}") + + # Check if this is a continuation request + if "continue" in last_message.content.lower() and "research" in last_message.content.lower(): + # Find the original topic from the first user message + original_topic = None + for msg in request.messages: + if msg.role == "user" and "continue" not in msg.content.lower(): + original_topic = msg.content.replace("[DEEP RESEARCH]", "").strip() + logger.info(f"Found original research topic: {original_topic}") + break + + if original_topic: + # Replace the continuation message with the original topic + last_message.content = original_topic + logger.info(f"Using original topic for research: {original_topic}") + + # Get the query from the last message + query = last_message.content + + # Only retrieve documents if input is not too large + context_text = "" + retrieved_documents = None + + if not input_too_large: + try: + # If filePath exists, modify the query for RAG to focus on the file + rag_query = query + if request.filePath: + # Use the file path to get relevant context about the file + rag_query = f"Contexts related to {request.filePath}" + logger.info(f"Modified RAG query to focus on file: {request.filePath}") + + # Try to perform RAG retrieval + try: + # This will use the actual RAG implementation + retrieved_documents = request_rag(rag_query, language=request.language) + + if retrieved_documents and retrieved_documents[0].documents: + # Format context for the prompt in a more structured way + documents = retrieved_documents[0].documents + logger.info(f"Retrieved {len(documents)} documents") + + # Group documents by file path + docs_by_file = {} + for doc in documents: + file_path = doc.meta_data.get('file_path', 'unknown') + if file_path not in docs_by_file: + docs_by_file[file_path] = [] + docs_by_file[file_path].append(doc) + + # Format context text with file path grouping + context_parts = [] + for file_path, docs in docs_by_file.items(): + # Add file header with metadata + header = f"## File Path: {file_path}\n\n" + # Add document content + content = "\n\n".join([doc.text for doc in docs]) + + context_parts.append(f"{header}{content}") + + # Join all parts with clear separation + context_text = "\n\n" + "-" * 10 + "\n\n".join(context_parts) + else: + logger.warning("No documents retrieved from RAG") + except Exception as e: + logger.error(f"Error in RAG retrieval: {str(e)}") + # Continue without RAG if there's an error + + except Exception as e: + logger.error(f"Error retrieving documents: {str(e)}") + context_text = "" + + # Get repository information + repo_url = request.repo_url + repo_name = repo_url.split("/")[-1] if "/" in repo_url else repo_url + + # Determine repository type + repo_type = request.type + + # Get language information + language_code = request.language or configs["lang_config"]["default"] + supported_langs = configs["lang_config"]["supported_languages"] + language_name = supported_langs.get(language_code, "English") + + # Create system prompt + if is_deep_research: + # Check if this is the first iteration + is_first_iteration = research_iteration == 1 + + # Check if this is the final iteration + is_final_iteration = research_iteration >= 5 + + if is_first_iteration: + system_prompt = f""" +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are conducting a multi-turn Deep Research process to thoroughly investigate the specific topic in the user's query. +Your goal is to provide detailed, focused information EXCLUSIVELY about this topic. +IMPORTANT:You MUST respond in {language_name} language. + + + +- This is the first iteration of a multi-turn research process focused EXCLUSIVELY on the user's query +- Start your response with "## Research Plan" +- Outline your approach to investigating this specific topic +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- Clearly state the specific topic you're researching to maintain focus throughout all iterations +- Identify the key aspects you'll need to research +- Provide initial findings based on the information available +- End with "## Next Steps" indicating what you'll investigate in the next iteration +- Do NOT provide a final conclusion yet - this is just the beginning of the research +- Do NOT include general repository information unless directly relevant to the query +- Focus EXCLUSIVELY on the specific topic being researched - do not drift to related topics +- Your research MUST directly address the original question +- NEVER respond with just "Continue the research" as an answer - always provide substantive research findings +- Remember that this topic will be maintained across all research iterations + + +""" + elif is_final_iteration: + system_prompt = f""" +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are in the final iteration of a Deep Research process focused EXCLUSIVELY on the latest user query. +Your goal is to synthesize all previous findings and provide a comprehensive conclusion that directly addresses this specific topic and ONLY this topic. +IMPORTANT:You MUST respond in {language_name} language. + + + +- This is the final iteration of the research process +- CAREFULLY review the entire conversation history to understand all previous findings +- Synthesize ALL findings from previous iterations into a comprehensive conclusion +- Start with "## Final Conclusion" +- Your conclusion MUST directly address the original question +- Stay STRICTLY focused on the specific topic - do not drift to related topics +- Include specific code references and implementation details related to the topic +- Highlight the most important discoveries and insights about this specific functionality +- Provide a complete and definitive answer to the original question +- Do NOT include general repository information unless directly relevant to the query +- Focus exclusively on the specific topic being researched +- NEVER respond with "Continue the research" as an answer - always provide a complete conclusion +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- Ensure your conclusion builds on and references key findings from previous iterations + + +""" + else: + system_prompt = f""" +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You are currently in iteration {research_iteration} of a Deep Research process focused EXCLUSIVELY on the latest user query. +Your goal is to build upon previous research iterations and go deeper into this specific topic without deviating from it. +IMPORTANT:You MUST respond in {language_name} language. + + + +- CAREFULLY review the conversation history to understand what has been researched so far +- Your response MUST build on previous research iterations - do not repeat information already covered +- Identify gaps or areas that need further exploration related to this specific topic +- Focus on one specific aspect that needs deeper investigation in this iteration +- Start your response with "## Research Update {research_iteration}" +- Clearly explain what you're investigating in this iteration +- Provide new insights that weren't covered in previous iterations +- If this is iteration 3, prepare for a final conclusion in the next iteration +- Do NOT include general repository information unless directly relevant to the query +- Focus EXCLUSIVELY on the specific topic being researched - do not drift to related topics +- If the topic is about a specific file or feature (like "Dockerfile"), focus ONLY on that file or feature +- NEVER respond with just "Continue the research" as an answer - always provide substantive research findings +- Your research MUST directly address the original question +- Maintain continuity with previous research iterations - this is a continuous investigation + + +""" + else: + system_prompt = f""" +You are an expert code analyst examining the {repo_type} repository: {repo_url} ({repo_name}). +You provide direct, concise, and accurate information about code repositories. +You NEVER start responses with markdown headers or code fences. +IMPORTANT:You MUST respond in {language_name} language. + + + +- Answer the user's question directly without ANY preamble or filler phrases +- DO NOT include any rationale, explanation, or extra comments. +- Strictly base answers ONLY on existing code or documents +- DO NOT speculate or invent citations. +- DO NOT start with preambles like "Okay, here's a breakdown" or "Here's an explanation" +- DO NOT start with markdown headers like "## Analysis of..." or any file path references +- DO NOT start with ```markdown code fences +- DO NOT end your response with ``` closing fences +- DO NOT start by repeating or acknowledging the question +- JUST START with the direct answer to the question + + +```markdown +## Analysis of `adalflow/adalflow/datasets/gsm8k.py` + +This file contains... +``` + + +- Format your response with proper markdown including headings, lists, and code blocks WITHIN your answer +- For code analysis, organize your response with clear sections +- Think step by step and structure your answer logically +- Start with the most relevant information that directly addresses the user's query +- Be precise and technical when discussing code +- Your response language should be in the same language as the user's query + + +""" + + # Fetch file content if provided + file_content = "" + if request.filePath: + try: + file_content = get_file_content(request.repo_url, request.filePath, request.type, request.token) + logger.info(f"Successfully retrieved content for file: {request.filePath}") + except Exception as e: + logger.error(f"Error retrieving file content: {str(e)}") + # Continue without file content if there's an error + + # Format conversation history + conversation_history = "" + for turn_id, turn in request_rag.memory().items(): + if not isinstance(turn_id, int) and hasattr(turn, 'user_query') and hasattr(turn, 'assistant_response'): + conversation_history += f"\n{turn.user_query.query_str}\n{turn.assistant_response.response_str}\n\n" + + # Create the prompt with context + prompt = f"/no_think {system_prompt}\n\n" + + if conversation_history: + prompt += f"\n{conversation_history}\n\n" + + # Check if filePath is provided and fetch file content if it exists + if file_content: + # Add file content to the prompt after conversation history + prompt += f"\n{file_content}\n\n\n" + + # Only include context if it's not empty + CONTEXT_START = "" + CONTEXT_END = "" + if context_text.strip(): + prompt += f"{CONTEXT_START}\n{context_text}\n{CONTEXT_END}\n\n" + else: + # Add a note that we're skipping RAG due to size constraints or because it's the isolated API + logger.info("No context available from RAG") + prompt += "Answering without retrieval augmentation.\n\n" + + prompt += f"\n{query}\n\n\nAssistant: " + + model_config = get_model_config(request.provider, request.model)["model_kwargs"] + + if request.provider == "ollama": + prompt += " /no_think" + + model = OllamaClient() + model_kwargs = { + "model": model_config["model"], + "stream": True, + "options": { + "temperature": model_config["temperature"], + "top_p": model_config["top_p"], + "num_ctx": model_config["num_ctx"] + } + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "openrouter": + logger.info(f"Using OpenRouter with model: {request.model}") + + # Check if OpenRouter API key is set + if not OPENROUTER_API_KEY: + logger.warning("OPENROUTER_API_KEY not configured, but continuing with request") + # We'll let the OpenRouterClient handle this and return a friendly error message + + model = OpenRouterClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"] + } + # Only add top_p if it exists in the model config + if "top_p" in model_config: + model_kwargs["top_p"] = model_config["top_p"] + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "openai": + logger.info(f"Using Openai protocol with model: {request.model}") + + # Check if an API key is set for Openai + if not OPENAI_API_KEY: + logger.warning("OPENAI_API_KEY not configured, but continuing with request") + # We'll let the OpenAIClient handle this and return an error message + + # Initialize Openai client + model = OpenAIClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"] + } + # Only add top_p if it exists in the model config + if "top_p" in model_config: + model_kwargs["top_p"] = model_config["top_p"] + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "azure": + logger.info(f"Using Azure AI with model: {request.model}") + + # Initialize Azure AI client + model = AzureAIClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"], + "top_p": model_config["top_p"] + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + elif request.provider == "dashscope": + logger.info(f"Using Dashscope with model: {request.model}") + + # Initialize Dashscope client + model = DashscopeClient() + model_kwargs = { + "model": request.model, + "stream": True, + "temperature": model_config["temperature"], + "top_p": model_config["top_p"] + } + + api_kwargs = model.convert_inputs_to_api_kwargs( + input=prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + else: + # Initialize Google Generative AI model + model = genai.GenerativeModel( + model_name=model_config["model"], + generation_config={ + "temperature": model_config["temperature"], + "top_p": model_config["top_p"], + "top_k": model_config["top_k"] + } + ) + + # Process the response based on the provider + try: + if request.provider == "ollama": + # Get the response and handle it properly using the previously created api_kwargs + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Ollama + async for chunk in response: + text = getattr(chunk, 'response', None) or getattr(chunk, 'text', None) or str(chunk) + if text and not text.startswith('model=') and not text.startswith('created_at='): + text = text.replace('', '').replace('', '') + await websocket.send_text(text) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + elif request.provider == "openrouter": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making OpenRouter API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from OpenRouter + async for chunk in response: + await websocket.send_text(chunk) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + except Exception as e_openrouter: + logger.error(f"Error with OpenRouter API: {str(e_openrouter)}") + error_msg = f"\nError with OpenRouter API: {str(e_openrouter)}\n\nPlease check that you have set the OPENROUTER_API_KEY environment variable with a valid API key." + await websocket.send_text(error_msg) + # Close the WebSocket connection after sending the error message + await websocket.close() + elif request.provider == "openai": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making Openai API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Openai + async for chunk in response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + await websocket.send_text(text) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + except Exception as e_openai: + logger.error(f"Error with Openai API: {str(e_openai)}") + error_msg = f"\nError with Openai API: {str(e_openai)}\n\nPlease check that you have set the OPENAI_API_KEY environment variable with a valid API key." + await websocket.send_text(error_msg) + # Close the WebSocket connection after sending the error message + await websocket.close() + elif request.provider == "azure": + try: + # Get the response and handle it properly using the previously created api_kwargs + logger.info("Making Azure AI API call") + response = await model.acall(api_kwargs=api_kwargs, model_type=ModelType.LLM) + # Handle streaming response from Azure AI + async for chunk in response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + await websocket.send_text(text) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + except Exception as e_azure: + logger.error(f"Error with Azure AI API: {str(e_azure)}") + error_msg = f"\nError with Azure AI API: {str(e_azure)}\n\nPlease check that you have set the AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_VERSION environment variables with valid values." + await websocket.send_text(error_msg) + # Close the WebSocket connection after sending the error message + await websocket.close() + else: + # Generate streaming response + response = model.generate_content(prompt, stream=True) + # Stream the response + for chunk in response: + if hasattr(chunk, 'text'): + await websocket.send_text(chunk.text) + # Explicitly close the WebSocket connection after the response is complete + await websocket.close() + + except Exception as e_outer: + logger.error(f"Error in streaming response: {str(e_outer)}") + error_message = str(e_outer) + + # Check for token limit errors + if "maximum context length" in error_message or "token limit" in error_message or "too many tokens" in error_message: + # If we hit a token limit error, try again without context + logger.warning("Token limit exceeded, retrying without context") + try: + # Create a simplified prompt without context + simplified_prompt = f"/no_think {system_prompt}\n\n" + if conversation_history: + simplified_prompt += f"\n{conversation_history}\n\n" + + # Include file content in the fallback prompt if it was retrieved + if request.filePath and file_content: + simplified_prompt += f"\n{file_content}\n\n\n" + + simplified_prompt += "Answering without retrieval augmentation due to input size constraints.\n\n" + simplified_prompt += f"\n{query}\n\n\nAssistant: " + + if request.provider == "ollama": + simplified_prompt += " /no_think" + + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from Ollama + async for chunk in fallback_response: + text = getattr(chunk, 'response', None) or getattr(chunk, 'text', None) or str(chunk) + if text and not text.startswith('model=') and not text.startswith('created_at='): + text = text.replace('', '').replace('', '') + await websocket.send_text(text) + elif request.provider == "openrouter": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback OpenRouter API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from OpenRouter + async for chunk in fallback_response: + await websocket.send_text(chunk) + except Exception as e_fallback: + logger.error(f"Error with OpenRouter API fallback: {str(e_fallback)}") + error_msg = f"\nError with OpenRouter API fallback: {str(e_fallback)}\n\nPlease check that you have set the OPENROUTER_API_KEY environment variable with a valid API key." + await websocket.send_text(error_msg) + elif request.provider == "openai": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback Openai API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback_response from Openai + async for chunk in fallback_response: + text = chunk if isinstance(chunk, str) else getattr(chunk, 'text', str(chunk)) + await websocket.send_text(text) + except Exception as e_fallback: + logger.error(f"Error with Openai API fallback: {str(e_fallback)}") + error_msg = f"\nError with Openai API fallback: {str(e_fallback)}\n\nPlease check that you have set the OPENAI_API_KEY environment variable with a valid API key." + await websocket.send_text(error_msg) + elif request.provider == "azure": + try: + # Create new api_kwargs with the simplified prompt + fallback_api_kwargs = model.convert_inputs_to_api_kwargs( + input=simplified_prompt, + model_kwargs=model_kwargs, + model_type=ModelType.LLM + ) + + # Get the response using the simplified prompt + logger.info("Making fallback Azure AI API call") + fallback_response = await model.acall(api_kwargs=fallback_api_kwargs, model_type=ModelType.LLM) + + # Handle streaming fallback response from Azure AI + async for chunk in fallback_response: + choices = getattr(chunk, "choices", []) + if len(choices) > 0: + delta = getattr(choices[0], "delta", None) + if delta is not None: + text = getattr(delta, "content", None) + if text is not None: + await websocket.send_text(text) + except Exception as e_fallback: + logger.error(f"Error with Azure AI API fallback: {str(e_fallback)}") + error_msg = f"\nError with Azure AI API fallback: {str(e_fallback)}\n\nPlease check that you have set the AZURE_OPENAI_API_KEY, AZURE_OPENAI_ENDPOINT, and AZURE_OPENAI_VERSION environment variables with valid values." + await websocket.send_text(error_msg) + else: + # Initialize Google Generative AI model + model_config = get_model_config(request.provider, request.model) + fallback_model = genai.GenerativeModel( + model_name=model_config["model"], + generation_config={ + "temperature": model_config["model_kwargs"].get("temperature", 0.7), + "top_p": model_config["model_kwargs"].get("top_p", 0.8), + "top_k": model_config["model_kwargs"].get("top_k", 40) + } + ) + + # Get streaming response using simplified prompt + fallback_response = fallback_model.generate_content(simplified_prompt, stream=True) + # Stream the fallback response + for chunk in fallback_response: + if hasattr(chunk, 'text'): + await websocket.send_text(chunk.text) + except Exception as e2: + logger.error(f"Error in fallback streaming response: {str(e2)}") + await websocket.send_text(f"\nI apologize, but your request is too large for me to process. Please try a shorter query or break it into smaller parts.") + # Close the WebSocket connection after sending the error message + await websocket.close() + else: + # For other errors, return the error message + await websocket.send_text(f"\nError: {error_message}") + # Close the WebSocket connection after sending the error message + await websocket.close() + + except WebSocketDisconnect: + logger.info("WebSocket disconnected") + except Exception as e: + logger.error(f"Error in WebSocket handler: {str(e)}") + try: + await websocket.send_text(f"Error: {str(e)}") + await websocket.close() + except: + pass diff --git a/reference-deepwiki/deepwiki-open-main/docker-compose.yml b/reference-deepwiki/deepwiki-open-main/docker-compose.yml new file mode 100644 index 0000000..0895380 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3.8' + +services: + deepwiki: + build: + context: . + dockerfile: Dockerfile + ports: + - "${PORT:-8001}:${PORT:-8001}" # API port + - "3000:3000" # Next.js port + env_file: + - .env + environment: + - PORT=${PORT:-8001} + - NODE_ENV=production + - SERVER_BASE_URL=http://localhost:${PORT:-8001} + - LOG_LEVEL=${LOG_LEVEL:-INFO} + - LOG_FILE_PATH=${LOG_FILE_PATH:-api/logs/application.log} + volumes: + - ~/.adalflow:/root/.adalflow # Persist repository and embedding data + - ./api/logs:/app/api/logs # Persist log files across container restarts + # Resource limits for docker-compose up (not Swarm mode) + mem_limit: 6g + mem_reservation: 2g + # Health check configuration + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:${PORT:-8001}/health"] + interval: 60s + timeout: 10s + retries: 3 + start_period: 30s diff --git a/reference-deepwiki/deepwiki-open-main/eslint.config.mjs b/reference-deepwiki/deepwiki-open-main/eslint.config.mjs new file mode 100644 index 0000000..c85fb67 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/eslint.config.mjs @@ -0,0 +1,16 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.extends("next/core-web-vitals", "next/typescript"), +]; + +export default eslintConfig; diff --git a/reference-deepwiki/deepwiki-open-main/next.config.ts b/reference-deepwiki/deepwiki-open-main/next.config.ts new file mode 100644 index 0000000..539857b --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/next.config.ts @@ -0,0 +1,70 @@ +import type { NextConfig } from "next"; + +const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + +const nextConfig: NextConfig = { + /* config options here */ + output: 'standalone', + // Optimize build for Docker + experimental: { + optimizePackageImports: ['@mermaid-js/mermaid', 'react-syntax-highlighter'], + }, + // Reduce memory usage during build + webpack: (config, { isServer }) => { + if (!isServer) { + config.resolve.fallback = { + ...config.resolve.fallback, + fs: false, + }; + } + // Optimize bundle size + config.optimization = { + ...config.optimization, + splitChunks: { + chunks: 'all', + cacheGroups: { + vendor: { + test: /[\\/]node_modules[\\/]/, + name: 'vendors', + chunks: 'all', + }, + }, + }, + }; + return config; + }, + async rewrites() { + return [ + { + source: '/api/wiki_cache/:path*', + destination: `${TARGET_SERVER_BASE_URL}/api/wiki_cache/:path*`, + }, + { + source: '/export/wiki/:path*', + destination: `${TARGET_SERVER_BASE_URL}/export/wiki/:path*`, + }, + { + source: '/api/wiki_cache', + destination: `${TARGET_SERVER_BASE_URL}/api/wiki_cache`, + }, + { + source: '/local_repo/structure', + destination: `${TARGET_SERVER_BASE_URL}/local_repo/structure`, + }, + { + source: '/api/auth/status', + destination: `${TARGET_SERVER_BASE_URL}/auth/status`, + }, + { + source: '/api/auth/validate', + destination: `${TARGET_SERVER_BASE_URL}/auth/validate`, + }, + { + source: '/api/lang/config', + destination: `${TARGET_SERVER_BASE_URL}/lang/config`, + }, + ]; + }, +}; + +export default nextConfig; diff --git a/reference-deepwiki/deepwiki-open-main/package-lock.json b/reference-deepwiki/deepwiki-open-main/package-lock.json new file mode 100644 index 0000000..db8e9c6 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/package-lock.json @@ -0,0 +1,9594 @@ +{ + "name": "deepwiki-open", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "deepwiki-open", + "version": "0.1.0", + "dependencies": { + "mermaid": "^11.4.1", + "next": "15.3.1", + "next-intl": "^4.1.0", + "next-themes": "^0.4.6", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-icons": "^5.5.0", + "react-markdown": "^10.1.0", + "react-syntax-highlighter": "^15.6.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "svg-pan-zoom": "^3.6.2" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@types/react-syntax-highlighter": "^15.5.13", + "eslint": "^9", + "eslint-config-next": "15.3.1", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@antfu/utils": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", + "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@emnapi/core": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", + "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", + "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.4.tgz", + "integrity": "sha512-qrycXDeaORzIqNhBOx0btnhpD1c+/qFIHAN9znofuMJX6QBwtbrmlpWfD4oiUUD2vJUOIYFA/gYtg2KAMGG7sA==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/intl-localematcher": "0.6.1", + "decimal.js": "^10.4.3", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/ecma402-abstract/node_modules/@formatjs/intl-localematcher": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.6.1.tgz", + "integrity": "sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz", + "integrity": "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.2.tgz", + "integrity": "sha512-AfiMi5NOSo2TQImsYAg8UYddsNJ/vUEv/HaNqiFjnI3ZFfWihUtD5QtuX6kHl8+H+d3qvnE/3HZrfzgdWpsLNA==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "@formatjs/icu-skeleton-parser": "1.8.14", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.14.tgz", + "integrity": "sha512-i4q4V4qslThK4Ig8SxyD76cp3+QJ3sAqr7f6q9VVfeGtxG9OhiAk3y9XF6Q41OymsKzsGQ6OQQoJNY4/lI8TcQ==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz", + "integrity": "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", + "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.0.0", + "@antfu/utils": "^8.1.0", + "@iconify/types": "^2.0.0", + "debug": "^4.4.0", + "globals": "^15.14.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "mlly": "^1.7.4" + } + }, + "node_modules/@iconify/utils/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz", + "integrity": "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz", + "integrity": "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.0" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz", + "integrity": "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz", + "integrity": "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz", + "integrity": "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz", + "integrity": "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz", + "integrity": "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz", + "integrity": "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz", + "integrity": "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz", + "integrity": "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz", + "integrity": "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz", + "integrity": "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz", + "integrity": "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz", + "integrity": "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.0" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz", + "integrity": "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.0" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz", + "integrity": "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz", + "integrity": "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.0" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz", + "integrity": "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.4.4" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz", + "integrity": "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz", + "integrity": "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz", + "integrity": "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.2.tgz", + "integrity": "sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ==", + "license": "MIT", + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.1.tgz", + "integrity": "sha512-cwK27QdzrMblHSn9DZRV+DQscHXRuJv6MydlJRpFSqJWZrTYMLzKDeyueJNN9MGd8NNiUKzDQADAf+dMLXX7YQ==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.3.1.tgz", + "integrity": "sha512-oEs4dsfM6iyER3jTzMm4kDSbrQJq8wZw5fmT6fg2V3SMo+kgG+cShzLfEV20senZzv8VF+puNLheiGPlBGsv2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.1.tgz", + "integrity": "sha512-hjDw4f4/nla+6wysBL07z52Gs55Gttp5Bsk5/8AncQLJoisvTBP0pRIBK/B16/KqQyH+uN4Ww8KkcAqJODYH3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.1.tgz", + "integrity": "sha512-q+aw+cJ2ooVYdCEqZVk+T4Ni10jF6Fo5DfpEV51OupMaV5XL6pf3GCzrk6kSSZBsMKZtVC1Zm/xaNBFpA6bJ2g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.1.tgz", + "integrity": "sha512-wBQ+jGUI3N0QZyWmmvRHjXjTWFy8o+zPFLSOyAyGFI94oJi+kK/LIZFJXeykvgXUk1NLDAEFDZw/NVINhdk9FQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.1.tgz", + "integrity": "sha512-IIxXEXRti/AulO9lWRHiCpUUR8AR/ZYLPALgiIg/9ENzMzLn3l0NSxVdva7R/VDcuSEBo0eGVCe3evSIHNz0Hg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.1.tgz", + "integrity": "sha512-bfI4AMhySJbyXQIKH5rmLJ5/BP7bPwuxauTvVEiJ/ADoddaA9fgyNNCcsbu9SlqfHDoZmfI6g2EjzLwbsVTr5A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.1.tgz", + "integrity": "sha512-FeAbR7FYMWR+Z+M5iSGytVryKHiAsc0x3Nc3J+FD5NVbD5Mqz7fTSy8CYliXinn7T26nDMbpExRUI/4ekTvoiA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.1.tgz", + "integrity": "sha512-yP7FueWjphQEPpJQ2oKmshk/ppOt+0/bB8JC8svPUZNy0Pi3KbPx2Llkzv1p8CoQa+D2wknINlJpHf3vtChVBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.1.tgz", + "integrity": "sha512-3PMvF2zRJAifcRNni9uMk/gulWfWS+qVI/pagd+4yLF5bcXPZPPH2xlYRYOsUjmCJOXSTAC2PjRzbhsRzR2fDQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz", + "integrity": "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@schummar/icu-type-parser": { + "version": "1.21.5", + "resolved": "https://registry.npmjs.org/@schummar/icu-type-parser/-/icu-type-parser-1.21.5.tgz", + "integrity": "sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==", + "license": "MIT" + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.12.tgz", + "integrity": "sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.5.1", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.12.tgz", + "integrity": "sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-arm64": "4.1.12", + "@tailwindcss/oxide-darwin-x64": "4.1.12", + "@tailwindcss/oxide-freebsd-x64": "4.1.12", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.12", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.12", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.12", + "@tailwindcss/oxide-linux-x64-musl": "4.1.12", + "@tailwindcss/oxide-wasm32-wasi": "4.1.12", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.12", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.12" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.12.tgz", + "integrity": "sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.12.tgz", + "integrity": "sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.12.tgz", + "integrity": "sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.12.tgz", + "integrity": "sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.12.tgz", + "integrity": "sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.12.tgz", + "integrity": "sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.12.tgz", + "integrity": "sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.12.tgz", + "integrity": "sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.12.tgz", + "integrity": "sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.12.tgz", + "integrity": "sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.5", + "@emnapi/runtime": "^1.4.5", + "@emnapi/wasi-threads": "^1.0.4", + "@napi-rs/wasm-runtime": "^0.2.12", + "@tybys/wasm-util": "^0.10.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.12.tgz", + "integrity": "sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.12.tgz", + "integrity": "sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.12.tgz", + "integrity": "sha512-5PpLYhCAwf9SJEeIsSmCDLgyVfdBhdBpzX1OJ87anT9IVR0Z9pjM0FNixCAUAHGnMBGB8K99SwAheXrT0Kh6QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.12", + "@tailwindcss/oxide": "4.1.12", + "postcss": "^8.4.41", + "tailwindcss": "4.1.12" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", + "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.11.tgz", + "integrity": "sha512-uug3FEEGv0r+jrecvUUpbY8lLisvIjg6AAic6a2bSP5OEOLeJsDSnvhCDov7ipFFMXS3orMpzlmi0ZcuGkBbow==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.11.tgz", + "integrity": "sha512-lr3jdBw/BGj49Eps7EvqlUaoeA0xpj3pc0RoJkHpYaCHkVK7i28dKyImLQb3JVlqs3aYSXf7qYuWOW/fgZnTXQ==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.7.tgz", + "integrity": "sha512-i5ZzwYpqjmrKenzkoLM2Ibzt6mAsM7pxB6BCIouEVVmgiqaMj1TjaK7hnA36hbW5aZv20kx7Lw6hWzPWg0Rurw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.13", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", + "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", + "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/type-utils": "8.40.0", + "@typescript-eslint/utils": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.40.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", + "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.40.0.tgz", + "integrity": "sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.40.0", + "@typescript-eslint/types": "^8.40.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz", + "integrity": "sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz", + "integrity": "sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", + "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.40.0.tgz", + "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz", + "integrity": "sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.40.0", + "@typescript-eslint/tsconfig-utils": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.40.0.tgz", + "integrity": "sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz", + "integrity": "sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.40.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001737", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz", + "integrity": "sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", + "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dompurify": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.3.1.tgz", + "integrity": "sha512-GnmyVd9TE/Ihe3RrvcafFhXErErtr2jS0JDeCSp3vWvy86AXwHsRBt0E3MqP/m8ACS1ivcsi5uaqjbhsG18qKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "15.3.1", + "@rushstack/eslint-patch": "^1.10.3", + "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^5.0.0" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5/node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5/node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript/node_modules/@types/hast": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz", + "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/hastscript/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/hastscript/node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hastscript/node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/hastscript/node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "license": "MIT" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/intl-messageformat": { + "version": "10.7.16", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.16.tgz", + "integrity": "sha512-UmdmHUmp5CIKKjSoE10la5yfU+AYJAaiYLsodbjL4lji83JNvgOQUjGaGhGrpFCb0Uh7sl7qfP1IyILa8Z40ug==", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/icu-messageformat-parser": "2.11.2", + "tslib": "^2.8.0" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "license": "MIT", + "optional": true + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/katex": { + "version": "0.16.22", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", + "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "license": "MIT" + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/magic-string": { + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.2.0.tgz", + "integrity": "sha512-LbbTuye+0dWRz2TS9KJ7wsnD4KAtpj0MVkWc90XvBa6AslXsT0hTBVH5k32pcSyHH1fst9XEFJunXHktVy0zlg==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.10.1", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.10.1.tgz", + "integrity": "sha512-0PdeADVWURz7VMAX0+MiMcgfxFKY4aweSGsjgFihe3XlMKNqmai/cugMrqTd3WNHM93V+K+AZL6Wu6tB5HmxRw==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.0.4", + "@iconify/utils": "^2.1.33", + "@mermaid-js/parser": "^0.6.2", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.11", + "dayjs": "^1.11.13", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^16.0.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", + "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/next/-/next-15.3.1.tgz", + "integrity": "sha512-8+dDV0xNLOgHlyBxP1GwHGVaNXsmp+2NhZEYrXr24GWLHtt27YrBPbPuHvzlhi7kZNYjeJNR93IF5zfFu5UL0g==", + "license": "MIT", + "dependencies": { + "@next/env": "15.3.1", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.3.1", + "@next/swc-darwin-x64": "15.3.1", + "@next/swc-linux-arm64-gnu": "15.3.1", + "@next/swc-linux-arm64-musl": "15.3.1", + "@next/swc-linux-x64-gnu": "15.3.1", + "@next/swc-linux-x64-musl": "15.3.1", + "@next/swc-win32-arm64-msvc": "15.3.1", + "@next/swc-win32-x64-msvc": "15.3.1", + "sharp": "^0.34.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-intl": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/next-intl/-/next-intl-4.3.5.tgz", + "integrity": "sha512-tT3SltfpPOCAQ9kVNr+8t6FUtVf8G0WFlJcVc8zj4WCMfuF8XFk4gZCN/MtjgDgkUISw5aKamOClJB4EsV95WQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/amannn" + } + ], + "license": "MIT", + "dependencies": { + "@formatjs/intl-localematcher": "^0.5.4", + "negotiator": "^1.0.0", + "use-intl": "^4.3.5" + }, + "peerDependencies": { + "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.3.tgz", + "integrity": "sha512-HebdyA9r20hgmA0q8RyRJ4c/vB4E6KL2HeWb5MNjU3iJEiT2w9jfU2RJsmI6f3Cy3SGE5tm0AIkBzM/E7e9/lQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "license": "MIT", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "license": "MIT", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz", + "integrity": "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.3", + "@img/sharp-darwin-x64": "0.34.3", + "@img/sharp-libvips-darwin-arm64": "1.2.0", + "@img/sharp-libvips-darwin-x64": "1.2.0", + "@img/sharp-libvips-linux-arm": "1.2.0", + "@img/sharp-libvips-linux-arm64": "1.2.0", + "@img/sharp-libvips-linux-ppc64": "1.2.0", + "@img/sharp-libvips-linux-s390x": "1.2.0", + "@img/sharp-libvips-linux-x64": "1.2.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", + "@img/sharp-libvips-linuxmusl-x64": "1.2.0", + "@img/sharp-linux-arm": "0.34.3", + "@img/sharp-linux-arm64": "0.34.3", + "@img/sharp-linux-ppc64": "0.34.3", + "@img/sharp-linux-s390x": "0.34.3", + "@img/sharp-linux-x64": "0.34.3", + "@img/sharp-linuxmusl-arm64": "0.34.3", + "@img/sharp-linuxmusl-x64": "0.34.3", + "@img/sharp-wasm32": "0.34.3", + "@img/sharp-win32-arm64": "0.34.3", + "@img/sharp-win32-ia32": "0.34.3", + "@img/sharp-win32-x64": "0.34.3" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-js": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", + "integrity": "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.9" + } + }, + "node_modules/style-to-object": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.9.tgz", + "integrity": "sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-pan-zoom": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/svg-pan-zoom/-/svg-pan-zoom-3.6.2.tgz", + "integrity": "sha512-JwnvRWfVKw/Xzfe6jriFyfey/lWJLq4bUh2jwoR5ChWQuQoOH8FEh1l/bEp46iHHKHEJWIyFJETbazraxNWECg==", + "license": "BSD-2-Clause" + }, + "node_modules/tailwindcss": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.12.tgz", + "integrity": "sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.3.tgz", + "integrity": "sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-intl": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/use-intl/-/use-intl-4.3.5.tgz", + "integrity": "sha512-qyL1TZNesVbzj/75ZbYsi+xzNSiFqp5rIVsiAN0JT8rPMSjX0/3KQz76aJIrngI1/wIQdVYFVdImWh5yAv+dWA==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "^2.2.0", + "@schummar/icu-type-parser": "1.21.5", + "intl-messageformat": "^10.5.14" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/reference-deepwiki/deepwiki-open-main/package.json b/reference-deepwiki/deepwiki-open-main/package.json new file mode 100644 index 0000000..7fb2b9c --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/package.json @@ -0,0 +1,38 @@ +{ + "name": "deepwiki-open", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev --turbopack --port 3000", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "mermaid": "^11.4.1", + "next": "15.3.1", + "next-intl": "^4.1.0", + "next-themes": "^0.4.6", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-icons": "^5.5.0", + "react-markdown": "^10.1.0", + "react-syntax-highlighter": "^15.6.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "svg-pan-zoom": "^3.6.2" + }, + "devDependencies": { + "@eslint/eslintrc": "^3", + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@types/react-syntax-highlighter": "^15.5.13", + "eslint": "^9", + "eslint-config-next": "15.3.1", + "tailwindcss": "^4", + "typescript": "^5" + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" +} diff --git a/reference-deepwiki/deepwiki-open-main/postcss.config.mjs b/reference-deepwiki/deepwiki-open-main/postcss.config.mjs new file mode 100644 index 0000000..c7bcb4b --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/postcss.config.mjs @@ -0,0 +1,5 @@ +const config = { + plugins: ["@tailwindcss/postcss"], +}; + +export default config; diff --git a/reference-deepwiki/deepwiki-open-main/public/file.svg b/reference-deepwiki/deepwiki-open-main/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/public/globe.svg b/reference-deepwiki/deepwiki-open-main/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/public/next.svg b/reference-deepwiki/deepwiki-open-main/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/public/vercel.svg b/reference-deepwiki/deepwiki-open-main/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/public/window.svg b/reference-deepwiki/deepwiki-open-main/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/pyproject.toml b/reference-deepwiki/deepwiki-open-main/pyproject.toml new file mode 100644 index 0000000..ed1365d --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/pyproject.toml @@ -0,0 +1,27 @@ +[project] +name = "deepwiki-open" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "fastapi>=0.95.0", + "uvicorn>=0.21.1", + "pydantic>=2.0.0", + "google-generativeai>=0.3.0", + "tiktoken>=0.5.0", + "adalflow>=0.1.0", + "numpy>=1.24.0", + "faiss-cpu>=1.7.4", + "langid>=1.1.6", + "requests>=2.28.0", + "jinja2>=3.1.2", + "python-dotenv>=1.0.0", + "openai>=1.76.2", + "ollama>=0.4.8", + "aiohttp>=3.8.4", + "boto3>=1.34.0", + "pytest>=7.0.0", + "azure-identity>=1.12.0", + "azure-core>=1.24.0" +] diff --git a/reference-deepwiki/deepwiki-open-main/pytest.ini b/reference-deepwiki/deepwiki-open-main/pytest.ini new file mode 100644 index 0000000..3395d32 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/pytest.ini @@ -0,0 +1,15 @@ +[tool:pytest] +testpaths = test +python_files = test_*.py *_test.py +python_classes = Test* +python_functions = test_* +addopts = + -v + --strict-markers + --disable-warnings + --tb=short +markers = + unit: Unit tests + integration: Integration tests + slow: Slow tests that take more than a few seconds + network: Tests that require network access diff --git a/reference-deepwiki/deepwiki-open-main/run.sh b/reference-deepwiki/deepwiki-open-main/run.sh new file mode 100644 index 0000000..c2b5238 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/run.sh @@ -0,0 +1 @@ +uv run -m api.main \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/screenshots/DeepResearch.png b/reference-deepwiki/deepwiki-open-main/screenshots/DeepResearch.png new file mode 100644 index 0000000000000000000000000000000000000000..8b49cda7b3a65c0218c3d15e4e2ca44e63e91fc8 GIT binary patch literal 100951 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

@t1A<-6Ng+6s+ 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 literal 0 HcmV?d00001 diff --git a/reference-deepwiki/deepwiki-open-main/screenshots/Deepwiki.png b/reference-deepwiki/deepwiki-open-main/screenshots/Deepwiki.png new file mode 100644 index 0000000000000000000000000000000000000000..7365c1572fd8603ed7c105a592c7a24fdfea0144 GIT binary patch literal 2133596 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

E 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 z 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%0A}w`aqf@ehaSuwGd% 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 z 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×PlDcy|nw;ZW2?@m<7QyhkG=LyPS?)2IUR2g85ftVnqI z0D8_FRi0Qmnp05{2K3lgpwAk)WMo00az=CI^uo<{3yP;_W$8UFw-izDtPZo1 zATwBCD;ESW|7TEDKFn)n)q=e67(-zhF&_TEHXL6d?&%;+Z$JA$R>L8x$OsaxL*WL- z#FZ%`Y;}A~r6dPisG3-_5(XYO3A(q_A+AoOaiHPd6 z?@Jp&ilJ*?XUT>!BQSzzzr4N4ipR&gF+V{=XC(}|`#3|uz9CGYo1^lNELq$av4jvE z`Dl4i%v|%1z=rb~*sVlK!z=_v0dqHVGv^#=`b;D%>lg`vP~dc9COn`R8|Z}_NPtXJ zoaT*NQgSh4JyL_DtEeEaF!8(-9P?nOg3STf4JZ zK7Prn^yZ`QQOcP%5Wsrs*Gxuc#d(u%j)&`grrUu_mvdo}($FDR``ID$1aQ>q$(2Mq z3|#`8=abRXkSYU+%;o6}iIuC?V<1@A;y{jR|E_mnEDYP5p2y<>*H_d&XQqR-9uG!& za^Z3`Gb9Kxn%C>}>GZc_96%;rOxZauJRT1a18tmS8mrv?gFrC0?@k?Ov@ikKaWnGz z+bJdgk0M40W}Gw0^){7<7r<1|qrIqbbsr4iw9`vwrUmxd^;nlrWd*eOz*RNmy`17M46W&4&$;MO^0t~h%d<>IxNsPw0Sql5r zGaXd`Pj62dyvd{32S5J!^Ej3}`R(^VXTMk}mbm17vKXGK&h#8X&X$>&RVx{LPoJ~a z3Y$YkcS@mnd_4AkGQ)GJujkplJ*u>X@bU5Cw&16q{;$c$U`YJ=$M0wNmQ*V<86TC^ z&)p*_KGw&ol)%c!vKNd5;CBQS5063w-qnd|KRs1TbI$8bpGcai$}I2scaIw}X?iw* ze(gQy`@jA4SU#4Co2c0Eb1F-^ooZC| zu^_-rE}!Ssy=U~==i^b1>uCy*j$W^qFm$kT+gx$MJjzT^DTY%PDqQFIZV3b$6JkbX zS{w+{Y!_jAB)T|GWBRhv8+&Kvwk=%rB2x&eB*Y-x5?=D5cZ%irJtCqQlGpVEG&6-% zxBYT1i^ZW4k>mAvhj+iY#yYEyH6DSBjEjh{l=u3G zFi`esE8bEuA@%T0TD6mTG;uMRgzzq*?zDpq&m0`TDgqN(0fa_#ED&pyN!32py`B~! z3cF|T0|I@c!Cc_q6_6cinBb)_&;~`h2Bo^^wCx)<^kqaMYK5Rrd?xQVAxRa9NF$>zR3=icRWBimBtkL~lK@%%F5`Z!yao)Qr{U%5 zT7lfhkrFBzkxRGY_NoI=n?nQZ2PGAW2!S|2Tph28o)F|I)9BT&*WT{CU6uO#O9pUn zRJk#xR%k{>Li+E&zmwYm85aQw+XoY#(E#A0NEGly1y38pp(!=Se} zeNi_adwNl2W>k}8rC;Z6S)EyqM`KL0siR3otyP%{hZVu-K6uk-LJfEk7OpPJfCgqo zBF;XO=O&DVFrwNHE z45>}Nc(Z0l-59ve^I3S*;pDXn(m$b3(wUJ1Ix14{EE+=x2*zFW+EU&K>OCwC&`oSr zG^{H{z>#1s_`|$-TLlfWt#CTbg*v_VO9YZvIpU-e6sfRnJu7Jn8b^)jhy*z^Nn;}I z!Ai_vx>kVfX+*ePoHz5!(tk_uywbBg{j?$zincM3BVC~H>5*S24mFe^k&j2wB5`FTbFtPLb+>{m zm(7*kV^R5B91lRwCGnWFB0%p2;VC-)J4-%&p3?>sh0I`Lqw zwRpU{CnEz?pZ$EkG?-wcy=V#&ks?|Ksb9aXi}G);ulx1%PT5;*DM;@{J)>bLryI=f zjxvQcGYS!_Vl=ZIX%zDKq&updXDni^I(tX@o(P*3!0MPNsTabI?V71TXQUw!6)`QI z$;vT>M@>%yuh;255mpZ>K;PHFs9Zg>A{}0tnVIo=9p|83BbhhE!C)Z~ z2!)W>GzxiFcVGR%yt*j`dG^tm?l5y-(+MULnoU{Fbl+32Ng%Pi&(!+#-H$&?jL_@% z-*8Sw$bhBDey{GXMAaV})jb5$xoBaDX}FTpOrgH+ty=5z56lYmpa1@Ez6qP=b7mGr zj1a6Wc^fFCvu}7EWdX!0zwF*yI!=M)t6$&$`17ofqnY{o<=0<6>I#BU#k^@WY*^!* zwJJ(8w&((sLgOhDrf2r%@Ms?2efspnPpw(SZ@>R`USHR$Ytgl7OR$~? zU}XjJwKpuW0lV9;GczP-Uu?6F2Z3bwR1_Ntp=Z^DjDg*q^V~1ZIo%&Wey>lDfU@#@ z`R(=POWq>DwWtAk7(tc(bWNR;`JILOLDKzhq|W_mO( z5g9ky9Iw|FreD*&85uUOL646QBrC$$FP-T=S7!jITjKM)dM2|XDjuJLZiqTFpS>Sz zbswDr#HXMC{i`GG}B`(sO4^O@O-`wMy1Fa9b?hqrQ)z!{Y(QltGEnR~8>`0OhK)60;Tha(f6Jc&>Iy>lQ@r*aFlFOqx#$RRFqY#1^ zig-h+T^Ml?oUwiXHnKBK4|oW*?A;Jkuo{H!9Owr4wjVe>JsrWh7#dg1jxz*_yHD1v zm7=-<4U)-BlHpAd&>fM}vS_Cs#o+R|5njPlGu`YxnY8^`OK*feiyPJ?<{nK~UjMw2ks zM|Rb@bfn7&PrW>z5k-Z?1wnzS?$*g7B1Ei~Ji&@iD5z9&#-`S)0EKv-iU8RRckb;O%Fl_o|rj7bGNLHDiOy03wKsQ(V zwzPBgNH#~#D4C)F82;ks_Bd$fy3Q`5%S40m6usN0ExntW8^>CKNKm49nOvGV6F^2B z#|%mP*hCFqhnWd6D|Mz##_vJMQjLf#!-QKv05FOLGFLKJJpgf~2TYl%>DTM%&fKQe zgxwp>TUrs4=lTvS8lribO884SroNJI9t58DsB~k7GgxIeGHEchW=Sxa$sU!$dmg2uNqrABW1nv+6Sm z2c_N2bPw=hj3T;sOUNkQGfv`VwJEsIL0BzC%RW6+74q6VFAi{e8X>taf%QG1z}Yuw zT*NiN`l}gF7~6ES9^H1FH01~*V|>ipi7Z9P`E((#RGnnODl4lzpclI5AkcQv$gi0H zF$@OBQ!RNn?o2^TWCo2)G{g?ZOoz3f_TLQ{1hFbG_WOE`WNB|!#hfGFDc0^|ag7Jg z1gu1a14&SCH%2lrGiuw#K(bg7ar(k7Y#?j-&J4gx3)`>As$5CLo5Vt0p+&Nw-LHKl zMA>xIbu&yr3Bf`3Oawdz@&J8I)eGm{h(U!0ZC-S|Z^kq(&p%;sL`qp#T$v=<^q}Al z5&_BOT^Whp+I!Eal~8+gaeuO)6Zho#HEgRtynHoklxcR1nHg3AdN#|&AS!G5wy}2L zu~vI=W5{4)gsK(90Ik_?6Z2~yO=pBj=Li_a3|6139elm|Oy6tL5i2viK4k>c&xX&G zs3dYMHXbJ^fq_hz{vTjZE372wD@vl36cbfvjyE$|%f}16_<BvHBUc1h)zO?wqjYd@x^+Em_|*TNXkPk+ zZBA`9jG^pA&{~*)b>e4wg1OduJU%3)z`4}39_aLStpzn5S##&GSgXniEk9jnBD`Y` z1WnM7RIIXH@urz}I~nbc#Y4e3`?LdtE+EqyE4KeAORbWe(D<%WfF{h3vXRheL?KVeL^`tj-WVJfh{ ze0@Iu%u1=Fa?gf5NZ9Y&=N^oA<$P6;FupfZXAU%o*t0V~zWduhCX&#fzx)g5^{9v6 zE;M2DonU_a^oGK={MXqw!(Mq>=JY%&-(LAaMF#dcKYaINe*U3_PYe6EKUXy0{-x<{ zqh+5yI@3CHyi@>)z*-NE7sVN5pS{-dA7Rt2<1>Po7{vPiZ~r(mRqN}wZ{L3XB@xI- zx*wTfB9b6l=jK^eE#%lw?6&w z;}1XnW6wn8eEs(A%a>0ToW3i%Iq)?V7F~uKYb}cqbT=_frXcS>A8S2Ug;jZ@i0A|P<`1%ac%JijCc-P1g059H|90QY{?$`H}$ z=|Ba;@#NDJRI<8vR#_%uFQ==ABYdny#B{?vKIm>nXX;U}=Tn#-JkM*tPDII6eiEb{ zv_oq?P?>;Urz-&R^s`Sh7DumnzV^9*Gw9o#&p-V5w}1TOHL{xTxgJ5c;%=Co?If($b@w(GFlH7*hLcg+iJv_kmY(Z2yI|A!-H&P?>=%APMG3&HMq(;Uy5CRod_IY?5V;R5ws*&M3J0e2JOv>5dUa?tB7*z}Q*5E!m z!K{mMyQUiqNB5i&xv&6J`~|O4lhd6Mt+6s6jJbb~S0l*GNadYpuV& z>s(!*nk5v$2>6I32s=*RA{H7Stqf>@n_trJZu)heVRES?5g`Q_DHpSRH;&pAHN&(> z3Teksq=h9$TN&a!*JZ%G5s7%?SC~=345yB#m;8oU4Q~oHb<(pKPZl)O7;_n%nr`|- zRm2JsxQ_i>aazUYDFz@)6x!FYG;<wP9DrO%5cmuvNqJ4;a_2 z*1P#0#2r*x34KGxF+zi>JAAQ333Dq@K=Owss9!I?3+EgRuBSb$r?{ozT_x4yOrPC7 z?d}5Cg?r5)0RMkX{oRsfN0Orp0;+1;JxC^#nOWU^W-jI-=KUY&$m!}z{zv#SQ^j1s zoHZ9!LP_C|hwrtQnL>dNk}}KYG>^m;c>j5wpy@cb9cj*<;nTi3I{w7c3_Eq@iu-_Z`ncnK zj_G<0Q@zY63%{J0?py;kz5A?Jak`@Hp%~45_lB+7cGEBdJw23_12D1@75mxKj#IIF zs#4BE%>at!-y)z810&55jXd?6OBeV*?Ja>}=dbn3ig|oJcN)Ui5A=TMCc%3yK$5^Y z0;pD>i4-LcBPw%ME}_ppFtPQx*ApwsWaKvgS#!Z>R-*(0QT}>SvIwZCTx)rq9$>eE zq;CEyvN*^~LgNfFDk^N|6qn~1ZPg4GpAdl_RuyJIH&hH3EmX`InWdm zn%64t>x%(IpC&W2Ac@!T7KO-oo?R8MwH)zDrU-)#tXlLO^UWiZ32X9^7z|RNPM3z=iDqHn{M90Cr0QgIjqEj=+?e)P|E=G(W zE-zvjyt#U~k2`4>rx?&sGiQzonzG3<>bfd!FlHF0xq)Wu7~5qkW{W`w1IY;F*?a71 zyoa}3dZ{rt>{KoKS@n+4g<8;v{WUN3|%)1rje+Y2BSXovgIqkj5TueY~%0#z^HA0c)h z&CEWx14WpzNhvX-*?^au?M01xdX%dKcUWZ*LPussVsJ)Z{`MnZ?~Lk?Z{L3V#r-`I zF`88-c6Qd1RKZUhATr%e(jVt}PBVkS?#bXhk513vyPtltW9^TxzwhUxqHdEZ#2XS& z1S+yyxt3xWQB}#jPT1l(-RF#iNITI&jNV_reyg|d-+uh*^t=_n{`%|w_J{Zy@a#hl zCmgJ+%C+9AQl|-q0hf%&wgoSrXR_*fwm9lpuk~7KdWDl*-~IIWR%yWVeEs>~tK1Ig z-SxRi6jRIv5*2{t-Y$Oy-BIWYh}JyM(M(m@Gb`seyHm&^$eyV*i&v4k&jI7h-~M*& z3x4+Rzx*e4%zm9|-_aSgvp8}AhDY4$V`kWqboTKS=jCZj-F*w3kaQh^l&qC6tC+*I z5(?hJhv#`_Z|sSv-t+xG{*mi%Uw0$;zVOE{zx?srzsW!)_Sp42ETng zu`tE;F)BEWd3Hz6yfBUchXJrb>OjJ=eDsF{> z6%Y~5V~PyMsNde+l9^eJ`SyHJ8iu;Nr`9^V&3&6Y(a;c&{qf<=qWOC3wFLD(5!a$} z&ffcZdws#+c|Jz-JZ;{d4J)tL`*N)VFpT3i4@{rNOhrngx%u=fxk{cFUhi)+Eks30 z3OHUTRn_&>N;8~64?Zo{pFT-2{%WEc+^s3lZhg93iA7e6be=4x8Xa{8dsuVW0-*S|a95@6%9AiUBi_H}877Bf>8WAg+DKN$t$hFcSxM zm%t~XrbsZyeicx*rl*36h#?JcfOJ}Yjxc8|!ubDFBhAI_*a>o1@q=15qi1imA~@R< z`iN?@3%QTSgL`?GT@QmJwl5+q+P5jdm1Md+4n;t{XYOiR15XLEvBUfhs{0_pblLY+ z_doY)(8!Wd&%s5FAXoAeR!!G-UI5)dBEKofWVLCGFi9eY1BT~n8*97*&gsL^Ov}!B z2`mM2r6h#T^vB1C#q4|cYCl&@-%au9qL`M3X)BQ06%cdIX*iF24QqcbyA;bQ8xaW^ zcgxc!q7)LY!1wIAcfpG^aVkH2o#H2X7ZH7XS8W>AnS)~YF_4BBQjK0~-S`*P_kc7h ztt05n7)Ivd&1dzd9rCwTjG2MyW3lp+sWg4YN!p(FI@?dNZ}gFi5ocyD1iGu7y)F4+ zZ;4v3<%s^hTL%$xwT2xRK14?`gF&l1NGCP>?AL3N7dK!etsghQVDE{QKHz7}N{8;o z_D;(nMy#^ALUHxqaiylG7^Dr~k`yN016fi2-6(8rbGpyTxY1}D!EW^FGn?df;?EpR zCY3VDDgZiwKM=uCw*ahq`!qT;*HfN3{=_H^zS3b1cD;ZHUT}E2cCho-LqZxyJO_-mizyQ^I^SUa0b3s;}R{I}` z|8IxO9$1OR7FM$C*`tM9ZNX0MLTVW&sB_9|L{qeZGKgBppaJ_v_v z;H0xRO9R-zG~Hy)3_}vyiLpBq1D?##{_i@(1HYm{09ARX(oe@v`b}bK;57a3;e7%7 zu~v^QN--&BuJrGY#I(9EE`o`{{S#%dk8o63nJF5tridi-^zp{EyE6bppKS?C#O?zy zk^^UvND9->eh36JB34jPu6n)l1`tC@qIFGjlI{@JpN~fDnexax$3`Z)?hHKbHiWUz zY?rljV!SL%rw?5aMdzcsFRk+)g4Z6Dd7Iy;Za85yfX3Th8(B}E$c0Eci4L4T)>$Cv zOlFS5l$yvmd*3PuZ!U-+XJCINK__l-kpk2xSqS!^+w;e*qO4a5zF%-Z8&p;$S!Gpf zt~bqusVjs%l?&2M7Fc?9q>_g2t;5YRv;9wG$wg~kj`m! zpE*9w!h4jtH`UL}s`n|#%&3@d0;iRgkkrT1V=^LY;O|M0daWc_l}HlsMq))B9Rnp8 z(Q>^ZWm8-d5l*pr!Btge2n0tl^{R88uODCA77;V%!f$KCHaOxLA;Lu&5dpCq`yBh5 zG`pu)zV$i5PuMb})*D9diioWB{x@bV^v556a2du>8l&#$i8XPhVG9$Yvpmd5kSjA3 z{oMP)S}E!6`@b<4lF&ZC|B~S<7}LkqveF#28cw7#nXl4)H>6+Bt2lj3dS%9b z4r{&t_|sP*gZ<~%=l9>-M=4-ssWF&7O+aqdghiO>-RKrknHP%aD<+h7Q4*tmc4N*= zPvm!h`zhD^U=s7&zkeNyL!&1ZPBo0WA~NII4?j($K^CLdn(n8! zx-09P2jm{vXpIXj3+?mm&tg<@88ctFcxe7 z@yDOP{kB#Pz*uL)O38|-3TU4FuzOl>uh)6pWpXmECAKOt%=Dp1h-s;|HN zy8rz7?G=bnMbEVK7L_8S9lfda``_fnjnK4TF9f*TWvjPNE|b&pt<3%>W;`DsZBDyR zBzN!WCb7?+@hT-P{Kw3@uQS{WL~1anL^Hl{M2OlDVqXZ5#&%uh%Oo&we6leMoZUbco1Y85y}Et973JEut#(RYk?k8Z%G# zV_w&6O5T2nQOI01a+|~PzRA9U*ZW(o*E!cd3YYz9!i#$$Y~04cO~!F!L@|QK1`UrK zCk)(i7()`kik>-+&9oSG0bt^su^WOjPVey(O~**D6Eji}l4I|&1X%?T8Pj_xu<5;R z0-9h@Tvc}6#I-XIT1;qWRe+POhxeAj$ZKut1{1=8U3!B8mt|^BfMOiYs_H(vn@RBA z#k-|Dl88YzwP^GjcNEmP7lo&TDr;z6utaW^{B{LY1((>_rgVswUexdvVOUYp{@-Aj{XnxE(UQ{;lNA+)1b2w1+lr$4 zU?$;8o$hvg?Eaq+YWM`P`qDCZ7{17kZwkRS`wBx{2oVr(`L@uyX!`h# z7GPFYWFV$*2Ivxxm%87xnl^eXtS}?9?vkz|B1=wY#chCsMCf4beZ?(P(`QBzP|qF=FLhWG3Jxh+ zr?6dSG}Ap{t`-gegLN>tY-hMBEFTCI{5 za7oG}F_A8*6`Z?tnMGt>Oo}NqGt&zC-(1OOKMaP==Sf9KI*%9WRLNqx6Qt7wv|>r> zKDn0V_5dbWwIV9OGaZPkS6rDMd$(N@vaKU@`rLOy-2Kft=~*q|m?sT~*;Jfz!a;U?M)`&tJYsCh(veC(={ zIMc893M$q9R~KRe?f7;GwUxcPOfHEUL&4ko<3(Z_9n-b3$dycn1C#bT0yU}vu-3?<*HWP#G9Xex}hN=q~XeG z%_R<*X8zgwqOWV6t`Af>V49zGDqjGSO!SL_GKo(K+0P#(E%KWa+T9%Bi`GW3CC6a86g|a z=Q{sT(x({45vN0tTd8$hIU|<;m=0^U&{9OMRT0&@F;q|7fZI@!;qy*2eTB_T$7V0| zcP&re6h{-aY*g?slWG93NIyyBWkuYNCUwqlB; z$gEe*^z9ud^{GO7oA-QtlP!JMxDENTH9e-{A7$k9Omj}hiWRXkdywm8G%|6gF0C&YV-B-kN&7{q3jCjM2A0exB!B3YyuLt^&i$AQ+8|<5UxkFRoJq8AfL3YEwR(-m+ z{lZ4i23Q%v8cD5+to25r5MJm`e@Hm9!OL_z-O^;}K0G}ZqdBwI+Ks9AAO8N&5uWEP zs=xm6+b{q7Z83o1ah9ak+dvXinaH{ea?LcQ*Xs=gG^`$Oe67mh^L+S)lY*TNR-(Nqi72m*2}LrPb1je7NJG3|L>phT>h$p#Y`-Rd%pbZUtfOw z>0CT7v-t7H?|=OI^LnlEJ%SAKQ0Mgd_=fJ4WgFl*CsrB)LJ*p&WiQj&`|VYx%|v3) z$zWBr`-mqp6B2^^oMdXa_jaOWJ`sn(0CCO%Kp;^W(PMiHBjW~&dlTpF?fn%QwODbP zyNx!N*zqI$_YFO$=i7&7dT(i7uXS#j68Xdb=l?rGI?1j(VcD0@8TW?HjM)s*eRbo% zhdwtzX~L(DTc2({>K)AEhSaP`W#yd1TE4yQMuzO{2$2;|SlZ%F-Y`7GW5dTZ!KmnS z23(BYQ!5D_V@UzYbVP|+#OcoEB9*rM)EJA<4ih68UZZ{bK5)Y`j1^u?_MH+tB4*@W zzSIQCxL^cO_>51DF?5qrj<(4)A5Lizt|3w=9nY2z7_F?HPFoCpfprc@_Ct0tC#BIv zgt+@SqUV6|V(p#`1mV@joXwSLMsn0?D}^1s(lv3(cbVAx)XLG237G8@*L~w-X}4XI z8cTE-p_1pcYh|{YfDPyJO$)U2WA*WZcfcFKP=hJ7&yne7A`xeXe#7!w%$Rlh$yjgz z#7Q;X^(ZjidR4gtIIdn7pQZ*=OK0Z#oRQ%NG=hr2u{|wDx@dmP=jys+*yze~_6rtM zI9BU#6d&W77zjNx=#`7&nHfy_-8T~vnKftHICq(gLU=+BQq+v_aqTjt)mIWP}crzt1kP8(0ojIS4XHIy8TwC@Dpz)E+zi{Y^(QuK2nYpPADHGG%>)W?eC7fbz5A0n00$Kvu)H3osOh$4VqoRS z@mUw_}7SL%~pJ~M~}rVt0sfmzy_u}3jI^8eDo1#6?2h|I{3$GmwKgB86uG8|Ww zq|jpRw%NT$;8Srz|{~5Ohc757>+GP%D~yjv#$EA*UP+;nFFb%&+@fy z&8w>W;(OKodi!$v#QnpG2u*+f>|~~cd=?g>mfbCk)Y+hsU|^UwZGyXv!W?^z9IN_F zJ(D2Om_+s2VW9FELFvT+RJG3O2s^_tcAi~W32kEx=I&l=8CX-bd>xVeo*QQBD3a%# zs4B2Et$`T#caoskXnRJKk_Mw`*JCitea0BEtl8R(>+6RTRQ?%}k=+MSWW_agfEm<8 zrEgq7+oc$pXQm?L(AMW+HPgWm&=CAp^Ov7a5L-3t^-9RPXS?Kew;}|E&O{j#LqDL3)GofZ#`$`tjtkdFj0igM8xis5l5$NMV2xN#mokR zcA@x3kd5zmr6NVGoIbvG&d3FqK(r2nslaqYfE;v-SVyP8o{Mva5a6C(`RcP7Q5k!G zyuW|{_2XM26cjq>cs?*XGoI%FqionS(>rtBm8)w{%D+N)#fC33;3VPzi#!;JZd<3g zXRlfu-mU{&yGB(>Iz46DKa^3^-RhOuqpH>JZ{g(@*UHmEHwfI~`(S{>F&GK3W+${m z)_}Y}9So(#8h$)ay#Mn*UayzH=j*RufBmJR$t6wZx;yRwFVbLMwcM`JEv7qnWkYQ5 zW157KuH~7hXUcI-@h#FnvRGzqCG;b zAi4*iX>3Agz51M<^Zx#2KJTSxI+C1V z+9WY^jA&FKr6Yk+r+4LwxLwTCld*K$pVjA7#K*JOm+$`m(?2`v2!)B@$M3)X_S?_z zQ5mr{BdkpIRxZrRs54Ew5Fj586?yt(CS0Fl-dRO=*LqDiZySUv;!LY2)+fWUYM*Ur zIX*!jb5yHHJkO3Gcs*P*M*&w-5?HkaoU?%$NC&mT%)@g$XM=&~!S_FW|Mrjn=;v!U z5qMj#Z@>Ng`+xnPSCv-ua25M$NpD}?4LoXfWj0RMYo=!(o4D^-?9G3q)I`j5k1AtY zWC~sN@_`pfKcllZGkfN>ii$HQjEgo=nV#ts8GSk{O=yS&rXyba`Nqu3?9uLiuSCT3 z+#Z)fB%i%mrJj`*gdB>t09v1zpl}EaWax8zk(`flf0~J98bEv3g zW4G_d;jNi3kKHqf$UdjN1Gfn6EKR19dFnYX`ni-j7h7S7bG+ssU?Tl{@C_GU5SjR7 zBmp2}ntkuFQ$yw`yTr$%xAA%y`#<(>Fj(+ZaHmtp-sm<{^!3UhGY>xFNMql_9*k$p z1)SMl20u1eOI&57=j=lSRw2TR%B=LcGN50zYb^p5m0%%Y9;|=t$T8?8DY3GmE@s6` zQAvADHy~&Y#d5_seWFlwOzL?BSGWfjjbHvGrbA8P$`5PpYMkAQ^mC&160|H}aY-&dU%}ZD4VS+(# zhsNgWNC@jKt#REL!6#WppZ6s(<|1JNR^}9e7I01*9yCYN2(510sfK{ijfn85p_?5e zvm&_t$jtcGUNso=7geLJSo@LSR)g~=?fE&8BL&FFGxhxCxe&1bY_Nu(pRv~oCE*&930Xa zMr0%-vv~G4K5=BYRbACN05?owgt>wF@m)j;)Z432kr`kQ#}_0}J@yh>qFz}bs?4}o z<$I>BDtxXn8aBwoot(m!x`UsdoM&|Tb%CAblgj_|T z+2IQ~)YK;&=SnddMzm*SFgapY0T2`sZ)>?vqy3@x*!oR+u1MQ7x^W|0vPXJ?Mdamu zK>%NMjd;$1b`K0gbyuR4YlZ9dd1!-&pJCrdiG_2(t$Q+W*}A- zC6~E^)~9bA-T$SyTL)&AKRteybO&Q7G4^a3l25lwbtFxGZE1FcdCf&^6c_cJdA-WqUkdfMuI3rZ$T1h?x-Yu>XySULET%|ThG11z64S@2C_WQOt(XZK>(5FANNe#Z`QsEoM}6`&U0pZKiiv13g`n!U`3pn8(Lx3TIaZa zugA@vL;;@*|kkOi4LFTyyaBm2n9ttvAw^CAp(wu$(t=DoY)uvrCTZ)MG zKq!lqVF44<3W{BXQ&DhlWY3&#^qGT*mV!m`*!^PEQKr!d5k?sj&fXwwhq+cmtI49! zH2XoL9>>S#n&{JRyVgmD*I*#j2yl0=w8I~e!;JCqJOLoXeH7<8whZ*?@?J)v@g}n~ zSoMy~sx@=Y?#Rf@GwR)bRYssz1oLPz*zPZ}3@Su&trsplNIK7H1)^RrA43T~=Y}-9 z_vzy@I7FP|6;;cdrhx1u&HG01Bjx=|n$r5o6ZWirX08xuKdVGjG_ z@Q3gI{`Td|oQdgv_WAlt#0+o-h`Ms=CteNL+&B>8bC<53Vc&-+h(J{djBw%Dla-2S z4I_IW3!rHh-Z|n>KrWq*-~oD`M}6w`<4^x&#NLmgNZ-DGL(m;KdK!P|Mu5x*Me-9#=RcVLp^m)Cl;2^U1 z^zMp0`tU9!*Xy;S!S&_4zyIT3JM+v_fz155;}y%3JrqNE z6$=`KM%M_sA*PlclQEje>T@ZFXNCgnV&f2bytkvw0`{ntRr_?GetUm&Lz*}Y9Nz(L zRv}vR@$D1OTy87{dhz%Dn{R)e*fWz^|ycRufLv-jHs+XfBpH-Uw?kRy+!3) zRLro08DD<*vd?p7s_^>qlJ;q-k9%zdRwcdp8}987|V1Z@c*^;!NZxjLNV9uq>Wy02Sda+Mhk zRAy!w<}#jm!#h+0V07DVdfBVtlgzCYX8c-JnZ~p(s28_a_fnz5aA&9iaO^8&JFV6r z6It$p4U&u@vR)ztAz&nE18KBy_-biU60(rtRQ4z<=CnLzTB48g9e?)t)@~23xy*BG zkrWy0_43lsMJTrn##R%=S|ynHhl}hPnJ(;kZ`DQqp=XY}(K$vDfQf7la-A67d;?>e^nhJ2beXBEAu3J6r8CYX5ATx7xb5^>E028KWx@mNh$D0DC5~ zBC4G|xJ9Z6UudUIr#2D`0-(OdRcc!fFb*nwZkv78@$EpFd}WD@RU?f&K4xTC(+FbD z^vE?*7IEl3PsoqOb;|>d_Q$~tZ=G-I6LQknw(N++48c&0)s-2l#Xw%0uz=}K)=^6X zsWJfDvkclrw<)*RtYld$n2al?FvA|Rpp!9>kd+y!Y0Uwc5pii9$E=2kTPuGT!V{pP zQr(ua%%tFrjttrI7XfO!(k8|vCizUeaU@*-$1OCp#~jxU?VKLaH}4mbA|hC?OUUO+}y0H8^C%JKaFlW1zRWn;07k;! z3P$g9P7gWH31FGR-luyc^mF_xa^`!EZxz9axvvRT{`FRiT;-Cp-rFNtMa=z$F|t_8 z#E7KplXzT6R0%M14KA484P*|Cd=hhQ2fnr}AKJNGCMHxsajC%KUL@H9C?|SAD`B#yQ zKKs~jl7P@7f^!b8B@2Bv?Bx?+cAN!d9|tCRMuuwuHD@}Iq3Cn-Xqef3rf2Wx0&?IT z;^hP-7*vCKJ=7SCky5o*M5Z--AkAD7zzN1ocb^E%b(GTWjUuuZ=2PHfMOB{xW4Gte zxK3tY+uF|Plm{~12*W-*5W(_n>(;F9Ip(3jHAE!592!kbPc3GY#Mf($ru)pCKnMf! z_zj-)xS?|-QG?~PUb z`1(uEjtE`XiKO<$iGiMJ%x5s2rWQDvIOLpjcDHQ8osX~c-QRxXdiCi!`{VbY1DUx@ zbRgq&L#$j?FZw#JB-m%nJQXIu*Ln*U$WY9vRz|V{`#B=N`|%&(B-kI{_SfH5CXQ}M z20*YfEga5KF1g}zpMC-Ixy$x}_Jo~A)*XxJB zfAonUasK?}-$7(7L7A@0@G3awxzSG`$u#}LwfwkuB~(xwhZylM%` z_3AUNM#NgLaV!JqK8W--n+idH|BwF>@!IDE1AG7epZ_=a^Y-?}RbW;w&8XdXj;CAQ zVrK?~(}Rdr*?q`3djp+O_6$ycqK&L?0!%xSJe%fPr8#TW$No^j`LtTEh^V)>iq|=} zdJh>A<{9)14!fVPPj~$AkAF5_rw^kl@ci~`fBp59!FoT6eI5_FLC2rDsR_Bp%ICuA z;}pLs559Ji)7{V67xyqH8A0=HZmjO@?F+LE{H!ck!U>VK93HEa-Q72TmyS@Z$n%_5 z8*1?O{ssU2N<8*=WV%@yEqwp|k6(WL`*b6!N~_}e^Y`C>`OgXx(csfFnCZso`8d6Y z!1L_xBjnp!dpF5db@n4kqj*Iy&>(pBtd&mn?z6o$&P)r4GshT&>7LVe@9wh!?Q>q0 zwbsh2%8&hxUTa_&5hQI0Zq4aF&&>2W1Tfg=A>zyX`|cjiT6K0u$bvo?RWA`)#axD{ zV6^w?wuL5L(-xnUUZY_q#P;g_!idLPyr-`d;1e2Qwg3h0erSh6AK#~ip?98!*aba& zj^VR_(a%vBH8evcDq=AagVB)AvY2=il?7?MZv<{o)_ls(1y>m%jR}YaubpV;r$jMb zpE2rgv@xiN${WLDu!! z&%B<4V`LEO-M&_@q%uA2TpI%gO^d0+E?np&7qBdN4YS z^ha%5cCPh$f5Fugw{k~b>wc;f@o6$|L5w&94OZ3}MP{&UC$>)fSDt9(Kn*I&iG7PW z;JCsJWS?6?9GQQ4p7U)9r@Kd#y6P3534{?UtNQ?`@^w&ToEBk_f|-_Mv<9TBvZ!VF zpD%D0=6qIMInPd2G%&EXs4QPn?J(y+I(KOCAnKUdjDVCZNyz!1>yfkGG~Qrk)QTv` zDxsWsf2~58kn-1-+dq55Yz!joqmR(&pxL5g)iOoo^ww1?yfmuHJo}Ka>y@~bH5SYd zj_d}~-KT5#iTZIr6uKKX>Ek(>AYeP~m}9J;f~0x9ORD@ByarADCGVI?xq$4Z}V7Q)38-9?)Q(p8Qq zUvwmeXz1gY_ct5yj=MYp=NyQA#`p#keFkg|K)2SzUhZoE(~2T5NinD%=abRbNof@c zm4PgbtabXqjWFr$;M(D3`Z5}bnAr{<@7^=Er@34uB&Gl0uoI7rxDcvLW};iyA|{9& zWQ0XP*?us_aWt>7!J|1CQI%epOO{g!g?-AV{)4#aH?yS&kdDULyjsn+Up^BF?1;`>w$@H75pIU^TNFWeCp)=uZGV6qowGtX62{)ZbFTcK!GY}& zVCLxo>9)|@q99d<+?s6=6s#aOqiky=oIV(E7!s$dkU=3FECnsXRR$di_V!$0+FNGG zF>sYH3|;ncvs7~|p_8z2(y3TPa3F(?&&=oqm>K0Xsu~g969HzKDtB{b#OH)BA8Zgk zo=wknR>41WGIF|gMlSSYZCEWz$vK z4szP&<-Vz8Me^)}5F`73b5+)keS^J*X!ygg2t^1}pJV6K`^<^F0MG8mH9`)JW^H?; z(ya}B4aKJCm|%yVsdAmi0gMN|ztm})y0R+j0*wG67j*M{KoAi<=xP71?)u%=c=CA8 zrz*2`;7|x7z}C^6(>mQ4%xvTChbqrT9k*4{@w zU_$3ilQJ1k7Ek5z0;BEgkCk@~MD01k2TOfZj{nO?}QOs~GU@|DZte;UzD+Au6eGgc+LNW&+`aVS;#zdFe4u^>GJXfG3U&T=yR1> zO;@g9gn_#=GusEjz4wNqDx;qBobI*aK?IC#f>D@hZbN|-!vt|yc_5RAY_4JuD z^YQg?efjZ6{{l4o>+fGNyWT1ol@nvPf~qnoHS8layLWoL>{+!e^z3I}D_;21*|NO_6is;_I{pbHV`vFo}@YWNbZ(@xD7Ar#5WC@*P zI%j0+G$L9fDs$B;WZnQ-@HD39IlKD=z(O(3v&E@gicIJ9QQe* z;}~Q{)a&h>kwY#$Vyt>Sr(dtv%0z_ipC|soW z?g;q$c>62Fl_^BVn)5&enu&-&L`6krMxB}Sv0G!I=iA4(x#i)6kP#WB>3XfV*LT6| zR~;Nm&-rj0`0M>OBZo*mOm?5%4~7^yr|Yl#+be-nk+>BG7k6@RX1qhZ$8|{!-p&82 z%$3BY>fU#%n{jH*r1#2e&mr7s6-G#(q4dGn_zbu=uFrv>Gq&>tf-e7qpzi4) zD=0f8?>)&T1J4@TErJQ2(;>no%_EoxV`4vp3+TeY|wN z@G2lsrg0!W2YApuvtPNKnWAid4rv_aiqGBN>6XHTQ^{HY0!Z6j_4z5_ife(OsH3_Z zCeK_)Qn`Qr8uqV}hwybO^yy%fmxPy8ac>VvMBwwkcw2Kor2nJ?U3I{AB{#?VcY8kT zRE~AvK24&Vo(eDX!s9v4ZG-Y3#+r!p*nXq67l5m~tFrfD)aMF=&)Fablfm0@$UyL! znX`q-s!Kx@#Xi%B`24(sw2>j01U}ikt^`s@gG3~6g-W=5UI8HTT(l1$%$e)*_~c-s zJEHnd@i*KjAO}aCk?>wp7(#7P}DLK{N@$ z24K6n(jT7#qm6?bzD%jRCs?-;OhcGd_nA_Vu7NX985l>{1Yvp)<6_k8#F3)1rz?|K zd(W^r4mZ_|tsIQBXys%eBg!K3%#03+%t~=IP8n&iT*jyN^4aC|_j?8VU+`Dv7f@7o zA54qNTK3Y$4V>OArVo^iVn(bo!@|6*2ugD`g>y8Rb95hP%R83nVA}NbL?9|%N~#D6 za7qHUuz_JI8@;y=Bfk%9Tyt@~(QlYJ{j{_y>a~0h7*q$f;NldY;URLLk9*SYnU*DR z|3P-op3Y3tXXsq+z_=vagzUM#SAl_KM!>KAjFNTadxSuu`oLpwGVU74iXe;_ps3SC zM(E=_gx2fj3+ioX*Ffxjys5GbH3E4 z)n=}F;{54=H!gCH(JIE+SfTiL{uJ zTP8BnJ2^5l%PWGc+|%cnPGgd(^VS&Q?eG7nFYkXoUo-M;;rIXZ@A>%13`PMsN1l8! zs9M9jsbz|R?#Y#w&8D$l>9ji|9CC7MZT9F|90l@Yf2dLA0<4|oY^j40qGuU8elLvP zB9HkeGouNL;+(C>AO86-RPKG=E0^-yumAqzm;e3tS|W3mY@H88C4ykQ-qv+c27&C; zHoD$TGfC-HZ;-}rJxFuZg9Za1-=56Haf#O4JX8f+9RJV+@|<0-S9n?ir;jjiU)~}j zBD?#{sY>T1dQXpBE$Sd4A~e#B4)*T9{qtX6{`TWDt=X<_`sIKB`o|ytey;#)CL>?3 zdN~V@J9VBU&e`_=dXw#Siq3w{In&)O^d(OEhxbB49mqZ>l2!ck*%^pR3D5Hpky2o; zqnvY{EBW?HP*lEFFq0uLqZn}nvtFj>&M(qk~kj?A+qxA zC1CeC`b->Xum5w?K7&EB7?;%HJ6Sh~ zsAyYU%-~o#>R=%$P=mAEHNWN~%ydS=)s{rkfUYV%!2KLf|>=kz{4DIDO$V=iJDQXHQ1jwCkEJJBKyRk@dN&Z81huS+?Iu=(G9B zOd-KYBhSgptLYJ9;37;hGkUsvT5-u@r}kMksPyf72oIR@Bq$z5PFl+m(^_3wa*V(V=yAO)=$I&FwA_ zrgfDfqsP4OWvk;BTr#sp*A(lYB*Ga`mnV&+{cPMMl~cMblAmOoj3i2i=>l2#oYU<% zuXLSR)^J%|pIYcW60PLfcNiH8j5mP;Fum1A2>~I_HSCDygB_;H{Y^N8q<)ShS0)*eoSB|M0)fGt&dkiP+X3RB*Q-vu z;v9Dq5{wG(ji$%#>yaA7Xd?t*RoaRTDQ%wb{aI7qZHleByD9dZ(YVY3nI4fL?AgB9 z1!JE>z-Ww!Ahf$}H{R1O#+z>M{rr+7q4}!;3K?aebycjg8N@r4FltB5Yl9o#$M06h z=h1Uc+YuZz=Mk9gbXbM)WYmeEsWh2|+hwOVUvvEJ^tFe5CNfC5C%$Jp`8a3PLPEkm z2mZ0(Do^tPkbkA7f&%6oQ5E_0V~d&Jdd3+Dwpu|#l#SgABBJ^XFo1ebQ0Lrcc)uA5 zoSC!R>`A9^&)$`oQAQNYb{B7DMxjQZy)v0O_e@}A*(w1lvJBFSV2F!JGzDgaLc^+3 z>#dgIZlt=;Vw^b+h7a_qb;c`eG~3)vQEGbu!iI0(z@Z3Mxi12mCj5bfxibjk76mD* zXgboZuy8s%@VN~0J=@yBi2*b8nehweK1nJwy$H)HAC|6-r zugJ={kPOqe56L+VkXJ5F1dp1?8AK92=bjrqK+hQ=GF>X}xIZh)ODaYdvz9BgJeApR zD4_=&L^sGJGIF{zYA_$qSydw-boQ7rQR{8J|2+tu{q5@?i<-Up%6P4}S8683V!diX ztf<|4j*{i%UHO(TXzm}PhoiG+zI^w6Go#hd{`mUaTU8q8duC4OwJVS2BquU}5cX&Y zCEfY$SBeIPvGs8LRr~n(c>VC>_uv2hJX65eU;o|b&-b+?q!~QW^r>59*_CS$m9f@q zWhC>ojHnmb)9-Jupp9vUNG32_yV0+|{SfPI=48e5?az*|cWY!!I zctxJ`*osgqXL|Zn#0ZKpE*5r0BWC*LrqtkIrcc`|CUB6<{c)t;=Sa5_K7jqL-(Ih^ z*c$Eb?yT&+|M+^|fB5nJ?fY&f^F{vppZ}?O*896E5$v-wNU5rD_wI`1?A?3poapCN zED~UNv?Hd^u8Pd!eMz2GX&xzs#A4u_!!aoRRyAgNHyLNzu(@2375cnd`0FD`!y$k8 z$3I!?p`AFqnvVcjtVGu$DGJ%*r5S19r^rc-uJbQzztaBa)EAn>QV%FvBYzaqAPGtg7weDqI zh>SD(^V`>-{>T4%eg8x6Rx5JFEC2ZUKfnI*U#pfFqsiCGik{=>n$r!Qw2XOdjHtKw zHyd9@SXF|u>b2gh78seF1_S3gS>f8->4RYk{c+~(s;a1pb@n6V$nNxJXzzy_%mk=D zx9@o7J%?kAFEPO7*FQai(*PSa#M2>Xf zD>i|QaA}ZvZA0*+G7$T4G{Ps&Rq9)tF%cAS8WJ4=a061(JLfh@6c~^*-RI2hvzlaO zh5rUd`7PxTmrHZPv^mlj_px7SCICT9qGBK*TI%V)qMGugF1zU&yjAy6>%Q&KlEQb` zz#ZlzG#tBEKiyJU17!c@-x(=Fydj-)EDC{h)1x!(0!Regqp4tI z#`bc8=~abBB>FTXyGha?os|ZGv9gNJyeL#r82_slZ3`0Gbt7W{hnMLyYC5@M({kJ= z#~)mb-s+BocgSz4*VOKiq7oA zXnCA;iHI^2qn?u){uP06aL&VkeB~jXZD2a(jh?$YCBZ5I!8!fzNo5 zOJl z-F>bb)L|jOVp$-IslP<8(Tx}K;wL;;J3o0&6EV)W0M}DFr_UbY+2{1Fy3cEn0Wq43 zt2y1iYgqdDOJ9qO%*BdiMCt?()G&f`9tn!M7kmQBs~Fl_9?Yy@y1pldThAOWn=>%9HAH40jPJ#GFLED7$Vf1q?h67Dy&$k{nBmv@NDU&gPzD9B zxFtmQwRS((4D-t>ipg=C&^VvSy}Qo=gQ3%hwCh`gqd6YUDC?mT&>X7{cG@R}ZaX3T z*^k1?>iEBsB{j%)1IwxiMul_n0H+b;={eK76%Fat@S{Bo9Qc_Y6Y@vY= z!Gub^M^-I6Y{HQcxe!!$WuDXBX9QTH^45bAU~V+1OwR76H@3(u84lPTw-oh`|6&xN zo)n68OUD^xuD5l+|DQ)8oW1EjEvX@#-5AX|bNBkm;7zZmHz>1KLKq>_hS&&P8P{T< z<|4^8efsDUfH2)|1Nn;^2*g@zpMB18Iak0z1p+lQeOe8$D|5Y8y^`Xn>r#4kjvR%( zx1@kDGgDdJ+g9TUR3GV1-@%otG2kTcSg+490Vgce+0M=0Jedk#+XtC#P1CwLiAa+X6=i zUR2JxhHjl?ATdNnA<}YW2A=MjGc(KaSm-9cJhftUz*~|#tyxvJdWhWTo`d$3^|Lki z^%#rvJ7{>+W{rw%?Br0OJyb57B^Yzb06e~u&iL|XLt@V)nDoUOU;t5Bim7@H03I;+ zIo4%@NsP#qr2&JddxAgw`1eP%W}c5f&iOXe;7rfy^R!dlI`iz)5$@8eAW#~KmCr?T zwiCV-ID3%a{qWQJ?rqSV=j-qPmG$z*%}&1yAOu%rMG4LbovK%eGgj)yvoWI?DTQXj zw;>?b>+QQA_XzB-zx@1s{Uaj=F+lgzPSuj9)u%1{8onyX-(GhgxCS}F=d_5owQM(E zYiSw>QT6)nhv5WXXFuP5|Lp}LI=S2!V1K)GweVay(}vIAOf6(4YSfF2(}!{EARKdk z_G2GGt+k(zb1XlZl&wDfJkR?NKh*o%o_@X7x8HvI`s*(hkr{Ujh>2jVH0p6xYVdhg z_H>5R=bCn7;nSiTh-7gPgNTSqKsSO7n22!P%om--?oNX4vKt)YyC47d{f|F-qwtFP z?ce|V`TEDPn^cI%s*olsrbXeLBkTJ&cru>C&TN2UBV8;V?iyxfcZ*!F*M9D1}FHOCo(CV=`$@UGo`lG$@LR&uXl}%R~G1C&E6x#zy8<%s`vNb|NLg2 z^y{^L`}e<}uiw7BCGl!yaWO86E8%f6sIuWb8g~Z*R~cF=S?TyT-c*XmwsUVT$qg_U6mpTe;SA8e20J z@p^xEM(*wH71VRidZSmU!2RM6*t1=&z4zbK1Jl*>4pFjQh(?5@Red8KtWa}{O zZc79h!$4HY2Su7U$-(V8hIDL4&N%1HnHzZlVuqOpF6Ip>Y@JEa^=%0;pjIG9*L*ee z3HY{sxTWdju}`^=LINXec^`mb1gqFOM%i77NF(sIUNfeYd*kZ97}MWmYPahMq+3j8 ze-J4qG}6R$M`pe9O4N}J(W~Yb4gN7LlI%Xb@ju{mGw%0oYx>!^iKJIB4O+Gngqcq0 zWZYU??_RE(+|gE$Ne3mozK$&0dR_Duh^)w!Xe2X$$U=IzsqP79A>@UNY=^P%j&Vt+ z81l#uL5Lomwz0-SQbaJb7}88s-7UIZ%idmw#T3k3FFz0guJtlDEk7rXhUwjko66#} z6?w>p%y#Z_GKw^pBr>5sr#~T3MS@*0Vw30B|&2XKJ~^mQ;Y0zBOTW#nZvzS951 zh^!29`>sCdz+I<966Ya%1eO*&aGx=giXI;R_FlPl9#13$KOjx0j<|cFao`8zX2&1 z)rVa8+6m6I!?!4uRUhN(&08~)4a}&yPM^4%ki-f$fQB4+GUB18&#KH^R(N}kCj$Q% zQoDFX9P7wJ8k+*3&+$Wc4}nPHoO2`*(ZcAc-Swt+Y|aX+`t^FRsw(&FLT&7yaW3I( z1F5RiXii5`M80nKH5A=rN1Fc;Qmq>|boP=Oq(e_&)XK@ovV%nQ)1Wg2vr}UICD5+<-%tB{FGPizX|E+n0@_pP*J2f(rCZX3;7O zqbe$w#YYLQLhPQ3<-kF!p?j4{gj^&`Fy1Z>!lzOn@|=BqPJN2la-W@tj)+w7*g+s> zMj~&dc@V*@^x^nf%i=g3$;-a|L?BK}g$hUhZ19wN+HB{v=wNGT(ip#R^2Z6CFgz*hHTAc`fpR1v)+RY^TN$qo^FLI+1*h!yUz?W`PoVajiUjh*+)*Y z`c2?mqWj@&s-t3+8P=El9qFT(u3H*S!1Z$^Gc%?6>@=sYuQn_LPkW6LU?oG-F_A^j z;U>zRK4z0;lpxvQjkH|}pyIF5RUjggPL}(H$!JUjUax{Rkul&1R--(42h*Vo&gBZR z(%F2S6T#_&83lz|>*cOT>mJFd@{LF!GYeKNp|m{Wcbean>uxtGlPR<^6lvF~!)W93 zaGjo>03yjyhIbxf&~)60o~fW;T@eHV|NUM@X4(=v?OzL=DavFp(KFo+`bUPwIq|sX zt{=`U2hS1MJ?HEs)TdTvdP6S(m6T@sNLQ6?8{Q-hr)Sj?h$zdg&X7`bomE4EXLe@Q z<;x5O2Zkx+)w?tD21^7v!Y4$nMP`rsv}u_=+WTWfs}Ye#d~$snaxlqrmyZ!8y=_`icQRkcrMN+#Xqvy=@4bvk=#624w_tLaO zoEcewNERzH&whmN=NLv{7j8xdHMaT+xokRgZ8R8hQ-jb^^O~lQjv}+_HG_RV0Fn8e z4MPP1j3Neu)2c}EQ_2KLw)JJN6A+DUw`{p-JSw6jOrKmKTUi6bL|vY5WJbQEp!8Z9 z5nQo?cV|LG#M^o)qPH!Is0y9F*Ij8miewVpyCp7L#-L0d8}k_?3wh@0p44mX%E%XB zJ0qYur!(V>Ch~7T{(TUU@qGRD`TftxXogTTjqXsu+o)JKbKQ#MnG+LosWBpBWo4S6 z95~Z_y}!Qya=H`z`r9un`pgkAZ134BV(&fV^YL-^ZVkvnoOTD^s<#E^IVV{?z|pE$ zwPxn|*iYm8pZ-a+#m}=peqFUn1$yBVWLgO&P?4Fr@(sXfKhLi9k_@FPL`XfOm(9|1 z<{&Fu*aBDm?WdpM19I+e5(|Brv3qt|+2?{B~U7sGFQR>m~Wo=@xQ*b|s_ zS!wM)4MuS#rGcTcQ*dt0^MyYIeSbXATb#9;4pKE9FMa{%_) z`}trH((a=ffD`Jm|CmBo#NOX3Bf0Kx!ROn=ZLw*+*4sXZ;YDDpF&W?g;~&cJ{y0y9 zuUcQf{{H8$|MjX8*qBwRNJ-2)^M)7hQIHa$(^(6)auj>cX}>DayS>p7?hAi0*q2n5>P!JwT0wcIe|o1_=O+o!{S z&+cv_1ng&zy3Iu9ao!~>5f!#}ONxuGl-F6;QW){y77H4`MdHCCb7V zd8y)V+Hoz{-mgcJaO`^=Y@LalOeS$xR`W@Rf#8PU)7@9_MsN&h5Nrt4V|T(gaq!Mg&~U(~QY>HfE_Yjyb568UD$J zIX1p#Q8DmrIR<}f|5t^RU z5jhtVgGi&q9nu86NAhNIx$hfU4nF;r9JX*paoj7p=gerIgH&cQ%ekHm(^Xo|Xt}Vq z3ghNBe-dFpB{V<_qi#<^rjiVh!Io%xr>ghCeTTWWnf}i897bG8H^M9kM)lc%S-r&w z4KgLPp>8v`p@~6Z&NJccD>>5)m`Bjv2sYI1uq*)G7lPMb0S8{aE8-~QuI6U+Irz*B z()~nMIj;jzZP~>!QTdwDBx_Zbso|Ju1bTG#PK2(3&{a)$Z0*_f8yB~TWUdp7epJlv z6rlF?uFu)BAaq;01RFhO8|rIXR9w&Z>O*Ek#@XB6RY?q0Wmegb<;lRGst;vL_s2b1 zqwS{aKtzmps&i#MTuv%yx)}G~(`|v+X35^IGgW1?WikOJRapd%Ixp-k-Ho8WtMX}$ zpi!T#xm$oU9g%$wKZ}b#-=#hy;8w0!RV%VwzA09!1=@x^vZ!rF8@clH9|iz+52^0K zXB(QmaR}^v1c5xeBQwZ=`wFzxXHJi01;CIgjn^Jt_S!laVE~MrSg8y^$aI@pt!&|Z z>~!Rb3I&OZb$xaj-J=bzX$>fr6_bcpzCKku+MYGUG+St8_M+};ue$( zyo9WwK-|7r3g`LoWS0@F+8zyo@x2ne9}6k!$s~iy>pu6e3#eT`Uxk^`RK1Rg2MLJV<#HfKrysSD76h$Ifk;6! zTZ2`v>#rtV|2T7!@Uzt2`}9OmvEEi>LZLlltE6uT3~Bahh$PW=xbVf;^Vs(&b+Yn3|o&upvlOe3y z$0ujcvDFdy@odecX@#RX-7^_{_Sev?x8iM}|Hv$45<=?^Lw!DP?$M_sQ?2fczXbJh z9vcSNdMS8MtO!^iw67yZr-S_R_O7T5eLVZ?FTdrhBFfwUR~1<;c};k~UgOqdWaXg% zo%4XVe(&4Io;my5pX=?r@BaSNFmvkLZ@-_jOQEP>B34t~-GPcsAP_yh*2@!i+NK0e zH!y1zBYYPaCuXDwe)so(APQ9P=a1ih%@deBF+B$j?}2&`2+PZcz+1KJO{JKF6`7$)4u9s=IrS?*E`J^wL5-EW^m8*<@=vruOD_l z_Mm=6ILsum2j?8@q zQbrDA&YWl8r|#`7+AAUSoL8-Vj^jePUdf=5yfdQ~Cb9r`!k&zXsMmTSBAh~qKt#u6 z5t`@Q2M0g>>wo0?``3??gNVqA-~RpY^X=Q0m&63$Jb-0nM0Qhc%}mnd+Z)JuCG(}z znbmU=mv?c;>{0i;-rrW42{UK!o(V){j$4n>e5j2?t1$pd62l$}9}qu-6GA zbQ74_L;(4E)puXsDeS%N^z>Ldn#`1E9T}yd6@S8KpoJgB47xK2c1A=$ZDyjpmFQ^15HQLC~>q8c%1}S)xP{-Q9Ku z2q8`zfU5@DhXh2$CA~qPwtu7*j(ejlI#s~i0MD=iD@?b<+=x5q-Mo}=##!CHkD~_w zCJm$&I=3QXx9uD^mgdMCqQ^E5db09_CbIRH>)2taZIL6u89e)O#>xXk z)_q6V@r1lN?M5@}%GH1(uT)Nlu)>$qX>sT#S1VY?W{pNRnNJu^B|{2e{~>VqP`qY` zR+{SCW9zXzmrc8D9#GHFHpnW@E$WVdmzaCIr_-aH$9kPJ0UGn?f9vT(dJ-g2-N!E& zG8jC2n+ph{f|UeHFxgfCNrY070ecj z$jqUeS!~mue8dhG!qCkA~rW zkz0pce5h+p)QJdMN)OH4y|}|NGsizFHSL7IK*Y>w&d~$p=hv{kn2{5SP6xGphfSi@ zQHWgaZ8}@$q+?FHt^(f}M%qu`t{g;?8lASR#$;C2j9-WA5=ln{yPJYeoUuy-Hefoi z2QbBC^f~%Ok3bHC*iAVGD+clGtx*~ieXGG{pX0iOn?o5@MMe&c8?a-*4FHi@)4(W5 z#Eg)UfFcv4yYtBM8sPq1@vUa4Gj^joQQs`$hFRyL1am@UMm!RCf35;dlPh~ z5Bp4CF~sI8*y@H%DPfG!(m;rAoiY*ZyyqZ zsarcQ=DNj|k{67v2|tE|mB}IFqH*Jj@RtBWX^_4z{Ro&Xmm<&6jl14GCm0mtIVabPLQmIg(fm$F?ZnEEkm9Rc z4oM2Q;NVdY1N3Y^6N4fZp-~_&OiIj*3+47~*2kJ1hLy?UxVvmeR}3h%UnPO6(i2L8&qRAaxf!%{L5hwc6YG~m5tNV=`$P>F;e$s!z}wym8qs0}_=$CNsGLOyV@s5L076ZeISrRO-v3bauxo4VOVL zhzM$WS|I!Mo)%+z{Lb{Nc%B2bw?wTOv7-7@VMLgZ9s;{jLG;NRrVxWEHU=#5F6x>l zxs1{Ht(ln!_JkpZy<5I8NE(+Ocxy7184(d>A}k^TIV~48Y_qa8(=pK5&u|!@%^P>E zM47k^5E*n>#fe)E7%)X^A_ks6b*i6U_R(D0 zP`kKZkxhb$B18>oOBe8ZfBW$t5?{k_fBbsB{qeS5TyG`rkFU@3vFhcc|492BROBmh z#dnHeOho{>T*&o_?Z)hLB=s30 zGFA*{nE57CX-22F-$fY1*CI3YoY&v}QLne2J(>Hr|K$9c<>V|Hq;U4r+MM3U%Ly`| zWTP`bH6dk2DhOfDW=sH8nGww)(ZrDZd}P*;$k@XGGUDsUx4quhKmK+6MI!pQpY`#_ zmsi>GyCn*JwlNE@Rec0<&X(l^#;AREnNWlgfc-pN1&(IUJ~SkIPX;rYB)SW7cxsML z?=57#K$3WN&wBgYKmXUB%0j(`e*gK8fB!!b1%&9aU{)?NR1vFky(Cqxo(Y9oAK#vl zURiD;ob&wunEKNt$&w^l6Jr)pHIIngtGe!73=QTP0KEV605siQm6?@GxSNUy;|Htd zoi6I4?p!?F&Ck(=h52J~W;z#V=A7D*oMG|_0RtlUp4-qnF0Pnqsf_6`m*t~wD8we{ zbTwi5H?)PQnlFF*2fuv#QO{WOIr5Kx|NQ>T|M$z=2A5*BLo|#XF=x6?HJR*?jwYo+yt*eM5DPs)uG}MJK1So$Y$2)eVQH$+^YQ$cu`<{n$6P=ZJ?>foh9~A74KP9#206J|0U@cRwC0SFROn zudaSRKW45gC-P_9%L)V_2mGvnb&!B|6gdN4Tc$Deh&)u#`s8A^-H9!D-BZOplhU2gb5G7fQQruHMdw5LJRx@{c*oGF8$AHJJS&wE6u76Q zutwvF;oeIa!UdmdX$6U8pJX8EY8&F5BB4|{WJXJ6^Rny9#L22c00kedhH|@94<>w) zv_N3qOE4&D@4Yg~3`h&<=Vq;o2b;NFc)lC!rpaD)1+H#?4zz;Q+AEzyyU&%i)S2lk z=RiQvr2{qfSM8LweZz+>FBz9}vmo*}E;2o>y^70nXa%_+)~iOimAz{b7keQl(+Ozg zx?edM11y5n+#d7+uA$QKCtM*yrI~Va$H(+BQ_Wc)kT-7QF?33z=2o@|u@KcQx?>O4 z%o#yl_8rACpwtCukz9|teKoSLV6Obz;(h2GIMAgeR4mXG7fi(J?vIZHYfq7A=Y(n| zfhZ`MkSGR1WUK_RNZPQSDap7;K=eE7ZitX09R~TrBjU(uXU{sZkeGtt?{`9Ri*JI^ z_4&$m62VBM#>$fc?qrgVAaWs$$bwYURUKw0sS+DZH`oyoiqSZqPiN*rq-@h;7;$g6rYtnl5O}elR>h zXvmiyhd?29HyFl|(OF$DrWXeo!4*l4>zM>bd%JPLLYTjk&vROAiRAORk3o>9sd2#+ znO1!P#g6J4_1+nyT+YQPz@veB@h+}$i`8Vyz>EUeYuT{iAc~+|aZx+|E};lxwH+>k z1JMBX+qMZ2MDQ*yB&Mcpu^n-*HCB>Pw)>5H-Xg+%XVYX#5M$8O&&-S)tYLMR zx~k4xh>v?!#ug}sZ2tNSg$FPAso*p-b{H3rh?RS95N&JRFKt!QWN>b_OQHfeJ#JL-zPB<& zjM(Y{T@ud>6D+&>RJYpl<#b1=qnCF>z*z|(NUThP8a0~YKwNpn(3QI7lIErf#8BPd zs|k(eUH@4EPE~kTl<8wu$SbaRmG@6;M*hR;m?dEbqDuc0(admEBLxo3FL^6ml?(L znmd*Y8C#AkTJ>nET$QjKF6fbPY%$324tk!)6|P+eWHkepQIfpnk0gQ+5gGk#-}1W8 z^gK`XOfHBlKj;<>rF~nu5|mr_m5hY>xs-RK@yd*0?d3c{h4R3SdUF6 z2Ej16I@gZmV=b4+iajjVr=@Uv)2MRQwR9;{SRai^XH$xbU!V~ z2I&l)?)3ij89VnQMs98&kqi=RP_k42;%wCBc5v^41x=h(&O#zw$%ZTz1QB;$j94HfBQQD zbUz;X{_}tT{`+saA3gU!i)b}6l$qfi?zH-xCldtr%2;XVjQwjSe?&wCyA=^D7Y6Vn z4G7UwexPk*+sP2u%7s~&kB^gYZ~yU+{{dk78Qge2fBWs%z4Bqd&Wt;DPo3$aq&hW2 zs%GBygBZc!{2TdjWF&Lt%C2_*n8=9q#M_6`ZtcCG4)Q#oBRuvaas_kL)djWj=kzx}{q613mp+HgMEv{rUw-@fpX37oF&rc=MaUZa+v8I*9&Za?qPo+( zgKivj59qa&J2w%1!@110hgyE5Oor=LV8`+pG%}>oy}yENUpW?UN#|P2B@7wy>G4@T z%hU)r9>`6X8H@w zc|hYn!eqosG^eLMiUT23)nh#}S0*wYccP|zgY81>U`8EP_c@j_GIOuU+!@I(!zi=d zKyt0RW01qj$mHoN6{;0N=IQFL+!r6L9!)s$K_Vla#gT6nGvK^ef1Km4m1LFX^u(uc zfBM@`iVN*AK10txJ@R4;eMf448R4Z;xQIb$&05K}$A7Hx*kQXPDO`6w;xtt9^|!ll zuR!F5b6!QsX{HrinFF@na0JDINUhxV6F4hs-|#t2PC9GkzXkQ&a!|awbSnx%nMYllto@kQ@S2(1KP=-Ur<{XX}KWAcc?XFJx+@ldmoT-Z= zfLhA%om3{wC2rX-r8JBOA;~4C-Tl}r+{Xl67aJ}|GjUf|3a>C5C>LF^MNOC5 R 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 QO}<1oBRIehaqm@k6(W2FJG@K7$IuJwf22g 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 z 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�*fxbF-m`QoduTP(sM|IWr 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 z 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

1dlavleUM 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 z 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�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

b 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 %lHjfN_rAmEXrFwlsiLZfAaRJT_3xvT9i zt4q7oZf!BNB7`VHvvr>VR!&+vse#VJFDEy=VUgMTV+XosTQhjlxxtrv#N0^uZcuN z2&&e_=O;Sb0UFMHd;7|-{VPB4=O4@BL21=Jdj-4VUWU`mFLl^+wua$K2g5yASfPKy zSAOEvyB~c1`+tbO)cuqM&foAq|Me8GkLA%;rR?rW21GY_rGOE%K^_5YqO{f$@bCTZ ze_!?Z?w5V)&G}kR*j_-f2ijCsQhFHaVP18r%dQhleGso6e(P`fZ3Wz3-p*=|80Vxk zJ4TsJVD13t{fwXbO=kY#5C8XTdFOWU&EpfX|Dj*;_Y?qe_vpoIW;K(i zOPaxjM#IPNHY3~aA;wkmKmAjG0&XvE4`w8W%unh{Lm0 zAk=%iMfd@af>l@L+sWYB_Y3vYb#4A8)K#^!? z6Wmp#>dF_88OJ{0Kv=|aqnnx#IybVWEH(?L^(0NxujMS*;zi*m=jVJT8QZnyqOs*L zf^Cfyo6o8ijdha%I4R2ZU;nx9|GR&|-}b>z{MN7d8Nc{@{?PCJoxkrt>a?(wGRkL& zenoN6XNzi}!7owj%qXYjrjQiTTUbuJ!SKKNjsN7g{lZ`MBj5Yy5o_dVS>^IwH4o>` zeW@q>nlWBYzQcg?e$E2RAcW<3QbrYWS)yB#Y5Q2Tx{Ma?>*1APtp>-Il5bys_;`Oj zj;KLpk8pZM-RASfUw9+HWj^}{=_UOc>WmmaH1G~!qU z@cPZ0k3RZ{U5E2wVy5FLl>uQgv_p9jYCFX7tH^!60?iEpi2o?4lW~yY}78 z++!pvm3{4QTd|@p;&oq3AhC_4$1>VAZgh8N7~RZ7s&!_Lh4tKf47*TchS^z!RTUtp z*E(d*VV8^Nu0ri|62T;NR!Zd;xTA~=KWH(L5$FAMvrcuZ$1$FzR#;TG(Ant`9`146 zs{(Y7u5vSmi-Mu{{q^fNz0Vh~-hJo&Pd>bO_k_K@=VgmK)17g=LOeX4_s@R*Gw17% zoc$tv`6}8*cXq&E-PW)e)I&L?2TPsTirkPK}NBFF^yQgOwJ%&ZJ8m-KnGDq`q zO(`h~y8Z~7apGS_Z8`s8td<~E)5cB@*QjxL=~@kUKS#l+By}aF;q91N3l34|BEw zo@_Td(Y>91Ot?~>b|Gtq9m97F83Fb9hl;_lv(hZ66l@C_0>tGeSeq|!d5Y)#1mW;y z76*xW zF^rfwj^!QhlC|x(k3jm1QRFr1qylHTTV}%C97Azdqs>y8-y4f8>wjc>ig)z;Fj) z?$vpvmAQ3gcRg=JX<_0T7_plJ;tY{{R3HG_%*RDX8=-~F(5+K)v>UN_W&x<)sPl!p z6sYIGVXfkl97NV|rb03fQU$%11>I=l@2l3Cg-*FuH|R~PDpbpQuD;n;Z&gZJwFPj& zE9q);W3gMB0+IAfhvHr;JG^$* zDYQHQ^q7Z?(lrO7rahJnxIlQrbs2xm)yr`M6QaScoz<$mpH=OGhypURlzRh(-QcE; zKFOrqd+$I_NV)~lnnWt6DPgu~4jnCKRttHa_xoGIW7UgSFOPWnUBCBxUVYh5_$7bm zFMc{c_^O}&?JG9VH?g1AX7)b93$2I=omA$T3AzV%r)XE4bf!=KcT3%j=H}-KmT#V z-LNxvO?0XG8dqh*sxDmA{Npo5?#g!`9-bbH%y0Q=KmYB=f9dA$x+QP7ryu^Sg8k$l z|8-6T&RZ!_b7{-fyCmCoJs=2{22uO|z9~^Bx$E-ivw@W_< zjI9ums&df$#+DblfwfDjx}-p=Au;E9-m7;OkC(j;U0s-r*ymjWsBV>G14MOhf*Sng zq)^Tr>XK5K*(Fz*vQn+SNYT1rmUi9vBTLb_ zS=>U1hZjda3+)XZ7HU{H%|<{0IOXa#^>S-#UyHQ7?}%VS)l~_48#(ciZq;PmczYQy z-#K2qV1tlbac8}G^Yqb&E*wYXZnNj)1?ieaUnRDhfCH0S_$<4kE+xLqg-NQwMauGd zr?Oge=H%|#{myml#+o>D2}G&djU?PeR#ld&u(Jy4DyM7kWZ5=@?4eSj=`hLFtV}(f z)$!uJhxb42>pk_IyKJyU7Ws7M7e2?Q*SDY@tLeL{a=S>;JhG){3qnxm-Xs4s$l)U* zvl75+wILoJ3f)~YJK`AeQcJfu0EMrK0?*Fs0%!m3q_1_jj9`sv&gec&%y18<56Lbo zyK=TRghfP)Edo6E-dUA0k7<@5o%vKP`gF}5VG$m&4*E1VO?LHxh7w&*w*381t@l4I z_ss2eI`1&9+k=JI$FKLtpFLlH&g*_0FTmwo-5D)6b2FJ$6Etgtxw(n845IB(lw8;r zpP8e;s&w~(giM8#dA;V{9quC?Y32BShJZgFmChtdnvEzYOwc-xnzX~3v_fQ7^`7l% zcSiUTA!M`N9hCsbq`KB&VS8_gW}Z?jHFFA(WEj=*75B`87gNdP*;Tb^?#9fM>dJ~0 z9yS9HpV=(9E5S+aQ#IB)*sQa=(v66K(aiwUPUh}9TfukUeesoFbG-j48P0rioH1@C zvv_y`GdzCu`mg`x{o&_cz>ec+4H$5b<%k9tpQ?5}xzl2v!>$vt9&{yUfW%oFB7w~F z(&_Am#mw&a&IrGDk)r^WET`2FO~lNC&^ZHmuqZl5 zMna%k?bdYx2}lb!*kFQqDZ~ue&+{)KQ%-ZTW!6_9z%^^5(Y#3%vT*5TjZ@LupqezU zT_X`5BcEtV^ZCoV3$&*^fi4M`wgLjxIqIV9mh)MMVqp%WEpLn=4yn$ptEIyzr_IRR z%`lJAW(?)~;&YpO)~=G7442Wcr4_Couog!&>F%R-k@|37g!1Hyr>8q>SD_IAs?Kxo z@MZ4ox&;61Ff%%dtt5H&zO6$Njp2uSw1tW|fHHIBFxqL2{q_lPJ02V&irwaGpA8GD zBH9U?1W20GR>4p#taVgpqcXGZdS;wk_TIVKVmPI&E)mjGZdQdMdmpq2W}o{!Mc9fl zm!UhWxm;$MI3mC&Ra4#V)rJD912jbUH4d2<8^%<71T~IsT*is+%b=)sHedoy?XY8b zp54A~3sN{E98|nG;`TroRQJbyKdUpr?#g4`vO3Qa#h&J~&90G+X;Nl4fe{d9^-#N{ z8qrc`F|2g;AuVOqT+CzpA0lw~v$Uq0lb=YC!y`u3?k+fuKA3}shSeYvA1Fw64AkBa`%l8C%w+MWGFDr>&`W`l!ThMjJMLmyI3c8KaX^!TRWD zyn0-n=>Vz#uB=wq$XlK6%gnrLNb`7>V$RXmG%so2_e_D5DJcbq)!vdCx^|52nR{$+ z-P)*HO(<}quMpsC?|$i7Fx59nL6sxZB-#kY z4E(w$V*-~TW+?d8W!3Ysl14H|EEDGQ0ns?Ck$J$R5*nl%*NQp&-DpJbV$ct#)HQpE zX;lEVkM^?4=qQcY9z)C<(-3EK4-e|X?+8G3@yc3*InA!z2tY>TdIovHt8<Ck%Pf+^3wJJYP2!TqFR*$&MP&BppiJMX;v ziQB`+g7Y@xibC<$ven`O#PZ^l$&Fulbh8k3J?WyUiXDXoGs&g1e1`k+2BA z9f2kp>b_)OX4UE{pm7<`g~8cMW^-NELyJ#SNIbG-CF;!2xo~!Yz{=r`f@cvY1)zc6ErB8qDH=4Dw42$Y~-hhph zV1yfEXf~Q|s|;AngQW_O-uhF2>W{zwwSV(RZ$567%Z#kvr7i*-X$#HSDvveGMqw$n zoFRL7_gw(r^9TPhfEs?Asf!vMfdSn#9|5~Yzd6T*8BmU->{tKe|0tf`=Dv3^_4M@7 zkNm8k`-@Y(^E5jehc_kTewhEb=KqE)rfDUmV=Qt2}DjD_%8i(W^z zdgcLROSlf2xrjjLo^Zt+18_!AhO=f4CY$4j&In8h%n?4PTXhN;0gAyhyIQyKR$Fk$&8oDPpxq@| z8`iNNj$?xZJuuV#%*VHHveLppstBXnWxyb@=S!}ZY;4uDGS&croWoaxRHo|Fl(T$l z6U?t&JFfV!p=5+dXF&yV@5ZD9H!8)UEAsh1vq>Ab+gfvBTaX-~OBuOqA}@!yMspVJ zZBdMuFW-51@c`P+G%mS?$yAT8zj%N9dZQJdtwC1#;pU!IVt3ucT`Xz3(h-@NTL>(* z+cK!w=C;-$)jppt30U_1{-hEl8mp?3oDifIMK@nz0QZ?{b;BZB>gvks?(F?Mmr!Tl zj@!E3NSnKfgt{_^0M~J>a6gV<%*jYW9v*(Xa-wTfO~tv-T~(71vNt=8dTP6$c=__( z4?gk97b|k#t0#2BDY~KZ{?SKYc>D3kD3}L4st0#ruI2>SlEyHBSrc*5$8p#tHggC@6Pp&@HPt!VYFBum6&5pt(5|d9 zH}}cgHM7;v^UOSJw7=t;$xKyC^5CRT9P3cEv0bE7wKd`q(TKeC#KrmVbY4*a6DDn0 z<4Muzf7eVM9lV?o>QWY~g{l+T+Qn`fQaYRThxb1D!6)B+-xJzTt%AI@JP!A` zMLfR!@WU^B=FOYezE;FyuzF~03||4GyI>YX$zduOx>}u8s8qS}%sngTi3$~T#5(g_ z5wRB0x3EZ+pyF|Xr`;w!j*)G9;cICgZIKHe%O-~f3=e%$ez7~APWun za^QM(c{^v`;FF)#5{+zrY105f&`R%@sU7nQb!G8X}N^GU9P+9v2{2+YyUFxpg8u>9x{UQwYq((Ias~%Q&$ci%b^Ok7Z za%Vcm#sG)QBMuLX6@Uk=cXuf)GB?=kwg6F7)?o|aL=4h{zG#pQ*|RW2vZf!d)c6|D z65s-JODK4fNwXQ_&LE;kWlf-IZF9Z2kMxucgJka6^jLtM_eV<0;@oHTHN3t*JvFs_ z4az-tq1((nf>_7H!Ue1?sLfXHR8Q0Dnm1>Jco#@!uv&7Mpm0ZGmOr%{Xx9Z<>iJwp z3_96alV3{*#4tLqEKgpo>lFYI4rt)AxWw>*YKRup0MrAeHrfopoTOcDGnRVBc@dsF)7I5mrTc;S0&ph zgpbaekZ2c`p{`XZS!M23CCWWKmbyjxik@lIgdj+e=A;e_`f3d5Or)uG&pTf%J^s-D z|LVW}epbKu^!tzZyJaW` z1AVcZ+405uH^?I%E8fHYWNP9a|l+MR1X^n$YnR++C^~O#@&EDyL-p>G*|ZgYhi9p zZ;gF6r%`X!_yBdm-%woyJc6|99H4SlPS5IQ4RqC9;FFSxLBf#^v~$G1W8I=rhH!JE znYTKh8K^3(7+Q~o`{fNC8C^}`IDR&pl_`m}+|0VuXyFTn?&+3nc?=Z@GY2KY7A^zG z#YZ!;RRBxkJVG;om&rIp)RNV%^E}_=zVGw#{?Xh0`tj*}y5HZNkFW1<-#)&1yuW?C ze|+kEdV2HrzMq~RAD`a5e!JhkdHVS2<2R4@r>FDvn>SDA<5S+x^YQ82_w#5 zk9hdhAOD^|49LW;9!CTuG!1aUr(m3meWtM^6Oc(lie5DQs_*zkz@7PYTaNwNU-xVN zVK+XWPt$+82KX~Dl$kA$Xhu+>%K*sEIv?+k^!2?z@E39a@ZGQYijvD#aT5xLA8s5K zt;QiivTJnBjVy$+bqZ!Ktl#`wzYD?R`>TH` zh0lNfvy6itsE>ci-~V@c+rFQm6Wgx9;Mrh2yXJ_onpGwzQ`bQC{Va!m^vCY5{lQm# zeLkH;N-!Jmu}P*@R|TKdMBNX!gYb!WAC7)@8sN8w+lv?Q=<3?{{qzRvZaHld7$(h7 z0G_GWCiKWHXL(BU!d{PBX?~SCEilb+7bv;WEas484M8M`@&6cc_WT?mRFd>1!t2cPEuRN>-KJ)8eeE}Vi{bd> zH~)`bzd6snLs?HxU;Wd5-VgoN@BKggbN>P$TdwY+tGZh1Sw1H%A5{foTNxUBj>=42!gAQGk=I8JnePKj6UkXd(U-etBk z-Gk*3|6K4tH`2jQ%$E}5$pVIkf>{P4}^KVy6QVKfMcFpxkVF8RlcSjdeh% z+U9g#8pEs;klEz>jG9bUa4`2h)=}znZ?NWZ%G#xxNsG|S;Jq8iLE~c+xVm8OZudp=@E{D!g;IB{8_my30_K4R#i|Nh zv%v^=*+oW}92vWozcRP6NzYC;cV)GNpc{10isj0pLL-x7&=H4a>*?(&J09MD@7+&+ z87FsAtt#a>EhwPQ`$wPqk@Mq^dFI366fx0QxX8h0b^Q%MPhL%GK!VC{OnB=B`IxQ%PBg75-2>eOefZ>>HmU6zQgY_NX(Op2 zeXyRm*1;elbMG!TAvk?ZTLj0Ap^G>L8(fHR`EteGeF<=vLsgyT?v6sUWbP>$Ff)v0 z(dwBAWsg{vrWV?0oigKKkudLEVEEbc3dD18OvxN0q8f>uk%i%Pt%1?bK?m<1G7a5> zt+UhJKxN7da<@izN@f_`bpzFa`!(+Es`1BF4k2|?u>hm5sGM^!3FB};9Zq@(gp{i`+kDi1CO&3f-$;8mjrVbxFXn9-DY%KD!|$e?&c7i zm8G#=IlIrcin(jYDLJ+}cDCHy!bgY@;n$5z^}bYLly_~|pu}B zOeX5z1_td(U8*f^qJxyiDo_vrt20x5Ny%WQ>LnmI$~i44O2xon5|? z%h;o94~pCK8=plp7ol zRicfKwjo}$O`FdayW2-IGhNDck6aNP7o2{={)=WP81fn6zWL(O!LH!A6 zxdUz0jqF%~Zug~@N93+C^ImBkgtm-wnqb}AdN6n81BGdNxF8gK#U#Sb8`hKZpt9wp zNvtf=1c~Yv8Vpo#(6VYe5{3^fQkG=IXkfA-bc&9+Izge(Xmgt=^lM*aQ&#KJo5%@8 zEPt?XX#kv1EK66NSp{>23?2af)qm}~V9VeG1Pg*n$#jZq^wzp0Aw9Dx2Z3;+5XQX6 z_V>T$r~irn_N>dHy^Hc8wM;+tEy0yF@z;P@(b@FYU{}=5PMdFaGeC zf9h|^kDq{tU;8V61*tT+*Id zWEL}`$0+m2iH7TI_v{$S{bYmU`SP7~4HNnb4aHoeC5EZ6+|%rvzV+ulz5d+S{?uRe zh5MTqrLBDMxbsPh_rCGl{@MTC|MFM-eZTCd{FI+KDbb+C4A40ufa;tTHk&e7531kU zxV%mVlbKDnaIv@lgTLh4|NUS6YyMyV_ILk;zxD5Hyy<;z>&5YOz?>J9xu-R83@(8V zm5hwI@9m^bGeeV#usCkMZWT5w9rIOPw)^pXQrB|l3QF=q$_0kOtf>H5;(At6@yZA= zGzTk&s|10bkH4Av&PQRyq|h~n`)TI7$%L*pUR~)05Yyfr~HZu&1HG=apxW`EPv-XtSc8lKa&8jN$h;?Rq zSe~2a$|k@Sqb<2aLoL9EuKC|77n**r`+{3U z_udLOoOO=+-pAH6gtgiYS(p!|l0yWhMyxhL%!Q|Olc4dvPkqvEUb5`1vQhyCi)D70 zckZV*Zy#U3S=4d66}nOr$>iYz&pas$y2up+_#0-t06AjCnp3HT@DSbDd)wijJ7K<@ z-N>$G);X65OH&kgSJCYHOlevZ!CT1gFs4a;5d~!MUZT_!4;4+hTZ^$^jjq0;r^d}U zt9c4nx~Eiwa6q9oU~jP{!pu3NboZK!M+19ECs_!;gfgh-3kkAW??iWw0)9de1|08V z_h=nA!f~NYV#r^pqgBiN$MzgNI7?zTmHw)KH z1|GIA9OgJ|FJ%)OJp~Z@!hZ@5B&lwvkB-2MRTHF;XqYdK9}M0Tg=wW!7v1Hs&NjEv z$Bl#c>Y8jOd9%CdrsC?0yL7eA=Xp1GTBxrmAxs3omlzWy)Ded|B~_JsjO30DI+#`} zBMB>zj;hnlO+LAa?z3xT3#A;zS>r;8u+cLnhNpD17>!s@^VwU1te)P!y**d}Z>uc~ zbg3oz@;XZf^VoHdh@QC(vHYmrFoe9BlfApb_jwv@&JLPECy!N|)n!1<87GBtXCDC~ z?wJ78GZCZfAclV6?3><2vB%^lkBaX_=0RYIJ9-j_h`%E|M)i=MLsW-JDpFK!P{Pj7Cz-C`xw-CfOF_~BZc4ahq;shit$si(EICZ&70sHm0#W)bV`?kwKS z!_QM3frX8uoM$0g#Uw|Uo=zTd-1pslp?0fxk5SbxT^n&e-Q(ev1BJ0}R=6z>7%$}k zS%3-4dD_(DM2{VG-ZzZX!vM8Y-CYGZSkkZ&{9>s#0VN6va)IzAO){?3HIF?n_a#P= z=w?+LFmrWIE#kW~NF%Rkvmt4XMIXsD3rdHHoo(9v*M z&y1}lAA5s=NdXFY8xAg^zx&_(t+;*aUiU=Z7;x9lmK@xD?FJ^rRMc!LH+_WaD%sU} z)i}IBBN~nTQiF{i=>XL| z;gt84ZA@Bsxrab^(^;1#t<@tF7tPq!bb}4j%XZ!e$47zJAekl;8WslIbr0ipxqyx0 z6y392YYwUMMnb&U%?_BX%}t;+4cL=vHx>G|)}iq5_SNN zGw38Ggw1tx4MW7Cq_jt%TTpc$$I2`lPS9oMfx+n5J852O9|d^CR-gNBV9}0dXVr*tB|>f!5u=BGaK-tu^J zKHcAb2pG++&0YfNu7LFtWTq}S{j$29VIh@_s%+8MLYGfG^%^MfC@7ib2 zE~!ATjp*}f`OCliJAT=J@Lj+C^$*csy#MOeJKYt_IsjQC7g>0o>DM*D9zl8=y=1^s z?-ws$?bN^VUEk&Jd>W6Bi?)>{jK;XBQff9P)Uiqzt-8u+XP*u$z-W(eKJ*VhT|e?) z{MUcsFaETj{7uM>SVkkW=?z?AxX@(LY4QrMHN2C2e7e7U@#63QWq;Rq{;U52;%9#T zb3erO;!~gggmAx+U@D777TRaaIAz|Y-z0!8M$oe5D6=I4e(%5c`#Rovn`d_h!Y-wx z0;Jj5W#-n+DIuwmWwoJGz82R)9Gu4fen0nl1l87Mh&op6y=m56Fq)utlb32N-wGcE zDy5zb_Ia^zO-yHwMX}iz^f%F}VFwdl-2t6dY&(`CjuOtZ+z?%=T|;(s&i*_hNx_hN zR6%&!1sS?%Gkxo!r$g7^n`2FY@FmhY8Y6TW%N^QVZ8DFnTI)dfFaD*!?g#(EpZV%< z{&^qWA8)zK<7NS0%T#^7|Nf`WPk!^y_|~6t)}xtcmt&IkOfa`r23VJ?Owc5_5?uoM zjJp9F@Ub9A_YU~)|F?e2kNcy4>IeSppZxJZ>*svovmdXutj~%AQPquZ!N)H@!~Lvw zFE-8C$V&nW64+THA0A%XT1ud1)RcX8-JgVXxZK^m>WWPrH{7U2XIf@K_0d70s z7RQ2Y9g8gLp4*QXFJ8Xv%b%WOf?v1Qd++;wKfV!rVfF0cg{$7f49B&r)bd5+>e}Wu zSNuAnv(C)$z_Yqfn7{#&em>m=taZ^ds;dcWGpJOdAk?K;RQs73^8rNc%w_AMF_J3L zR8<~fhJwr^b875P$#JC(L_|%NQWFk!D=E95dqqgtc}gbQ&NJMlI?s|OXGt{c?&CPR8`FwV5fN);=CUO#>nT0k z%naTvo7+(1ynL1-7)gupQuQp_HAY^!t1CPD;f<`fTz%yg&R z&5>Q&xo)@4!X=J#DZ|K%Z*9@oBC}-^%F<|?74N_*8Sd4ZxrR{PCdh+hMK{NgbcT;@ zHlkx|CEF3kqR~oChw-8mz?`av#uk=iYA~A}Ku=i?@zNNLWBD5FNKM*Aw0D)+{JkLQ zD@2%#(-K=5kV=whdANaHJtk-MK=1@|MvLgnSU!-d>lZ|u6S6{a27N5bY$k$>Ia!T) zy(9o^Jf9>=7S}jU!|KuVJ`%NTm>Qy>&Iwozk6pV}+_Gojw6CLTo4d`1$e3ug!r7w5 zM9wxax0H1!Wi}`L75;o-c`lo%!HuaIIE`F41vwX}t|C;KWBkCiMXISuPN^L`7<8Vf6lvY8(vtnwiq&J(R+mJ2qTEL4G(bS;bAXBih- zr4WEt# zTOAA@p?W&p2}JQUqLXfUZ!@(z%y7Dvl%V&{mIZ?#A)Nbk^CksWl|=xiypYUBnA`9Z znq?DD-Prl$=GCc2_)%AoN=YW*=3e%4pZmB)3uL)j-udR~&FFW#RFkDkn>v~#*nqVr zutjt~D^1o$N)|?t&H0T)&&+XYn)y{ei|UfGRRp?vxnB;T?g?JLCbOki0&fOixv!J)%^N0SRvG*g6_qggrsVkLh8x9o6RN0l@I5bcrhDwL7iqsS=*R@J*e((4=WMm7-O#sk0z3a%%VjN zO}xM$dVY)<7tZ*O79+YZ0}MTR7F8Yd4A@fVybq-W;2!2)JLidY3$aIz?<07Uxni7#+d?siVPuVywm^up`)=`9_kYYd5(eXKpgfC)?(hyHB4s;7VKf$kEPuRYNu=&qWLUHHv|mAlas@LL)d1r3}UpsJkq><5vu zW=Pa3QoHx^MK_jUB2+=p#2E30xoO7FxK?*=)6@`mjl+GTS%lf_U9QNqR<}G% zU1|pe$ifW9p7cqBMb?I?a=&{#;P&a?{IC9&f8;y<9un$QPY9Z04573(u-Ogxm0H>$ zr4<%5C5i>&ANdFV-v8jY{Ok8G{MBFntA33IAKyMLM&C~^0uGdMJoMt=Hd};|$Z8tx zA`J11AHBirAN$~&f5Ex$n6%H<1jS~jU!FhXD5=A;s;lD`*27Rmrk2OUCtiJ?>$m>4 z-}$fn^ZyJi9IW~h{l_TlZkbK_%DzIhNuhmWeP#L$zy6>2&hPxcAIHKMf8ghQ`!6|o z-0yGAkq+w^kFZ_oVm-#vXSafmfZLC{P!L-CO) zj#rvQ3)UQr`fwUhEg#1hXTcj&O{LoHK)5a$p`7e}hOZMeRnvwl*`U;6k+sbv2ffL* zBPRa~EpwY%7_$A8C?sLy};pZ(51`uo4@6F>PE?)~V? z;vw$6aYh2pm(bhSAO6^vf74I>tN)+R|1ID4i~gHG_J@z4vS$3K-c+Btwnw^>`7th1sxL862JG{S8u-WL8yS-YrNICkk`5It9Y7Io=dDvYDDp zaWhl!W^?|x5ipNiV#*#&;XcE*@Tki9jm?nV5Lc|WGV`6A-5_pj0oYk?OB1SWszTT# z!)&R|h%Fnv4ph+D>cYc2@2=a!CeXbBh#qwGe*5_N=C%1+VO31DF=iL!D=J$im$lpB zUbVZ>mb2I!Gu+NP+=wvh-1|6Ii%^Y7zq=VUSPITo87;<2(ly_FRV%Kb+l+9|z~0d( z5^cKV>GM|1KQhFh)QPE`Xu-iGw?znLW1Y$UEM}Rl6soG#EYfvuT|qBJkoU9H9k*An z-g~E7NmFeztIjZ*35@&4ub?O{LNdsoDm z-6sk_V@~g`+d9;p!$F6fR@z3(Y%{y!!c~yb!_{1N?TTuGF-)!S@vv*E2GJ%@^>%wG z6`ORnlsj*?2SElO0kU#e>-O*kJNuoNFW-6pJ+@_TP$h=j z$nou4wgcI(a)ZmqHcxPW#aFKzD~;dR0nGesw>BdiHMVX{x1fKYi} zr_f}#sf~!^_H;fT$1!vAQk!|v)E#c!7+`U?LfIBk+7k;t(BR4(AcZ6cv&B)Spw$zo zPSPc~ac3H6F(a{(5vGuf6Hn4UNv@^tL>TY%wd}0CnYBgj;^};{Fc-UqY1MLcw#^`IxtnLpXki9lRk^Dd(T%tFr!XgwH4+ks zVXXtT6Rk>eLFr~P)v4|#rX%fTe&(oUhfCxo7K79>SIYe2)LdFbP}%Z?(VUBy;=0u~ zgzOcar_*Uz7Tv8XgH6O+5n)S)+Is|v4XMj5MqyEtn?~DeQr)A$we@f-)^LtZGKH~G zBVR#J?!>XwtSs9FiE(XvwQ;H4MU>oZ9!yZx9kxn6DQ3C1xntCXhI7~9Hs4xR5k5LE zjtARO)eLmOoJu-I3^@kSnS*P9y>y!ynQFxHtWH|&PRd|vBb#a!>R7i17SUb2gwIfR z3L`zhKox}Ims*P}S*CnmpoZwzwgb$bPh%7mC9%_w135I;3r``Ds^u|OERs$eU*<%} z6Z2=9lw+~RY-{4;%8Y2`YA;R4!;8=V#sBK7fBaAUsejW?0Py0~EABJfWPv_sAEc{6 z4?g?gY7Fm&dE+_0s$Ek5?%(wXfZKZa{r&WXt4%HlTDRz`y|=R|@2(Y*RqW{_$hl1^ zEj%k2p&ELUx?CiCV!Lq}t~tKHnQ+Xt;^-b&GOh&6`RTj*`7;kR)OB%^x{5Pls-{t0 z>sV@BIz=?eedf@jgqm^Eu)*i_3sPo|u>&{y!lDQOW;w&F&F#97-gEaphvdz*O|mP^ zIQa^hxgv54CKZ4x0<&pQ!%cvV2-tkUNw{`+V^M2*v1L zr=lCePy4Aq2mamP@^k;rFMj@`7q4QUcIK1C1F1#qD~7%f)ND>oEHr|B&Jm|2FaqeE z_fo8f<+7*OAD*UtzP<1J;tl4v6*LRn3bN)pxU&=9sbi5_h!F=*jow$7hKWOH1=K*@X&X7l59SM7*p!rmDxy0Z(D%m7}GO81=M5~#*t{k-db&zJ9i&7c00e+2Z0 z7Y})shMKO~01d-xpo_RBvn>o_jyg9OwJIR|JwNYnM*x-oOvL1^SA%ofZyJK=ltRq#-8GE1n;$PZq1<$iss0z9>q7R$^w&` z>+V^Mev21h{(FAUANarh^Z(54;l)1RIuBv28_xs09^!US;yKZ1(N%8jRms2kCx5*i zAAI4z|LT+yy?d;|LH&H&;7~Y|J#1=@Bg*G{O^+sN{0(k5DIjwo*YaQ zINZS=wJ^w-5%jXVpAm~q(3}vaz@oA9e0J88g9jEeQ{Z$!^nrfVC9kn!JG#vyZmgZ4dULHK zs|aZ~thZW?+pG88OyNlpR##AL*W=sA`=eChVeINO4CO&BYgX?KP-O@+B6pg{@~Man z0O)igcM@UfRK#+N+-GO5!@5gg46>uUcZV|NmlKV@`%VK(#>6Bx{{Wvf)oHXs{*dwB8U9fS$& z-e6{CxQ7QC{dB&0{aHxvaVD3*9T^qF7DZ%0H-3b{(J7ttP zLEDvU`9AMX-??Kgb-VelBorQ9eLL2rBk&;kENOPP#=u2o}>?`(E& zqtQ(2W8E&9U)N|h=*y!i>?|`IUD8;9=FAy+{x10K_}~-oL>!O%q!~$|0IN=;FSpwF z$JZa9`DF5khnMJ{7Yj^ds1(bqlzXpZ8Q5l7UC<#KS&}WQY%_Cjw2_vh*llnoT&-{u zkzFk<^HFSd4jG3I>~q`0L!)|EtnmbrQcbHcg|Rpha}8Z7E%X^C2-S3l2GBf7Z9Ui* zb&X$?!{I@ydV0m#;5T86$$KZH5=aNKQUU|!^l%enEX32al{X4U&a!+zIG$0b=b-fiQ>t<{#rtaO8Gp3ZBYBSuj zu6n+o6DTh)h%+pn$>&&W!ASQ@1BLm0NAE&(tG2nBFhjJ%-ONj>%lI6lWJ1Bm(a7*M zks01yK6F;Mo}i}*)VY8YW^PSorqmHjg2xCnEztIjjrMvP7jT$ zYbrGY7K4r&M~;Wl%xIh#H@^&D0tfzL7e73+s+9API0TfS(##bkjMOt$n8W-ywKuG~ zAJ*DZ?Gu!fz8+d-^`|;Dvz-L{BS5 zpTlKXY!R-ysM_-*Y8>dDs#NjZdsM0B_HbJS&Hb=&^D{Tx!-7UOs8*_nvu_}{d+)sg zvG=i7?hIJKv}J%lELg!e2$yVxD&9g@Q-!oV9FV%tTmqA`bs*!PxaqE(kjbePxd5sli znj7-6pqP;{8_)S_)he*T6&Atfg}A#=an#=!DU67Cr_|l*R#y47F14WwvC&mB)y^ra zFA}*%G9*7HFF=ioIe#ui^ z%n);C%``?-$as+^2x6KmKv#>4-dn*&+FB&4B)W4!DZP! z8+bV}kr&|P{xt-_mZ{O`i3}Yn7iPFRb36=_fnDPDHz2#n^9!GU{ozL+{q?{8V;_Ct zNADkh{{Hc2pT79n4?p*#k01WXo6rC7$6xr-FMi?m7r*fF#~;4_@S`_xK78}>=RW%Q zqmS=zK74xf`s24Bef|rd{oIfK$a&^|{OIG){MZ*h^J7o<6ZgmE^{@`73)^(E&!^N* zEF;S(g>gC6u(dR-7)+=(jiOoaByFrNeC8yhdkk*A4oRci6@->~w6wdzhN7)hoBMqJ z`Wx>yeZ-$Y&~3|UdGA+W@#V;;zxtOx zkFWX4FL!(RIY0YnL%2P>+%3>7{GiD$mDc>xvss-ascFy2fWWZzyD#Fhyx_#?X~2b!AWjpeB^A1p{mX3fB7bKlsDn z@e6-`e8soC`|byc`>mlsRia8|PkHycyPU6H_2XNd^~rDk_Fwla|Hq&I=xmEVyWvK9 zgG^i=z=4)rFTvFUjKkykjGfV)7dlIDy1wn(e%Al=fBP?g_WS;*Rhvu=hBc7V1P<9u zgXX#4r;|?H&wJC>i`%Pr-YZiRZgex9kIJWf`}RCfiY4`OnN^K9n-MNU=Dk!-lN7Y; zXMUcUHf%x{r=^(E=bEd{5@Hm1V<6K-N}G!#yBRjW@B}Dy)`+dc&{Z7swz@jajfjR4 z%JZ%ggv>oo1~X&uR93h7@$%jG?TB>F(vMYZ8I|?;I`40ZT)avb8MYy<-4U0+9dcpRQRe4fF=cGFq~w^(bk zT1F%|u&9}8!Q9~0qD4<;Q7J1sFH#c0tX#f4>^cx)aze}_+@?Uraa-M8yTcdQGhiy} zc<0rNciu&;+}e8!hC0_e!W}zbfBfOwk3YN}al~?;PS-|%P4`#^wBOteHCt2mL_p5U zempHsYgp$}UK5>@IU;mc;5DYk?WZ`9*rEsuUjKQ~@vu zaX8SuYed$U7Pvb1HnOX0q@Lr<@F8jTn3kqETq{Q1(7NnGP8BAQifnb|5VdBoFxTs3 zRN%sF+kloct93<_Xud7rtUW3eGQ#mJuirbng!S<9)dwHEeE$>Kcyr%?42`aq8M&Ox z`1bAVFMjsNYVR%Dl9J{+x_Hde zw4*A02^w*E5<7_rwWwicx6}hU9--a+_@02)pN5 z&cmG}n>1T-7;PCWjy*1GswCcGSDxq%0Okb!O5g2?Zsc`XOuA~)7HxEKhr5h8RvCLM zbygLZxvzObeLaXE-Iur2*=8~W+|;(SS!`)n)lQYxA$mYzWi+eBIAUaPYb|tEAq8M2 zt)fgSJC;i5s@}dFlix84b-=j5AgRj;g6Di_jDu=uIu<6CCgo!CZlp;A^lPxIXQE5n zfJNzmk>1tj3qp4rSm>^v7es1?7gXH_Bjb|js7RNMrM}wSjnx$(yD&z_sv@r;tuT7^ z0Yi_?Te|GZGa8zd>$CFOx^)3&@eqbE(*Vz009U-QHnq%`$LgUz=`I#yg~ zwNGqf@q*YG-3Y2di`r>$2*M#5%;oO47hn8K|IIi5jBopy-}ueiJC+kCjh#Ip7IO?n zaelL!kxKA7L&`X5hOo|BhgI8O{Qv#u4`2BWZ=asbUSxM4bf0Y_fO!YOLF}73y`+ev zrs42|nBSAu#hLL>hd6UNnq8ed#W9|;TRBwfkzZW6S|5$WL{51&$ClVr=*^`^p=s7N zA+_D&T7$Cz=`@Ro)P<1AFzebqmn(VYQk$G#tAb%gLp(}SA$TO zIYs8~3Em>@%yaxyEm~t7JRkw86E>fpS=ChW*5I{6Gx!{`O#ov+Mnfqh#{PaC{;U#V zdlxS$kD!*SYU~^A%x3eVg*oj?$kiC^9@7wa@c;M~Uegi_bFFn`75T$py9_JX1De3-WmN zvb#lE9I-sy#fNUM#%XEh1tV=y;r+Pp$&2pUUAk7>gqvM&FsjjA=HV7&*Ea(uB}0NB zG^;FZdK9o%d2-^S>@h^tY%7OvKltT49O=9N+cI) zpw-?8Fd}a2vGcP(_}{$y4L|Ai+Yfuz>dSXmquM~4*N9iV8`a&oqTj+JOXOht*|!Hi zK7Qi8_ZObN>-YQ-pe@t6tI-yq$wtIUXk?p$8K)8pYv6|HzBlw6e#1YG{@gpC{)%@V z9=hx1x26?)*$6Ofs14v0@>hi{Oqp0#dOC)}%a0p_Q|`xZ=RnsOir^w5bi|d1*M!4YU!cUY^$xR1REC z=UEMTaw*#GI^xnY6vtnxQBqPLb^!PJ|N;>jh^lTChc^u=^E}hn@$mj9 z9^QFRTwPa_05Qz+?bFAf`_X)Qyl_qtgWE+-8|iM$vqrxL2}nF|PsZmG?p<4#pb0{T z)6K(|3e{zosIf|t@!aP)RL)&CMq9U84^$T*yTZ(_SuRNeu|hMXub!fzJHrUVJ*LVH zcdE~QuC-_YTvDZMHe%J+?qo#C6wP*~#jFHsXO^1B!|mNq#O)!gRcH4}qpc7E>ig5% zk3Rgu>WsB$tAWa9iKdC)F=ubKdY`qYH8vmlbOFb)%*@>3Y-q+HPOCxhbU(*i%PmMd z^IkjWGIn$G5EyHfM8IQSlkRF5yV}E={cyW+R>nKc=fu`|Zqa*^5i19CT~$Z;rPHtC zWIxfWiyo8pA)!@-(EUtKk_0z%IF%5%q9M^+O|vkXo4O|^yK)cBW+o%+I5hET9&pW1 z=s`-1shh4d$18jtv24W= zPv^Z=%NT2g-Kv`8v^)$q^L1O@2#1kpZnG~@LkWh4$dMuq!deU2yH0g49~DoLr1=rv z>ihXrwRabu=>Q^RvS*47s0t$rS3NsS8`#W-%~wwluFXsh#|+PmsBN?<6z^M%o_Nsz{gJfp42^(NhjOD4)OvCi6c=wjDy_KJA{P0$L* zJR{j=B-qNHE_sStx(0UFR-I9M&h>~*+L{iGqF1Whx8(DIe`QhgDt_pXG``iXU%v#s*t-9GTu?=gv z3`h9biN}Dc!r9FQ_tET>^GB$FwpgnJa@yZmj1_ygAS4A!1V8NA=bMDW}``l6r{41|{Iq;d4LqSAdWI z^FRKF>}F5*+NtbPPrGu78HXZoHt*IP(U;p3kjNxz1Zn8s@gMww?)t>1Kb>8G0%0R9 z&K@wth{F*OG=q7nGw;Yff!t_Z%?5_0L<)m=kk3ao{)w3cqFcNmS4PaA4iJ|-Xg+wb zDafEQyEe5R%foE2qvV*o%$SoP13)#ZMq%)&)w@QHI@|BjS#g{aW>wYm)1YbaNx2(k zkzpw3HU!KPpl-x*o5A6=D1o_C&jId~XkcXrCkCo7rk%kzIA>p^ZlR3W*;gP&B_L&YAqO>%slsd57G&4NWbW`;W*TX=tE(!T zCNnVBv5rx;jYgnau|l*dPzU<3PZd5px70VokEC*Ha5oxHy26=zM=RBNlrFJ%IZ*;3t@BX%b$$25aWD5FHDi_BYN5DbA z)VoG(mHV_7CM0*J@2%l#nvdS)Vz^oXGRj*GbP#ZxCxGDd@~0=!&4yKpp8LJJrE8Es zYFUWSVru)T-}Tpnih+d2%nPt^(4nfq{e<(K_UKka;c`%C`O zUvKbtZ+5TEYt4I+Bkb~b&zMI8fxyVXfy*j4E97oTbi-~VzV8SAzqa#-{_^*(+dIm! zMD+4mE26WVqIgy=`iplzu;Z9bkkp5-!%X+5y&q9^^8*9AlPM)@j)o4H(lo1bmw6OP zpCD&()}&%z8rKQoX+Q(g2OJ_v~P8PmTKDu-kj%rn(=o}2o@y98qFWpex0_}|N5+6L{SpGsKA&z8YZN9y+q*}pBCxVl z<<~>ZQdeb@>p1RbuI00ztgLXq?`@7{*qz;QMQ8QdIyX*dRzCEAp_VB@{KK1J5 zyYlt)bi#0@%Q;r~i?}I!-#>oy(MNAT{1DX<5i539o9(^B{fLLr9!=R(wO1T4=H3I5 zaPu>Bn!N@<#<7mu5f1ltv1kJO+*JiZ?rZiU4!|&1XqxSKgWZK%K>yH zY)D~J10JAx7=+B4Oe5gJe;2FBVT6xzGIy4W>dB3SNsVk>2reI;zCms@baD6%7plug z|9kGbKvfnz)&Y0%E{LF_G}n`B#oMc>8ct7;B}3YSAT^>E4$2S&M@`>LnidDfjh*~nF$U^Obk$^=3la>K@@Q7BZ8KAnhB(rQw{iIxG{ROYc9usmA` z6Q!DgUGCjG9aOah$BGqQIb~xNvQOtV9Vn#1eI17%$WpU2NAcH6Bc5v#wphCjV#V}5 zGC>Nnpe0B&oiii3cRk&A9IJLtCU;_YqiY+@VPvF`koDlAE3?kWb48ST@3ax=KvQko z;FOOw)!rZ>%;_!{XOA}nPj!Jc-Em55#q4XRg9XMRf~5p*CdGmZA2iT+v21Yj^C^_l9FfFN7R%_ta8Bd&#_i5lU)vKglCQZI6?$%`-t>E4~b+y?(6 zbfsO$&e7~QBxQ=1L1y^DSGNdsou+b~rSopC`-w07;CFuaZ-4*QtMmRgmU)=dF(jfv z??@BstWn|Ua$lMJB5gyYYuBrX1Bie6pZZ_<%WvpQq-JV_-Ntz2?qm5nR-i#Tx~4>3sJs3hD?Y{KAf)5N+vaZxtnc%H~f)m_y# z)smsQJw_7E3$o%gkG;1E)tj8wOg0Y~Bve*ripH7b(3penaJq+wb+ub$-m}wUjXANa zEu=B*kLeClXE)3j2BPhgmfm!<+dE(V4L|r7{_K6HFF$){m&Z+D2w`KnycURs*5$Xv z;(W-I!NVZ?$NsTj^RN7${~4z(V+TfRJ-(gJSuVpY<`TTjQi8N(?KA-Y(!cmG*cfxp=l!p}_qp^rt!}BiB?Jf| zh%N|mQ83uJNVpV9RVty1ij7ICs1%8l3dCPhacn24+*7VfuoHttBCg_6n2P}ehB%0u zxjMpJ1X2*lx=Tpv?sMB~{oiNKIr3q?>yY%9?mlOqeb!#<{lCwA#vJ1}M)bfl77_Ee zM?G(-unom-bUO?|lrm3tsf&g#Q_JZvyDS8mRlB-(=dKMaku(Lu=oN;G`=`D{H&Ry# z%g9rcB|#6ap3nLzNo!(&08RVC2j}tWuc|zqKoz>;_5fQgRx5Yj@As}$%MBsVAs3u@ z_ow}$Kl!_V+kg6Z|8rn9C~;B}oZ1;e=mFo;2#wohMB&MnG{@TvP_iP-Qo1$1=Lf!r zKk;2({K=n)mv41dqp_HRE1Eo?s-cHB-j0`Vstf2s9T6+M?jL;g-WQ<`9xZJo%$!!W z$>wlAFZACG&5SAVp=3j@vl+n+MqG<_sC|UE@mB$YN_k~5c>TR8OjmQF{TwVn*PJgl zNg|3&2_%`DVXB92hkd2WJh9TBTiUF~))ZD$*jb$Zy~hbYz6bT;Rs+z7*cpZmVquw~tC zPK*_|+uhEcEp~U$=Be5ocOl+<`PRFiYKvKRO5K$P7g4$O^xo6!51$@igAgpZc8&wN zvnqE&HX!+(W$w82sy;IzEw|h?w|eVV_KJg;og<9CIK?pIcq7fT%FV+4+JgzzoxOEU zvoe8Z*@>=Q1O5|$+Q}HJy5kb)FdHlbT38m<_(}zGcPn1m7U$7 zb$1b+Rc8Ne_9nP^**L<7urX#@RM#L>-GML5OY*)*DU{X{~G#tbOjijK_-JXYZ2{a4Qydxvbr- z@*J_Py3NA`X`m+|`kB?5uG^zqZ5G{RnPaj^kj&JyqUG)u7B8c_nMap-(X*Oo7Yqme z0aSSSy0REeHsiLOs>)b5wf0VNVv%exk;Q$UJBEK_GPAJNWOauJ(qMdgd>kkiZ5BP& z1$Q?|Ot4(nX)((wLZu0E!~Pkn!PQ;>X#V$GYFQMI6VX+TbY}9gbAes%uC13evo1 zx^_EjTemaBc85G9q-4a|$!tcz=X2oX^l~V|4^CwvKo}f$wW>6vrd{@#?rzdrWp3`~ z?sKaoeD+%x+NPUygSmT;%?!fOWeoE_0FH_||DxIaUo-thJr$_#YAG|t@~Hxp%;+(` zZe$gW>j+IxreqG7W??lR=x2(ebQv`SyDIy}l`$(#^q3+c8D%3RcHM!Y*p31V4#~@) z9-HBmK95>!B*!{KvNY(Z0p;V;nP#3ltE=5H9(;3}49f1>De}cTFW>n5KlGT<6SpHcb+{u1wNWtk`~iLa#0MX|_aoo+=4U?B_a}OE zCJmix&^%_|YV^)&8|bp(K#;OH-&T%ut%dGE5*m|0gwnV zS{LiOf$@b>zW1I0+1x)bzFVWSTF=1N?&muPhT2FoGaH8{adC)@W|utGlcWaWVdj=y z&j4wonhmwC_jbWV394o{#8LCrLq>|~?mlO(0ubPczo0A@1YC=CT(Ab>Dh?qW6s&qq zDqWYi+4j$Fq(G1iD3!CzHjj{9)V53Ol2$Cps^lPwMgx3EAOm-k+s;xcJXRbUQy?JB zseMJ7afOwFP7sAz-d{FPkLBj`Nh;JF^lo12Ze=Dt3^eJmL*g*F*NQQ_s%dEJxw8YH z4_&3_&;0DxhZ&#e9A1;n7<1fB)~G6=a|`Kovta57A0gQ$Q)#BItPWb(Wj2w9MlovR z^){N$h?b_#q#Kk}yA2eBu;Ir}mQc)^08N8 z8>w?9o>H4JtCl-jxpRK9AXKV4hvPnG2GYNj@K^o@8ZYe# zH}$@dur=-o&67QE)l2udq6|iw#ZgsX{ncOf)j#8>-S?Bl;qp;bCz)$gz1WyeJ;R&;!zx$v3(1@#kadF`zuybk-4d(r<{b`I;F!QzVCxD;#&A;>)eEnAqgLrGop*9|*RF*4xc8)e^oXkxqA1$j zNMWMfTurJ>jCH88(J$V9>wNvXdbgxletV;7Sm6d!)%jTU1QlHp=z}oAy>q?wroZ#m z|NPJSg?HIQ+eHERUO8IFV1LvfGLmFB$8sOcAEA$bEnP;fLq>c6Vnw zK%cDTrN}tYD6-9w`#h^-9S?83x;-4l*jxK4563e0uE*COK7R0FK0V!zo56~ZSo1GN zM;IpT=_Hxe;eHWT2Sn3_XFg1w2}8Cj&+dw_?gp9nU0ncI#D&@e!Yo!;c(doR%j>qQ z?jEbPhgD_^yLQkl?A*I9`lP~wWbgR`YCbP+PI9dqF`F%Vn1_q%U1kP`Qu8)zz~)aw zm2`H|XmPyt&L@wDx9{0%R`0xTLbv5)pC3Iwe)#_RxLx()cK8ZkJW=d+7-@i7S}P(B zhF{kHh=DP=nR#UC;l%@nOfbf3D6=2})tTaK7O!ihyOTQaS-`%Zjh>rz(9XT@_a_<& zoac7N?1=MBAHOiVr?>x^+6(SsfX?0IoXu-X9EnkqUD(`#7 zzKECv72IR3wU&oJy9u#-n@2>DINYkr*Nk+>aeL_M%9-d`DUS&HK6fUJMArGVDU;$8 z?|$-)x8I349(uJ{H=j_&&=(Uxh|(>8tMsfasEA|@n&&#zUY!X1RHJpx(R|#ZtXeSggJ-i7O1Q( zb#-=ip&hflBC49wu9m8C&9Q{f>lFyM*?0>u;qp)N*%2kV0F6L$zt8IvrGn(nvrn{o zSp7!Qs=BD|ykh)x;&L~U8g?cx8lsu%Jn!@YeAc{JIJasx2Eu0~G`-P;*~A{mnLZ6> zGJ##Q8fS!670jx2k?PIoVppY0EGU`V{HI%0gK@zKj5rMz}_c;!@P-} z?T%0TC(und30c+3(dI4>!R-5>zId-t*K@+4)m`(Z2+C;7eXUuF$L%olIJ~k|J!u#b z)mrPgcZbI~gW)ls_1=ZnakzO@Kb!I9P ze2!&G?uM|w_^XppXVS;=GM#@uM7fbe)n}ce&5h;y{hL0Yqq)2fTxd2Y zK#U(QVyR0bC=aiSW}=5rd}`7|VbfeSPiNzt0Ic2@5ZWPsj7I-DRoQC)N#q~F|()g@u*-lTb~WrujYalH7!@BFLr@ba(y z**}?$o@nbV>aM~^w4o>eIN~?^*=f^rd$%TrR4Ofyv|s-lepAC=zWE|QZd)82#k60j zT4uQRQ6d){<~?nlu^guMt7Hzsgp{Z1{BmPaY9BJ)@N(wm0Tn2YPN_=_>%!G|SOUa` zS&tcPIH{toYpvVr#wDiZzLx5xnl8B>ul#jsV_$9P0tv8o&)aoozKbg?UVnE8GzQpU zT?RmdnZ%@dK<4B*1O zeD3Wjts`toA*#mS0hpmPi$d5kso4Y9>a%Ty4f%k5-tRA7zIF29TYv8#YjzRCM4yL$ z^h}7tz{@AUBM>OFiBRMDrGehHiG^-Gk5{_tGlzWzu&-i-=Wsd`_bsUY%3u4t+~@66 zpUKx}(g9!Y#2_axa^+l)!!&~UiZJuaQdX&59lpwxrJI|nRBd?mTYvlS+12-F86Req zRoxK7IAsdgXM>Z90nn~%*Yf**=eK;rH+(HoH@{JBh$%NMLVYcyK3)ajTHjcdqjq)P z9thws{^>uuKKOFzq%>hzIS)n-1VabJgxn9oQhG>8l4 zd8%spise-~WfG{SV2y}?NLXP=3NjYaZah|)ieR<;;l+zje97(QTL5?6N1!ppE$kM& zzkYgr?+f>j-VdV(X-kUk&g@~+IpM|#hg&H-HyaiKR#loiVeUSerhR7hr9zR8ET8Ti zHQi@|>Q-lAN=|{b9E~e@+=3J2am0!>CsM36nvNg~gK-_pCLTgI6cGjO+86vz?QVw! z$f`X)gXvYJP|8U)RCQ;&Pv>_TxmFBDX4XX*6K9=OHJ{3H_SRWrz7?iwa%L2%cjs<( z98qXcS@+RG-2-S8DtD^v#miTp{FEKX?yeT97^7>`&0u=`@Qd&L(;ux5-d{%Zn9Xk% zB>Cs)L1#KLT!0B!Yz_Da>ca}U^6S?PqC4fJ2*2dIKk z?nA}RN-u}T>pkvFkTRNEpfBZx7r~Bxb)}&J<#@FFd816B$NUQclv6wN`EN_Jymk^) zD|64~-on`C<_vG;9Oq7Im(K-RMZ@I=n-KOaouF~6H8?4W35^hlTh!cBVewqTWpQ~6 z<}N*Jk@4;{uBA;qdj|!Mhj2VvppQ%gNGx4=pQtQp0<@CSjV%p9RI`~K8NM{wP7~0& z+G^3M?y3uJKW+DonFSpepoQ$rtgc~4%_OT9-5`Vq1v9c09+jO?&>>h?pf{~>9SzP zS}%mW!OB!}lyxatU0V)wG`i8*Mbl7+C|lw4HAKt(fZ<+Qj>7dGq{o=#4o+1eQXtw% zRS%QJZC7$yF5`Y+6&LSsm7pOGYIb{;a#V z7#;#H#)L4@Lthu)YRKw#1tKo@EUGnL`)g@AU51Dt%`w^WDoI^AUtURc4>N+dSYtak zpj8n=LZkVT)Y+tUjo+k%%YWGHeN9Z73o!toU~E*gY@Qfvp{9iI;t*m)36j2WZQ%h8 zJC>JR0&{nhiFSQ_SBO7_{ps$;m zM`pI#=MbJDs>^Ix%Sx511X9s%j4WVu4;yHnYMLrB z&zG5|hYcKJQWaF`b9W)oaI>b5!D3(HB>-B>mUmUah)p46NU*j1zi_3M!G4AS_nKiv-Qbr2Q z$29m4{K!urU%z_wekz~LV2U@V$xKdE1JDX{O=uhMCKSgP>#+iv^(Y zqt&I>;|K)$@ul~8;_B;PzMBL3W zSTx}}iOiwPFQv(>O*V6uw;(3ZJb=PAXB3PZtN+vgN?N|mI2G5X?=-yRpc`GFq<#Q+Lwrh2rbN>+YiZRk>R2b(l zG-RQ1Itvv2y1~vQf#(N5gt}(;ZgXTq$rwWTRF!L=IUf{vn}>0B_tS6cW=;vrq`5!5 z@yhLCO9BrwRJ*Cqr}sbj;@&5vm&b9;by_Udgc3$}^zar~Wxg`A@^pG-R+X92Oe!}{ zn9<_!@p`d^o?4}d8Ds6-$%{q;FpR9~u8MUWadR_CorPy(^*nXiea&SydO9k%AWVcA zHvUQxu@-}|A{!*L(ulzT6|gf2Jh%O|8N|V6cRum(>dh_Qt2=ADK9-xg zeRRLS_k}Oy{UcZ1Zcb2k*a}dMj<|x?yZh;Z^1ZAI=~Qg-K9O1&`wp1hhf%)6E6sVUy>GIDYcD-LBs zKsSMj{~SQC3*=0?xT z#x(6_YLupeXlBPc=ER_>I#2cOjW^!@l6P)zyvpv^_a{hG>3X9dYZ>wS_3Ov?zPKMh zcv$NQwA$UpC84v>b=(fjMSTp~RY3a@x$kFYLEY@e?lGCc%pnGmeK)$t+I3>q>Fk** zraT1DTFc!*MJ$q?vw7yZpB^4=9;W8~Jkhl?4QOi`GPj{;-mt8?YFS2km?0e(dtjg# z=(73kjqWbc%(^kA-5?t!7@XnOn4A=$DSjRD&`22;W{&7R0Ij)EUrmUFN&sBLEU}=+ zb2Hp^2LLZn92ywxL0Dxu+8h^%8WK>Iz2(;s1Nm(A{+}h6&B-@T7G$&COlv6~x8W9_R4{RX{drs!6P1 zLdY0AHtFNGCUckzoRU}$Yn1e7hx;V^l+y*%aC4WbC%zG*pBq6~YNPS7N2^;<`GmGK z?!=FYH1n_ISW0KcsjgUYy(B?NMmONHs_sO0tN>vi{TzoUA<+j{4ihosBN)N}{J z2=8uN4A|~0Rh!!~I88D|b#;|SENrxT?>%`R5M8^oN6ssyb+6&E$#3hy+}zzfvbDQo z7}SZ{fKh#=c$Xhx*6OJSLFpV0Fw1(cd%y7t$BQHF2D{x)y{_}je%f_E^Kq+zr$)LJ zs!r{$nPqlv$j~XLg`IU@vCPevSC1}WmA%+o5Rl#2WoWq7b;Np>s>*$Z9S%v;U&U0{ z5OB;&NrSyNb; zs#L`C=dh2uvuh&o=&r%pn5}S^=xpu5l%lF)5P+b;C+C@&K=oBF+djH`_Ec00%NxgN z685YkK$BB5TqZsvD4S*OtUv*ZM%gk*bxo5&V33Qvw=rRtjnD2no%)>zo zV}Nl?&{W<;gK@bwFXP#u{zf<+%Y@vFjA1@q2@6am7A`rv>r(#BVX#;tl0~;TY{DZG z<*F)zf=SA%v0TmYSCtb7Gn-1ZscGhbN(jr#V@M;#;Vn3f^KKMSoi))baw7FpLk5nU zBxZQ^E674O*Yx=st9ApdvGfbIfi~H^X6F{P{JOnk7QB6ZvnUMJ79(hpS2tG-ITh9= z6M?E4MlD3NoFKXLKBvwy7nQ?hQG->98DlhGrkVLNaw;}H2F^)RX|@HRRn{>6CL7!n zN}2J_N9vF2IV`NNjQVq@-ndWus_x{Bx?R1C!#me=?)q{g`<%IYuHYj`r8(ode0u6` zx<@dFS{{R5nf8GW26}hxYJm=V4$}#(8Vo~^Jz*Y@5>RFwE|0a9+Y)Ah>@ymfF5h)` z7MneH=<9>;5uH76g&>_PyU^Hbb2m54Evq|I2DZwl2XP{!zBIATZUU2y%_>xx$2>x}ZE&7I8nHUVQ2+e&R>|iw1p#l-Xyo8Z~|zurC1S z=&EDC>I;JfscU@aU9B(&ssXX*ha%!RooxRGkBLf~@MX=~S!G7lB?dUlwMI>$rtS94pKP14C^f90p7Ua*SL! zL;q#k1nNRf3D=Ab`G6k8k|+fBt{;8~&xod%cL*=hWMczp6)Zy%f-{`E&BxgrmnyJOZ0+ z_EUD5tqiR1{r~&}y#DbIe(d{Sz5TYmd~2VzDYF$TfV@Axe}4F3m>G=Wq*d-JEsp{^ za~`i{uByIvDibom3Qqm6TAJsy|Noq_vN^mieo{5Ab#u?%XwG{Zl-KC~<7}ljm~#=U zolMEX!`HEJJu4csMP>R#5xQa64Iy5>^=`a;6SCAsPHwhMegEk7drxS zN?`|7)@{UjzjtZ`T6aV^wAE?o4z&`#{-^V=bpo^;YgP zE7k1Eu{UR`s*i^^Zg0FTKcrGuS8c#OZo$4ko?rO9-S4O}SVI6CVrS>>$_bvP1Sqq^ zoa|Ygbft7%a$nqTo#*le;qdSUbD(> z)voLso{xpOg4dR}8uP~+2NjJY5=PK~=bs0ldF`7;w|3S1{Hv6^haTLQ-*`^XA-EZ& zo*SDHb3Z~iuLJ~#hEEHI8Cyvbex)S{=sM~IPTPUaI+9NHNV$?Qta8qB4K2al=G2+g zKFt7R)zxcT*W%pMW9lBG^MvEX>uC7pjeg9!UFS z9WK9(a(TcYz(*)1s)6augY_(*)$ZzB zS>|@MSxn8#uuq6#X362x9?`9?#!RQ`$_Cxtr-Db5otd0L)$S72@Y*>6cD3kGjrS}; znWmTz5F*T|X-QMdotm;ZBiSC&WbT}cz5CF}=i=B1C#XzLFXlkrjXnW{%X5$h!T5~+ z6gG~KF+D>&Ir8BypBUd2foBV>!z5FNdCNgEith`K6wVGe&dMWT zUp$LhGAz(2w(5;n@6?@tYn9MSE(fF zihdHUhT}rTs6RGo%;idId$#xj4YHmK(gn*2qIj^`HJzgtTsCOL9xvE+GL7i$=F5G~ zn7PA_(1PdjF0*$PXf*FCkZ#KA@EE&Oc6KF8bYHN_=UVy!RsqVM>x!WBe7v-qmaf`V ziVXia>|j@6lMI2H8|b>+YIC6IGEj2zG`Kc%j-KV>I9p5;9u6ZWBI9O`s~y8#v>B#CkwoRQcEkCZo|dYl0fs0O96t&wna+A3w~+cfIC@ z70b;tix7=Q^Kc602AR3hEg~RI0mQSaT?5z$jPv93zMdq(G@X2=%TzcT1ST>YY|%xy zn@Ta8H>8DEr^4M}K3zt(XdK)r5pm2irUqKZXQ0uDyd@=ep6&)z=Q#kr(YS&3Mi`+z zqE)r3W=%9wI(G}#;z(|0T~!H9R|aS-wZ=?Ao7mIzmjYH8Q3eJ%0aJBVUHSS_Q=`Oy z$=wafJ`~u7Ok&SL(YfEAMtJ$ZBtO+aM^61vdwM_LtVs zRsKG=j=8T~vfZqGd8yr3Iq-aG6j9fhDWIK@)tJ-R>df4ahV=PiGyq2%8;%a()Se1q z3U>BQ+V{t|Km8fJ`s^n^{TTqahlhPXN%PD7-4lKQNA4f2Fy|nD-f>E*wj$sn=Z~0K z)t~z0t3Ui_{?bQ3@DJ_b4HC<4J`?HV>-z_<9d;Z(_1AlEbvey!ih9*R(C1~}#O=03 z#Q;__&z)fy*iGqjAd)`SHa>wSc(ZAyVMPp>T-W|~{=#rtcmcU#?tPJfympZeN1eM$ zQ{m~f5h2Gkle+j3lj9mbGNyi)f4Up$vV@gSV}dQKl4~?xpnp4`_8IY zFJHd-_B-*`n=(IBT?&H-Z9UwZAAa=FhabLQ`zefW?jFs>SY|WL`uP7UJ2>=v*zC%> z4ZN*`q|wi(^W3Mo7dpFJS47Zl@(m`Ru7Ch7t6+p(Ok6bPid22sb7w~{FzjmNs%{dg zy7b-^N-bYuwvJn?t2@t{^e?;Xyt}hI&wY2dS1%qsR_#3Z#%!0nstXPbs9|zGRlAbL z?y8zsBCf+#JbYUwm{b2yBZRWM_tggJ@9@blLzVYyhceK{d zteqxwp6(XMA+8S}pFa4)7tRmgThMj(0RZkfC>YXbFEw#Y%UPfe0`j?DsbT9lBn55f z7JBddu@*{h?qPJB0*cGr2&g(DplkI=$KflhCbDOa@upX2LxpZB^E5JIIjJd_?j6e> zj++WC1X`neR8I%5yg$Z(e6Gy)^1 zhIi#fFhvra1-qO2xyuRG1~Yak%*4K;d<}P-DY1KCLnWztdl)2m)O};}_)3g3Ucdw# zE=jlumf9|Er3`4PYC?Jhff|)OhC5CWSsQkUsC|_suuo`}~jo?qBk*?JpSKc=^^R6*^u%y!-B#z5Thbe)E%` zdgIfd`tqOpGyBDx?|$Yh^VR1%-ub>C|M3r={0m?FB8cRUu$zHTAHDfdR#~xfy%_4; znOer}>t*exoc+SBknl*Pj4CN;X##rUUa0ol3%0wb2V|YKY#I00w22HlcWL0ctOjDzLq+jsOl!|FjbjxnoGK2taJg0?j_PrE@!MIqH>ldq%+nfajp&CI*j@VV|A4PnDxb_w?U6R6=dWz4yG5r+E>M-*I!};MwNs*g9o#oah?|^b5;cL1DS&Y#$ zp6j@w$$fAU6%H9uMpl2+PV%Y&5qe_Nt|#H;+rRtw{;}Wm8-L>qPwK$o=xeD^ zk~LwfiAYnkU&F$Ha=OLh1br_ixjw!SYo1-ZdaS4Plj!L*2lJ7z3@sKV`fS-I7X|>hJ{054zEV;1x*-7s4a(Oydox=< z_QT)z>TABaAD_gBjz*ebbSFcz!$;M*v-X$;W$aF2mD)&@nL8k(?W(Chxjqhrm3lg6 zBDzzV^Q;)#Y;Bdp;VN3dV1>zpHejJmIlJ8**e1s=+OxygJ!h#y zSlGZF!`08U#V|hY&1N37p1rzAG@D`*AO8?9XCu&4c`*NPLMWI1V{@S+2{vFd3%?nk z`hG{9?rI%vq@wC^d7yGqr@oH!tXtgF%4Q2K#)>2K^!|^0`PcvAAN-C#_uu~4{`Eib zZ~q_Sfsc>p%a<>#3s9rlZq``>jIFk7(x{1kO+D-|b#wGovdxuE;@AAjZ~m8l{jd82 zzxQ{3_80uOp1jukU(C$7-7M^0ua`wLrpZD^nzv+^r-+zfiG0OTrEyEyBC^b9*T09m zAczwD#WY}aJ%J{g1Nrzm&nJUoMXPPyaNY@XqvSRHa%L(7hZS!I+r7=OZVwHh zGHc(ChpJYkd|pINU2nX~rjXhfzfXdjn^!f+eV)g$G~rt*JhJ=pR9;0Ya>Fbrx|={s zW;C^#&n33IrYU3J?_;e8piG9{Jd~pAe(qRi@D~ratQ2L4+|4CWUdj^vh*vMx@xoT9 z(#}(WEJ!!XmHE*Z_4ol-93DM9tP6coeHK07siL~$FgMkN63yL1m1x20Jd42y?jHx|3P0}Wc{>ip2tzcMG(J#-%fd2?fE=W% z2e>Lg-LgfDf0s55yK5aZ+tppYjnmejs?qQit$Qgs+n%21q@kA^T_ov6(?V;5B+{f)jsY|=8mpq0%Gr^-t z8!d}n>1L`L^w?a)%zd!^!=4q`#d&c9*1`o7o1BkB5ZoLlYfL@6`nn_0qyjG(6DM5_ z1H1AZ9pK~EtA5_Cw_OeH-4fau<3k};kCT)c=E4$$al0C~EaAw(=LDU0t zt=Xc^MxmcwMHQ6=%|ZG>dPrga#~mK85_VNj5fqh zstxS%5fii^QYnNB2xnI3-ohaKD4{ft?bTi3t5t(Se6F)Lx?O}4%|+Frnx)xgo`A%d z38vJfm)e90QVy_lT-)ZX>fkg3B6GvcrC4i-NNj_{+OzMpa1Rkx^-QDSkWn=_U&3Sc zo~W1F4c*$XKxQvqgoVlMbwnc=TrP8-uXFheL3O_N^>D;3R#aD3ALiXO>t#oVJu09+ z@aSz|b-Z}mXdD6`cUJWa+E07uDD$v-ax`zHt8J=f4Nv_1&0JAp-seUcKY*e)&)P z#-IB&U;A~R`?_!V#;<i z6_}SJKm)4nA@kAP%)+5Aw5AIEAk1XBdt0VCV%fG{9iq$~i0a~uFKxv%`SX^#&Al_L zOB2-rq>4B)lK`@sbv!&!%;us!)~=@w7_tYHJXt`p3Z@$>vRnX1d#2VnD8F2yu6L|x!ls%>nq`Jr9GF}dj;YSx{20c3L#ak8AO)wqv&7h05 z%SMOR=Zb{$gTWM`0gys%u$(^!nA?@BG-0ec=y( z+qb^+RX;bkE;^egPSLGol$}(ws~iE?$OchAU~R)|{y%;Hi`2S}>RO#ooF| zL}kL^!>l^kI|;|QW+h=QvmT$vB$qg_<;IAI?45K&7TjCy1^SFqlr_}kqJKOb$Yd&! zaSPAdQ=bLMJ*peRCGf$}m|7QEJB;S&#Q4mK7Tl?7jgepw+U&6^NKK^BWu?iH~S&X<56{6%) z8m#R~*Wmuq!&{&F+kfjXHEAzi<(Vsa$8_t`##=nP`{aW(qUy{Xbf+LRot)k*AN&-`)VTV#}WKHFaAjM6~g8c8}wa1|udTQw;J16vrt zz=e^&+#o%&5HQviT@DqZSb5_13V-t3|5{_e_4eEO!J~UoHuj$J+-vVb_ugh$$LdxU z=4hEpzza(Q5mW3if#0EaC}5HWvJGh2toH}iK?kp;pdb$AsM$kR7|sTH845>BFhM=E zCS8eF3D`M5&Nj6Mr`26>7=0~uA=|?8OwD=_L@*%|aa$G%rAD)3oFlVixD`CLdZ#F1uPZ=*Cv zIqi4-?%(m(|LWiV-oN|ppZmH0l}B_ON1_Z2tfn~%#DzEj2-R%vOKaJA_FBp+1L&^H ztJ=j-m%+oaOCwBje4)U+nLr!Mw3MJzf}^{hK@0%e5T!PsO9=#cHEfEbh|AzC0|tI< zYzIltOsD&?UK}smsVteSMt(t8K7H^JlopGZsh4@*zE%w*yxIs~x5{jl=zbxn(izfD zZHR6I0VW*~t3~!iUHXa{dv`DM>1)=`1{!rlWbU<&3FVJjYa$?7y;fxPcvPn(r>cT9 z3zepfboNgc)^&yDJ>31mM9!tI?ip*9`Z!j%Af?;fBz;Xvu`=-l-fqi|EjWS(&R`ZkE`;^* zyDWH&2h|yk&ijtF*o_FNt7|PkpPpbbmiJ@11bW=h`vAnUb^+#otRwfX$)cJ$aL-&} z)mq_Ax%qkD&^1xIS)&`?Rmc+IzDPK2%pyT%Nx3~d$m(elnIr@I0)_gpB|lyaP?T|3 z%|8Wc_;ZJ?GIi~~vP|O0dCQ+tb{ucMcyYVEyl0+gm8vXgC@R3ikb6IV^r5Q4%oa5{ zq#p2N%GYpM%vtAlnTMTu52)wCtij|jE`HV8X`nCW50zKcX` z(6q0EU1`+Z80LCoWY1o9ny`d<3(o8_w3oU7qiwX#H0$EL?2+@-H&h7^vMXmTCJRmo zlZJ@{^MVXa>XcI!JDzS`e2O7epu62|;;(|LWiSjRN4Q9oHuFbIa#zlZhX%v*Zv>8g zX4WC#%toND4iU_%(1_`p*K{8_9h0)UUcW*QEXDv9pJg)1BmcO zyHlXU(`vcTaRZRUjqd&Ntw~e-pn?Z4lr$zmXRvWkY8Y?B#~Og%5EE)LmQzJzGhPDd z=SktZSC6@MKy%Ly)%m&479{M}U1WEu2y4y;uDZgbS{6`JEel$4@DMF1q$&!<7Q9#o zsG3flH0f;Ks@L(5dAIV1n`M{Ws?u7o9&V=qDka0NCQ&f4L7w7K?I~0nm%sbzFZs;7 zFJESU@MHhv@BD}V@jw1Mf9*&9;dh)r@%_T_@Xo8Z-h8)m7v!La>;5D#B{O$)xk#VI z_a@C@b|VhEmDdX%?j04OE>Vu&_rBjhIDhnSe9s^G3*Ylc9CqBk^m9M+=X~>5|GZ!P z6<_y_Z~U~M{`ot9=qEq?$&a2;cyO&v#`$n_pb{e2M_Yrm%4nF(%vG>nrmIbkR$T!& z*lII5i8?JJVi|)(R#L}iM~|&lVG=CO>wH>kWmWjZ$wc4Ld7&NMh5{^vCP#4s;NqzJN=^ST{Ej8WYcYcVjt-DE?=HkhoL(rT}{ z|Feyrh2>|;7&q%!{yKqGWy=%y_He(waeMufUwHhX?*jApecK=Umw)ZAf!l|#KMGrt zJgjPyz?6nSrpsM}>&G;-Y4DjUE2xC3B5%6iZ*RZZ?4SROe`Wfs+Z&&Jdi($|M)lK) z2+n@C)m0IZmEkc4dNBx9ZRB(Ba&xk8lPm$yD(`4oD-D;7jEf&~z3&7Vr%QcOg%<9R ztZ{kX1#?wq(=~6J-R`cGFAhwcty*J?C||e38c5<-;tMvU|lc z2sVJpVhF&HX|Ic+)DXLj&mHkKNlRSFE`Z>;@Xctp4A#8?j*WSG_fm5AuF94Hgr`z6 zGj^B3=Q=Qf=sfQcVeZ|jl7*`UHVsprWo8tmq@gOuSJ@~7-MqTpyp_PvzEFEGfidbr zXN8BFF)1(@=|Gw$GzApksFt!zqo!;@4xxg|H7`jE9>N84!3c15d`R=-rKlDGc$84Q{v%kh#i$% zgqgdB5Q1eP?EBN}Pks86Km7Oq&JX?5_dfUOH-RiGZ9Ox;F3iM*sK#@b$p}6}*t$Zb z=IWw89=Aq60b792T~nB%MW}f1!vXcb|L^`*<16jl)ei!0ZtDm;)Q#+_jjZE{Y-Khr zU}+ZBsV)j;E4xu*sJfO#j_uA}rBq(?c>6qK&@=u(D2FhG0^^%8q1~N8YSLY7JgcWy z2i66(9zi-WJgM2ft278!Rgb7ibfE#~-pPr!k=+8>C3mk&1VpKX__DM^OXcpk6lfI({wGtyYJ`m z>h>Mq{kPwJ`OfFR=Wo9AQ-AK$`MxDGu#bGj!5pyr%vnUIo|nZtw)wWKVA z`FimZ$1#Zk7z|D)l=b*{K0Tqa)=^`y?D7%l8*#aSjfR~YQZNd=;BqkOEAEfy;HxV@ zGiVc5g2&ReM3kHDy^S6gjq1u-a1S=CXPrr96$Lk|UEt`m-I5V%<=!+Kszs?Y;e!*C z%$AgSp5czM0g`=LHM$c4ZtE$#BsZGFIcOsa$|iO0B;)q-&D#nHncLhehpgt|+8@2n z^HC`GRT@N^RhNfXwNQ-#aABA`V$E|EAp4R+zEyILLgT&!X4%T(oYBMOGyJ$bbj zl;tt^dx@p?qK@@4UV6lm;CxB>#9bVyG5+~&fvV+_;9;b)>*aO zVa%?{1kTw#`M44xoOP~sbY`=B1+vaF-K|w9Rlv-t#$lG41y_XI@P{!n9nHhY%$z3> z&n@0z(C$W?bMG7hr)xaqKAND(VuhrtZkF4PP~hS-o2pmDqAwdcK_gx2%qESz zN;WCj#W$Mu(TGY#OoX@_7awF&%%~aUuMj(Rh0!6J`$e-dV&Hv)RhnqR?E+}xmcGk`ta zJ;p}Iay7e)<9?q7ke(eDlmix?Ia?-H7oGtTMs-?4-R%PuCCeh9tF&9BOJ+wfH3S)~ zweCSHt`(Lq?p|3&FNE`s*5RPE;l;O~tgyH7eEW?zfBH}T^v(3W-~F9`;gA01 z@BFKO9^d<&;CsZ&mv6p&`Kd2^Fx#(QoI5(qYrrcl8&@@_5ZMvcrHf1j$Z<$WGN)4EH`#M%2ei?&5=y%vY#Hv+iLU7puA*R;g{h#!Y6dsWFWCK}N&S*4_JB z4pzZQ#mMe})VqkT<6-5XJ;%U*O}lJtn+!?!@v!Rgb)v$<%w(<3-dt-%_m-J`4HHGcB*pRa%XPk_f?{;Pl8AOB;&^Tp!*zV&pc1yz&PA7j+K2QQQ_44iKk zt@?_w8P$^2)S;}kw9_2X@vVR8+kWsL|Gz)`O~3lX*Y9g@7@UUV=A1gC5;)|0fKnIe z^v=`ckP?!c&%%gilc(0jqw^-g_TgefqM;hkOL}k`kIHQ+Pnn~Ty}=RFy_U&vX3ZVm z%#qnX_?YRuBV{nT*-4o<;9Y6%N|DRZ4VG#;MI`#TJGyy0Sl#Fv$DBe|x{z_3h&!}2 zZ`{(*8&p~IoJ(kzcNgTC(p#a`Mpx(4?scpyi!qgWz|e>($R|JJv|>};bCI+~_RPg!LQbSnvH zXJLkAyKE8Tn3Jx1)DW9xh8E3*YQe{~lLd@3LMWMpF3=Y(C6YlaGpW2fZw* zxg`MY9zEfdB%sN*kKa~%h2Sd7hhuF6A*LpBGijB6J~OcWD>s`17rJ^_p0^N0TE z|Mq|OKkiES1BopiW9Xq>6CTT^!0cKZ%?nwV?-3jrA~n#iD`er*K75g1Xf{xi9$?|` z{R4l*VQ;z4Z{`>2|Mz+^?1li70w%LbKAW?fF)u?viWMSVq&Fq?H)4|rhka+o_? z$BL@d^%!66vJ7`Qd=gQR;BM!+7p=>9z{^Vlr|<5qK&E@%8i8z~`{97_3FlfBw&T zeD|jvZ@fCOy=j(WH0g-T=2&A`Lf5z|y+_j35cW zDo63pDYF7Ns9U#~egwm=Lij=_CWJ(D^Vx2iTdR&Z_B8_(aP>t9G(2NXy4o*vY3+|| z&)lq2BJ6_KY;aTn!OdJfuIz^wuO42$eCkPU!~8hU^2Oz$tdHLRfORJr7Pzc%)}&i> z7LC_q017$RAAnHH=*q9+1OuX5GSfDZ-7Y%7hs;Zk?J+EH_|^ zL9-~2=!Q%?%b>P3B?-37F&M<5igS8|hasSrn-zNU{I&0+4x2@Fp>fvT+({Q0%QA~| zg8OyZG?EC8ETnN)csQ%t%qy!Pw5)6k53;xuH`|8t7&I$_i(3NNXx`97wMk4yK)^zp1E$zVbxoz z@s!!TlxP4|lfh%R!dF%;^QZI96)0K5mP8qs@+h8OJk=_`hgNAo$SXn z0_R`^C=+v+fk&)X-}jDiTLH+_yDBb)NA1q;ro`vVK-V=C!G)Sa!LsmaX&zsCUqp1b z*{59xzBSr0Zgvci{)!w;NqP$nk07RCIWaDNi~(mxSE{X4ZW_OU8(R(dENJIuV#7ZH z&@5i&n+}5V*$KE^P+@0P!ZZ(esvK7eL^Z`TR9*3HU4C)xQaBB^RmKGrg{&g2T1J^q zKQ*p%u29}ScNq|+g3L^rn64&Dx?X&oQ9*+bv}cZ0)HM7&8%nd~uqoRn=wlY@5p=x! zf@p&m>BN^;*Ia|ceJHM%iy4G4xQ7yeu0$-KrlqPHoJ8db^9zYmg%NnnqzXT38i{r7 z4%DVT&BEMA|21P3=K1jXQ=6eL;^oCtcCQj;LkTkD*ugI6n5wo&WLh9oE_F7jUPtu3 zq$<+GrPJ0jFk4}?@L)uc0(sGss^WE4wQ_o4Gm>i4gy_z-d3?igbxCejmTu% zw)CeYtzO{-}uXZ`Pcr7zw*Ub{PZ9G zuz&2w-+S-9FCGV9`WfwKH*4#o1Gg+7+I6SEi`zG zwf9rYa^DGSiFBb$I1cVJw`#>9T+g9fAc#GvaMG|my82Wb?JNxkM=*4|TfxxX#>?+E zZ@qCP7~MmCQADO>Rizle9oSv5LbGROKn1nYFY8d3*{CowSY=Ty*z9mJXH}AJtdTFr z*QT1LWV5+`g2W|lv@T;u4L(+c%zZw;=9YWgH3L)KjF@U)^vFcdO3<|jY{3nKJ+fJH zquZvTzNPct0+o>JEKqpN9u728w!GT9HVtR`7yy}5Xq+-=1JF8(w&eEmWl0Nmvt#ea z^P>-b==;7C{J@2O?w9?V|L_m}j!(VyN`c3x$EG=MQH@xwJ%HgB3~Dqdjw+(tIYfBW zsMlia3KfleM5Y(FcyFJ-@n88351;eX!(w6*!2>(_L;z<2NFS;i*FZ*L+ohF1 zIFY4$mq*MuX&ozfssyX7qCxZQw#|w{Fu*JK+`*h|7Qt&TE*X3X=y-MwJztu9LU?K! zs?9-cVJS03R;PyNW@v*YYj*2^^6YTyst%xuMp1BfZ!Xsf8O^*pk74_WS!$}g&8@me zrb1Ed2^%P7SIc!%+}J?VJOTLLBh%E8o7LQ zj1r(;HWiuICE5VeyIWlm(G)!lXH;u^gGNWR!_YeGu9A6}p)28wStYRA zo>^M3P(P#hbL_mc%R2xKZ3hJDj?OH*KD4v+#B)^$-MF(vZvn?AfBU!mw*S+=^_#6; z?JlDQfw5`ypj#jeYc1w-I3^fPfAZvDhC|eKg=MI#C~LAN0voi13_>_S`yJo%`^(?x zYAl4KAj_J*Dl=8(q|5Lu4bQt;)v?wkI8_1&T2s|pK3CttsB^1red^o(AHU=O_;37X zEN9vx`_dOi$`boIH#jL#KF`Y|QxH9$LJ5!!7p^B>BLLl^HQ}PzAgt4B+2=p_sGmOn z>9706_w)T154STrNOgJ5AEoSyYyVqf?#q zg(@iZ1pw29~on{NYx3!jAyqGCscEQTsZe}qmvD@=iWa~Lv)qNYZ!e# z8=#!&I1JWfeA;E^nH|ft%U8Jh+2u~<1}O`$D>2V2%5VH7Kkw`R_5aPk^S}GI z{-U9K10l6%@yvnVo&Pbz1CuvjdN_k1?EF@&8lS~VplCU%-&_xokr!36}z@uVAADtez|pPN*>_` zn42cw129zqtIBilhugY8-EX&t-gf~~n>#JWMPX}H?*R*QqVMQ)Sv>AjwBz=0dw3b< za-CTd`xWp!bXeZcy1%aTe)bN!wP7)<4tj|u-Jed8&g`nGtr)C?5na07Zab4Sh_rAP zS{8nuwT6C0WbWJX(Aei$YuU7r89BWS!<#>DH&tb&k$ay*V{}+{k4VueK^_jEdP{A~ zJM)Uh1BD7-xle3}ax*jQY!F36M9hU~Y;fHTmyep0^f0LlZN=fVl;(!Z>}_zG&oQnl zIPKZwImoNaQwUsGG&qUYR{K~zaUtk^WFU0AAK7Ilz}3ZBC&1FYjwx+E+^{Z7Hfgsv)^ZTGeAaCS0=&SJxvoS!S*<`2W6 zKum4IrHIw^S{29tbS-7(E*c)9a?1P6INp5poc0EcJULZKRUHvMech(e+Nw!~R9zjX z&AhnOQ|B={wOMsZZ62M8vD0@C{8OMgY%Go#;#pZxL}igneu<2$A^2ew&?wW|rM5bF zG_ZFcw_D~@!q-~&ymLF^;ogbPm$%zDeAOo%_I>~P-}l6p&6OZ4L!U5(~8^{4p>V2iID`r>aTNQ=YnHt#F<@ zU)_s-l>RXG6RC_<-6|iSoC`r7Z+gWXGz&%mY%M>uASG5l$R)~E&*XUr z#jL9V_+(~iL~}52glLAH^MM-YG)0N>=eGdWs>@_EZG$U3vl|_;0GWBJSddqziH#nz zUiYI@QM`8Lnhl3g=L!%3~U{^8% z7QWWwE)Xx?cmeq*zx3VX{l~-!!f~)uZiVZ@;hL(Q0vtkFdYNTCs?I#?M}Ok+_2=v9 z3HcrzXnW_UeBJ-zfB8TEjlcfazTjQ)@Zm=vD%IN9k}A?{ zp^FzLtj&~LVdl-U%asR^)MS}?;cEnvVWEMwURNLbwU##!&y)U@@{x$Lu(9EEBdaY& zAQFw;s7wg9yt0ijiHA`{LJ$MasIH)8F>@1Co7m>;8m@wdgadeY)fBgraCZ-@5?L*y zo1wFeZ4oGSZBe7Wv@S6Dz=_mq*3j*yZc&2jNKT4R)v2J$~lH|W~;2)xK$ z(lwOPoX9IUFQEX?0_fY)?)^9Z=C{B4(x0`JjoP`v1vi5wPVJ_-o42g0gYydCxFSl0 zriV|ebh4g-k}lM}=vdh2{=}F3^dI{EznSFAhvW6reN7CF@T;}NXp=f6o_I6!P1P+Xo-Ib2;u^(B1|cSj?5i=_Xm- zrYmwOrO|TgJ;tC0s*1~_G&TxBsA|g1x*MjTx7bQsOU{QkZ?8Y^A~w~~95LB)lms{L zEVl+?LR#0=a~f|tHT{@?58+L0lP`C-vol-9;&}NkbW$?H<=s8~;@xd)<%F663D^3E zuo-39))%yl(_{Nw0y#%7uP2M*G?>+eKOfWY*U8w1G5|&%n9NhMFe_AUr@Su_V^Ne+r zy64+On6q|oB}oTi9>+vd;Bf#NP8==F=1HH``XpdMsj?inLYMBx%a^nT`0J5o%&oPY z1Rg*7@P2=C%3CytAWnxT(S3D3PT-M(x~k0(;hmKRgRNyglju(}$~n9>hn zEmz^9now5@r444!Q*Fc?Qot~LL{Mfb`63EZi&m9JpZNQ29o=xERUquT@muZmwJP^< zJaiRJ5vyyHs+MS{aJ+is;l-<>0laIYy``aehMC`@&pIF9zvm-Lw-xRx#a4TR7OAez z!chsEb3X64_TJ~x=XAIF^yzL@>wdo=2V^8eFp!vw zEtj!fI1o}KsY*!vS1JxkQHjb4jw>k>1GWiRgn~lIvMeD=5*HgQ5)mLN2qYt9x{(xJ z5RzJb)!Aq7z1H_W&zvKF%;!7uUn+I?-g~X@d*A0W<`}=RaVuOojXuw79HU>!T3IW{ z5lR)x-NuMnGs07qU1D#{Trq~!F=$}{g~~FsF#=@pPN||)Ty>5S4KJmcd$?JZc83o+ zb1`~0T|VNv&hP;hs1fn7mKmbEblg}isX}D0(omM#wrZ%9x#yY~&t3-RS* z|7`%Iwf%FxuMtF{VCLHQBIwov!3fVWYKA*{W<|ntAx3C!@3(QVS8=&zWvgq zEWxlQI$VHG&|4c&^JWy^bCnJrR+@R+5Xc@wg95>V3Tb6YIgKQgpl(8DHZv&uu!xde zRckrBkr-B{o{%}2pfz@1xcU40zDOWz7r3&Ah87*@pX_=}RrCLh0HgbZn%~@@)SJQ$ zH{avL!#f9tJ$*uzEG#Q2gj=TA(Use_#eK!u}2{>6|SyHwQ?Ho2}TzN{Is!IT8KCJT+hfjl5sfHi( zTtPpE7qTEXe|C?@ufF`bA9&v-Uwrg0f7ADV=U>9pkHe0aUVH8F%P(Cc?(gsKv)s&l zh#a*R%4rYle8hNY!nf_8y12yA!~%C^Er^}DTc8&J%fexP)^Y`jwd6E~TNVu!uB9a+ zr@>5RjsligC1ND)&Stsyys++}T>?P$6aXHqy2K-*DSm!kXEz~NA(ZV81hUf;z%A$K!k)rn~ zYQJlJi>TGMvEj;GtDBP=MUN7^oup{=Q3n>K}ygL0c`PsSl2%%wfJk_mkXl$AEA)N~uk6{_U#v}hqe{Spdu!yx63B3^1pwpn(&eQ$zxYf3h5!C< z`XB$n-~XHcdtbq;*+l@ZFRadIp=0IQgc)ghuoqcqLy|mpuQ_g}$IcX(5?$_L(yDTn zGB6%b)y4nt|KX2*OBHWCNakNy20!+iTAfBU~icH4Sj=V11> z18&GI+IS%At1Dn&N3Ocl=e8QwFsdQsAlsO!TmaD-1~%nrJIQugodt5a8(?#lB=5D( z`WFSvclUcA`ie5{{z@pT=w>@qCy-g~u;adS!L-VdSxvF+rb>oKBjwv>0?-c2RfV1s zfo?TZ3mB?ZvYQ=}GDjBF6%Z@wL{`n!U!(2tH&JC~NdV>abIpqlw^(&@l|+NPJNpKp zavFsyW+f>l!@N+ns(*KaM;w`Hg2$+W199i&r z&Nar9fAHfUiS^>O4}Rdq^A}DI^J3>7Q<-KS=I2UpWuu)T(jI&FzK~jZ4aDu1PU}aN zT!k>3_isIV{Wbi8{a4@r!~fE6`SrO@J1+gkWIOd8+Ta#>lQ?WUy>NrSY(rDKu)!^Q zwFFB6R$aD04RXyIRXXB3|Fge>Q7zXQD%CFx z8lcd;x*jA5ZNlvy3Ui}HYL(zI*mImg_Pdd?QWF$st*}r#Jc(k%@7qgW#@#--SJ#~v zEZm$ZYzTc>e`#!lKd~?T@=lIbu84r|FnBrCrQecC4i{lbzYIz<7ip*|GV}i3pZ(@9 zzV*vr^o3vZ%Rl!M$K%U-xF3wwZ*)JoTZ*rn2T(0?c6zzv)qREOzGJHzm*YGij^pk} zfAGH?{`liR@uTnivah&*@%-YWDvhx)2S;Wac;*~_*N-&a0=5$EtTI>}HfJ06Kw4$_ zCiqq>Bo2Z_I0%(?$yGDs+u7cWIFVXr(XxsmoUE$m;A^8$G3UbYyW`0bc9NB|U`|9h z3g`KJoexY}u)`Exk7ZeFF86~hgUw`EDAJ_9*O>sb5)QY_swoVRE&;^YTTHrJRvKMk zWx~tIHPeRYTncmd%GI5MS#X+%Rm$9Ca~l)xnMMLMH~Q1nJJoy zSTilWkH8WN*)?eUa)BD|C21ACd(3UFS#{?uf=!R29X`%n zNbwS_7Mg*SiJ7a{7v=JyV_X0z_Ga2r&RWyWX8R>&ndvdQfY}@PkUB0$Wv=t;7E7m( z$lS-P?#gRlFWh@vq&=iy4>3!t-CMoIjGfZy|ph!K$=G? zDRZF6&BSqvY-=XWGFMMHLHf<{&Q|gyHAN_=`=|{%&XP<-w>P4P?!~p(5t^KCmf*@W z8b}Di9o2_VZBW9lMU-F+7358}SJ$QhwNXJ%)Xfl)GwnuB>TSCtx{Z9lhF306 zCA&-~sHS1lH_U8;GDOuaYU9@Vc7U6DEk~kMcFPHnHiGD2P?ncTa<^OyG&g2u*RZ4U zYy@*9YHxD4*`n9@5>xyCn$~xqu1;+3F;UbqN>LubEU%?}majrkXF_ubf%l zim8k_&meGwrO{4QWokHkA3&{P19Tx#L`7Im9RxCLQVx^W-Ahm2_2gBjKK_}H{pdIU z$3OaA-}d^~{oddDd;h=(KK%aS{Dl(o!RJbvaxEKo$`fjkav#3f_InoG5?Y!{A=J&b zjV*U;r8fzj_xC_204E8V4aJ#t$Kf$DA4q4A@R@VKfwUuP0+GscM0>>D!!HiwVe!C~ z=sKP%SYZW+GP4qBJZe_Y&{yARTgH)@!%Z%b5>txjfO@Qs`SNQ^5y@d-}eVT`*XkI@IyzgN;a&~$;`samFJ7o zqKUOU;-K66-hA&HZ+_stufO);H$V91hu&+50s@#dO?Ivqx~^$9>`>C~sFT22tM4>6 zxQk)9D+XZZ-78!hxL_S?HV}rC%m%twHJ3el{NH}`qkruG{_no_;a@jrvc$tCP9w7@ z(P@3huhqVH%eks|o`x$zYfW;X8y`wAG=HC1H#bIq_6EsZB~yo!$BxY1`$ zoK`^oYyaBse)jaO4}am8-p>b9t(iq==@>p;b*|R^olGU@4v5Su7z~!ROt#jFfH7v( znd$7M5@2iKcyc!cvtA{-8M`n2)Omv)adEc_h#dar^I!ix|HkFj z4_@vL9)psTT>#nw{}Mug@A{}}I^3cU-7l&$WLebiGLYHD$I4~qeH~l84jR%BTv2&{ea^(bZoY|MO79pxXZo6u&3JW%Vqa3lR;&gJIt~dvvz!RUb2wwyfW*f zvm1-w5VR254MheY>Fc+FX$F`()ePA)C_qVu;}lp|TY(Ta#!yEI_rsxpu3c}4_9J6J25LmmX(2kiyyt%qlCe8pFP z{QvuX|I2^p-~ZEp?0%7Q6;#n3Vp;iVWNihHxFf=b6$9i%Mo{voa14h#uR-7skQE} zFYX_#<}e49vuKtz0r$>Z5$-q_4(C?ZCAzQk92SLa8Gl`u#}MW`%Z58VbBfj>gjHqe zYRaNpPY@y^SH{t0oC|10rp&s$Xj`zd@5)`H!eTLN(p<(lmxt5+dVlX>R#pjxC?m~+ z=mfrPWR>D*wj~n{E$)pM?klqeV2evUe(Cb~(V4X}i@4Ak#KOw+;rVl+tkR(9mU=gs zcjA%M!<>i3k{#U(2{X4jr@?5vUe6JOG#|=Du?|1hoE}k?1m=0tyzN90(b7YYwP=>} zY6uxrecVN=%-q_FYfP;*g%ztk!wZt z@j{iUl)1GteETnI)l~>&W|i(9Kdy%d9XkA&d36g1&s-c)r7=Rqxz6EKS}E`o2Oz$DOaO4M9^$yx<%Cz!8BP9WY|f22t|08z^$S; z=#Z)kkF2aJc9R-OH5ASJMwrSj&P$cGC|?krl83Lkh*W{rCx%ua1PTk?%ag0jomCKa zmq3>%w`yUg(#mBXQ1(P(6~l(D2VUKVqDtqH!dP!jANO*4`m%X_xWMiPKXtv}@%Z2y z@Bh%_`;Yw4fBijw^54fNe)7qypY`bTzue)^g&w_l2%acK7RiLsu&9-aO2#2oE&&L6 zT6K|8gM7UbG&F@tvy&hl(lK&%b|_Ow$O;-}Auaaae`FV)Q9h!oSCW*0DNE7TT1$4h z<^tE*PkqPt|JgUc{u}<#H~xE1zUoW<>gAP^4NoBeoY-Cy^b8p~ z%^xKw5n~+oh~{pqx6Z_{qY|rDVTDJU%)=bS0BhxPa4G?u>*_~n!Ynl%-ZzaZ9hiVt zKBNu5jBb68S_~V2l+%F+SYjP&dbVXL$bePBEStTY{jQZ5Sk){N5oWA4mwEKexa$Jl z7+dmZ10olyQa)OgbfG{C6Xm5v(PGq^E0=i0_LhRJ!gfM)$IE(avw5Cd6?Aq zTLGEbW*z|1sP9t5Ay{R$-n)p1I3MnN*#d5jIv`A`TLnx%F=ogr)aHNp4aGGp$GEJe zZ}^x0hu`qK{-tgAL0|pbjL}1g&ZFGW2OURkk^tV3uiJ=WO*d|kW{W%6SH8AAV*d?$ zF5Rb!*3`5e!A)Sf1xEhy&;H_ff5*3`Md7N$$BF9h^gyj#nNrb@%C+lbhD&KvkZctI z9DBgaqm!-e+gI7PyY?SK+v9AfU|MX!EmH#kx$@V4-PixYfAx1idi*8V z>(!OOz6cipcuIhqP(3Kweupye$+WO~{LVDn1FF6cDoM~SSNrx2){>A^1)BGvLjbKJ z%`zqA2)A5mZ7>np#d$?9%$0P2GTL#8>s*D^Xk*X{*=|@sRkc6rC>g76LHX)ioaZ{> zUcwkrf`zX$uh)6GI0>y;?qOajN?<2{RGmaJm(usQjIuHY!&FIGRbM;_hr=y=ou_(M z(Xt!_p#uiP0s_fetB1oLQ7ReC91j|=f6n**jlYU9#-Og(@&mV-5307`u^qkeQrEnD zcHdGTQFe7xzdnUV2eiw^oHEZcx953%bllPHuYcFK$7^ps&Kd zn)xn_ZS~IjK(@VvD$(}Mx<^L+aWW1*i-TKh`{{^dnq_YgX#z&-?N}`^W#iKlpF`&ae9ozwShh z9)g0Zq{q%_*B%CA@7yTdT5^z*R2>C}v$tcehlkI5-+TY!fAL-ali&M$-u>mjZ5p$k zPz?#K*0RKunHRE_=w=A*bfv@hXG)sWTs3=Vsw9dfI$B-bV`L=FRwuqoTMceAn!;=shjqdQYAQyhty&~;E5)RYm2k7Q*1C$u!+nf# zd2IA^RVq8~nw{F5^Zx#sXTiw`39G7y>s6~-L@pke3o;Ej=c43Cth1v_AUWbNXl0ri zP0m<3!>zN@?Mfx-=5wCsobE<*?e(}(E^Tu36vI5xqBCe#bYRu2ad&})WH?tP&|Rv9 z?toJ|?W~2WW5irDEOM=IuWZXkkMK4eja7v#3GQ=F!JU9A=WOhQx#_l>kXVUugRp7= z%o4?wlQa{}ab4+PM6B7~Ma`vESD=RZnN`Beuf7`N(Sk@vE?Q+7R30I4RK9rrH1n!+ z4hsYgOjD*xd5N)VWr+swVp&I487i~PyLnxmplL;n-sO`%XU4&ey#*pXk@B#ztTI|v z9x)Q76cJS?Bg~O=4f8}gy(-d&Vm&d%y&OU*W{SG(xss`D&5V%L# z08m;T%x)YqjfA=7+DDN#OnF(=q`7Z+zy=qou)*?Vr37Djs=bYM4ocl^Rwy&8lSYZcY4xKZr)fISz2xLr)=+RiC& zcy7_WSjfukuo2DK9T@GRxZNBC2eavX)kV=AQ&G3Uia?2jj-y;;*=dUymy27S%Vl{{ zX*`hgtk+(D^x+SD;1fUfE!OEp)a!*uuu`GKrW6&BbTPEc^ zOM~WsDK)WD+w=~yoSKz{8<|)>4rC+oMGv7YD>_nfyJ0Ge;htS52BAmQZQO%9sy66- zm?aXGYp%E)HE#~JKC!k#7&eT%XdU$qk^)q&2Ag$U4!LGmZdo`a=jivhdu`lYq#M^N zck82etEFuc66CaE=aR_Ao87G7pdptGpk3$bjCR9a=kqnQapk$P`Wn@!0+@?q zWwEYjz54j2^TqR5-~2+4$1lC{!DkOI0#4#W&yw{lGE*Z5PLUm)uzzU{*Lw0(LF4zR(QJ3ro`*RgP48c>Wd+ZC6%XVN0<6v z1_7jKsG>n>Y>kLw2RC{iaq~FJ%u>}!+q_xgdudR$7Tba4t}9dP8}wLfGUu!BdEYO8 z{F7KOV%S_!Sy#$XVK&z?bAw=BN^D;xa>%PxN`nn~Qc=^h4IWm*p( z+p+3yYzhF`T-}n!j zuJ=6q#UKCpXMXkluf6MjJ{XJR*4V&p>@lKgyH<@J>BCF`G*#WAQ4)-%CY|h%ev~BR z0nF>VyBk0MOP^U!fBB^^`1)BgX*lNW4q-BomF`BsJu=JW1S|pi zF#vYgUQ3bm!;|^?yFcp_zw#5m^vj=l^Zl>kVJ3`N#uQpfb!qoez7v}zwpARp!KKC> z1HMViO-=UZCo>m}Q;I0SzUj~W1@dJVjYYbQN+ec9++;i}tUk}qTwyN2eYBccfOo{D zJ&_<94xcIBo_v91o4gQ57}fJP^DHQVB5t!jSBLqi?Y(ZLdkbFMk7@09fm2q6%<@z% zq~SC;Rc93poRXaj5iHRy6K)1|hxN4Do#WlN2g#gH9~_8Fv`@Bko#l-{>e+`V>z%*? z>PWAtR4UsI*`!h!bVF&SV)#q|aJ9u1PFu)`W6s%wT_@7yh<;(+%(^ip&COIAiHwW# zeChQMJpJUS|Ha?>Td&VP^9b7tu~z>TGUntSc{j#HfV$vppM2E|#P%&9yGzW5$^QdpTgm<>?*CrRX8!bA&2J8H+t8m+l?a`~Rm1-rR5-WfhR@e3HQ%|KeAQNd~ zatYNsfzr#1i11lU1sD8stj%S_oRi+94rYk~G#-d7m7A4Hxwqwn@tO?F%%GgEzG9*t z)-u`%pSetP4_!v@Z8GyY7tQ9JgDf*K9ic2yO1hbl29DsG)=S`=#ZFI9POeqmLBG}- zBhZaWM#3tW!&cUWJmSfdS2&`?%t|)$pHdCCwetS?+o~Fpf*_P)M91V;=VtbOufIHG zrh7*yG)A0j^(&s0aXA{%PIpP?(&4IHW@L;t3(%a?+)d0%Gp<#Go|#fr&K`VwK!s)a%{fJYuayvoO!f z%5sM@EJ)hQsYEn@(IhsI7zj#0mC;320;R*FRFx%gI967k=NQMiatTjfekm?@GGD2J zt&Os>9tSvZeYk&m|J)&SmG@iQaC9@0W`*f7&Q%Ao8gjYU-Jp?3%vRP~lWy(iwDx=s)XFf=RWPqCnkfnE({7>4BbMgfIF2=J z#JNtXE=R1T#B!sfJv7~m2j&cqv^-a$8fcLn)9LIS)g|**=BToQ%(}M1GLwyu;*Ixz z>qkIi3|Q7zAz6=<+R(G3GTm0#;aE_v%xYbxOWMR81}-(h%c?D8S-~KY&EwdUFO{IV z%x`_b==)xeSWCtMy4f`s(FCGmsmGL6%fls9Wdp#9r9#k)33ZpFWkIaVF*0kRSE95g z_H;jhH5$_TQkYd{Ar)BGc1zvr58Cz8qZCVbmz0tjluVU{&r=>ILMv%7XJy(5099p3 z17{W+CRnwI?W|K}cHyGTP*XNoo0}zX`{z4u$t0Kty4%WWh#rTdUCV9aEp4X`{^o!5M}FdazS&*x`TQ><_^Y}6T6EtX zjKfx*1Ss<`lx#X3sSq^a-7`Ta`yFsqnRhFRHLt*oa3jpvl$F(@Tr>>2YF$-UeYDAHlJ+cDsH$*(N*I?X@BQ2_{KV7e|MVaI(BmgB zRUzDrRc*QIs%ll3(|JPbkGlhw=7`I6T`k<)+gL?9q;sCGW95C=qw9Py^N5Zrl?N+X znJ%L{NLA*VHiBlAvr-mOIq%F-MysYrfC1~AFtD(yKdU{?x}MkYFdBhca`UumQ;_!x zlB8o^PxnD*>p>mwsw^|CC36R@sdDr{DZ*Uj@ZJj=x1nYXZ9HRUmA6ldTgXKl+>F(W zRm5(WZRJ@6yG;V#eu_>o(aX$7>^md2Z$&wusJFZ}1jZK<}z7Nlvr61%t#rz`bTIGu&WO{?c5Fr1narF?FiUSd+3Us zdgr1B0_Bb>V>6Jd0A6C0ZY|p8L{i9YQ_*3R_WpZwG@+X9lG(6L2>ZGZG|)=gY8v-} zGNC5s<2DD^b_NKm8X)L2BMusL7EE%&EISIS$)%n(_60DrhDTM3<_;9Hirm*l;Fexo z#olcDo+*@i^=Vj|wxPi+g<88JLfn1UkT05VY^rFURh8|7*-?tB*>4dTJ)=@tRvyQt z-yK-9_Pp&sMprG=>K^j&Xz@7QQ7HFttE{tWM7hGrAR1fXM)cxoszR7%(LndgWar*Q z6|*yKJ7((+fab$0n{A54=?rUcTi0_W#OeVO-E$=!M$3|itEfr`a$;WJe)6u@pF!XJ zZQuQe|IqKN&~XVY$=fc_wmI%*819k`No}4&tKi+U+M>FfwZ(f2@(BZ0r44$p@aMnf zJFeh+UVZn|x1JuF79Qctys&C!xWP;-vE;#0Iyz!%k|km8MF|M+BNmlfm3QM0KHD}k zs2xS!k47uhK2sXBv|X7V6zaxen%AqFx1-6;63Ur$pYuvOx>&xzc2PQOPK}U+RUT#> zWY)!ccv<&P-}m7!`Pe`H{(tdz{afGv*T30(EJHa$!=h4#RPWQ953LPEK=sbjc#JI^ zfQBlQO?R7h9r#;+<6B?<@aKK(AN}wLzv4H(c=mjuXkZm!sqB$EHu081j^hYgp)wg` zoY(6yhFG=aAr{PJJ%|J$!d*S+Xv*Fm3){^QYkMn^VW~w@Q>$zREHj-ml?vJz%*^Yv zr*)m8j&Uj5IIuHUAdR9hj*HfWAlm2=v2}QoGDqdMy&#Wq%rli)VxhccTvnmnL0b28 zgVxOwE7Luex+yE>JW00au>_{vW35wdkIiKcDV>@nqtQoYZZoB0)uNdRb7nzdHs=hF zb1nI>BAlu+plZQQw3U+yGt$n?OqqP#J$`9iE-Q;`$-o%c;{rnKynpdD?fsq#*V zccY0GX``z%A(h}!bGc!RI3G^jaE1NAjuBe8&N)0f7o^;3$a$VI+}n5951$&|(Fx;G zNWjJzl~ZV_t{Ohj^gyI4^Qtb;&Fh>;9EPe)GICWnI<+&ZFiFe8rmmnYxRQHmgt^&y zPU?nD6FM*sXw?ixUm>%yeYs|q$Xd%r+KdbaV-dQe6op&*m2(ps|%$}$yV(5o56Yk`1xj0;F(Eg?}ZRi<~sz`DtE1$?m# zj+Jw;O2fpesa&-@moplmw^knE1rwmUb|B{H_m@iZ4iPIP&3s!pWn;61l4V5Ojj1oyP|7^!x9B$x0tyKbc3u%r>N>BDYJ5^ zz;#{SUf<8ypc$RsMMIJ{G`in&vXw&gl$eJ0cr}F=us)l0-AVphTVY3Z*ikmKXrg8l zMssRqqCc6|D9ySWsk4e%3O~?3tXf?hCR0^w=$%{@oTw#sqy)`|l8R;}WhT{;LRa<- zBdfa8yfo*kkd&%fweDB=nnhbf{z%iu1^?Wae!<87;otrb{};dSC%*g7y!OiD_k7m- z&uczaoO*PQKq{)nfHd3CL21GkMnWa!sH#LWWT{oGoQ=xs4_Xom)&Q*%yR)ug!=SA` z*vd-CWd`dW?K250v`e&Vt(loBt(B$gx)!tbk+QKZ!`3sJideyQIMaDvUV6~wE#Td+ zJbvxZWx>IllL zlcX6gm%B0UAky5zZ5#x#bX{HULwclRvA7Dk8@N!WQmtg0GJ&RMs|=g2$;y6DYV1)J zR%w;0+8F3SvDB0H08T)$zg7W#FEiHH7lR2_D}ge%RjSI)`w)Oz^V|1nygOBGXY$vo zMxd6l7az0>5g=4&_Dvpi(!--?7-rm2q!LcGcLYH6g|DA@nt?LX=?H>s#gx0QjD`XW zCASi*nX6%j0JN(5&IDMBDO4fdK;yV10&-QQ7U`h8r!KGu@U% zY_O3i)ykTwg5UN8sa!4RRIj1C&$Mm!yLlItt5~RBgUV2J8Hy?tSwbzS63S{ob8)R| zvQTD^c+AxQNgzRgJ1J8?h_%=&`eE&^t=U{(rQiH`sBf z8yt1NH+BPNw-lq+(ad~5{FGpeMr8p7Hl>TkEM#wY^^SQAtzdTaqFbFQl-lHj6cWgi z%Cbk{RoLu+?uB3qkXQRL(zB{ma!bkFn-mVM+$}~V!dk%lNoRnSUBlp6s!%m)d})fm>MCiP*wKr8^4@Z*pc@UB1mP2UWN zGuKtAQWZ-j%-iSwPCKb6JA$4Ph8&h=l|Sa zOyOdZx+1D2kLKiR2U5|8(Oy&8=irWcN$PYTTLmT?olM%UVXYo)>C;cIpZ?@WUVis` z*ZKU;$vK_ofN#?%NDGfG;soQLrL1jW-Vt61#z=y|CfV=A? zSIO!^bu^}xz;3%}7~f4`H^aWU5_Y>9_Akx$KK0oVpvAyIwWp+3WviWispy}o^Zu|Z zNV(QS7CaDfTrMz&1?t2)QN`OT+-Acaax?Bca9?J(*o{;nWu1E~nuNmk8uX`!(yEnn zu53F(qp7O9DoI)yuov$zGb^#ODw$mumLN>Q2Q9zEn_u&<{J`J%_V4-rAA(1n>j04p zN#zL@cLL{~*+f4(W}vIvdVp5ZQzFYT;4SHttXTOW+2FC4uR9jbj(J^{!OOD=3jD~lRkpip; zdI}WpB1YKxFdyE2Tjx6BxVs!Gq0u@WMLCLDx^!PL~GyBjFc0+<$3>ssM zuAJk>{g~vLi`{r^=1%GF>Li>O>33ThWa^Qr_pF2iF`RoO-*H*>bx zzY}nj$YBGCBS!S4W@Z0f=H_9nMKLaeK+cTg7%#o@(krj{@o0(Y$x4B11z@a)x8J@# zdp76QP(}pd5h*+865B!uk|j8!Pxe5La7dZUFAjHi?{3Huc73>xh;Uz-UBpZ$h=_Q6 zxf^4^tt2-#B6@XU4M2xzFsxjFIbAs^1$`VtrSqJCtUVjTN?l^m5iz=^t5oLh;gu`b zQo%%bGm;U#*jxVxZh}@;=d}bneH=$uwPYodOSLvlpB`;W6KQa-6ri=1k>NM*8tCSo zMJZHOSs06|x}PcfqgP&e^6Kl4Uwu7c4=d&UG|4NSx{NXJUp)QvC!fFd>=Nd|%G@h? z_vx+Mg)b}o(tzV(Jm(e0PSg&M1k4b}=#m_<=3MP&YT$fIwbtF;VcqRnvK}C-Bt@$v zU}jdXQqGlt9BfQg)mn3EA+y|kRar^73Uv7JFt-s$Q(VGgVO6JiQL73}fqfWj`prry z^WnUnDa~(a!0G#%=4~=>7>&#EesNo@NjFIjb9#)$!E{0>i^tRM{LusaX~yx!`@Z;%_xzpz=l|)i z|B*j{>&M>v;V-b)-+dbC!5G>4_Vdu@sDFRtlrLwVK8`MxI zC*g>ds%8DwL9RlrO;k$c);~7ascDG=7y_$_#-*%0F2mKn23ZL%1PHA;vu{d3@R(-YX8b+LAE8iYlLpuGr0%78S|2HRb_Kwdtl8@ zsBcqp&&lC5v#iY98I>)>qj!z=E6cVO2SJZ9s`?0uUfoHf)9JEyH0|rDQ$~1eG(OPA zXlE&4sP^skL_TxY zP0iis)U7seEwM5i)Yq*3R)=(Z9MMs$1mHUwQq*Utw`%UyuYubjY7rZbVgVzka_-CUKb2;U4DJ zMT3nt)gl1|ZKJ^mRZ6*^{YF)9w~{quQ8Hm$jc>}}=G23t5?RS@MJX|8E;sb+E^u3V zT8bjf#cp!RJ*0pY`uNjTkJdon#;yWRG+>Kcbg6?d)O44k2}ORAW%!W}x-g4s2JDnzlMflNQ=G z-uzFfon*ZSbGT~{SlU}C#4VB014Z=5*eX<`Csy-_jZMKSN#5^j$F@87)!&FH>nn1# zMZ9e*+cN5xq{zdZehjj>Qa$_xSV?KEBp4$=Bvi`M0%B_|`?Ml}w&UMs{a|%uhUUOd zym4PFRc7evW6fGjmkZVe1anv^5n~lS|*Kg%^ z*Q!d%G2k(?ye$O1C6U*2nKygXh4KJ>5CYBNN0*myjEUpT&;98i`(bF@J$cz|NmbUD zx4!h`J2&5U6nfWUwXs~cWDM25IH;Afu6VAjWHAeI88h*TpZ&2{Km4WF`|IWKmKs&U zOq8(ky$eK7nC(`j2PiyR@m4`g#!{BRTq|O@J1pTwzi^cTIF9F;FTd}zfBvWbp_Uzw zUS=EPwm6vENZaDmW9NWVc}MYM=fdZ$7-I`roV%58DU+$8e@o%bcrx=&ih<5>_~d^ zo76}nvJt%fOZKsIy^}{#Z69kN2R)1pT}jYjsY>J?n>i?)XtD~>q06vf!8wvR~ z!-E9O3zf4cCsIe@PN~YmjR=}k?c7zGk1@|v)GJ@`oB!3{{yU!E&*L~I7Y?oxZ~(gj zxwaP)P-Rb_fW+qg?-U`qOHFGM1tC0KLB;*R7>InMK=N()Df2R z;ri_9{foCL#O1CGYR?WyX|1vtq{6*#F$K91S_DL!=ags>fZAMH1wt#Q3TCExmVoY< zc8{jo7&G(YV}GpDIhVAK5j)a0+=6#^k7`axITyp6ZgSl^aP}E{R?g&ZbEg?HXFsfF zF?_TrCF9hB*;;2+iAt55x!LdmfookK9Iq@F=8LCKb3K&K zn$?lam8)+<5mu$S&WQa(&UKZwxfg-~gGDT$wC3u#O;$ztnQN`=V}z^y^DHS4Ww_VKj*%3E9)4w2V-#{;&*QkX4}OdxnumqEn>$>R-Bv(I*|cAyxpxLxWUVE0 zp}ZluvnaY-SoE2!SUJxQjYwe7sQy%;LY5L9!M3}i`njE}vUI(kbIx75DXz6h2FZMw z^SowV9>4PB-S2twSxXuZ(H$l^tT_yh!N{ts01s_-0c`a zb7?}ADIdq>c-&B5rOtI4JNj2<9>+oR5p?#oL@_Q9=~hd*vY&Dic|s+k&N+)6xO31d zvnt2k9f;vRe7FyHw?IT7%ZPC~MjReNBaEwRW!^oyi{Ubwhcd&PjUh?bypjlaLSd#g zWr(;7a^=Y`0WX=l=n1=TP3VG-JnL+7Ciaz6RoS`jy`8^v%0`C}_oUH4g6^?N!d2ax zQBZXdN$4Y*(EK+Ts^OY6W380n1&GdDonD8#Kv?w@Z{@BbFgO^)vYjOo`Zxtu%EP-P zt5bs9M+H<(7SJdAzMGQl$TkFVw%Xa2ms)$Sg}UK_u=4cnlJCL&_ea}m9#K%3Ye&dz<)XvfV76~clBgKg z!k}9;2EU<3hwp8vZ~HfT6SG~fKo@A1K^}|?*D|9WVNQ2X*MvU&`5zk3KmI5G?ce{8 z{_>xG{XMU|@4cV(JRd*gn7mZfQF+w;AyiQ|vdlV5KzCK3Ep17st6APPtq3T4YS`-% zNvo_0T`RW@g=Uw#IF8FPbTPj?iOb7zcXzz>YP|GH950V!#G}i2JP;QRidbFpvl!tX zA(IL8@>;Ak$*QDnb^|#XN@E(3qpqXwkNM&%s~FXaB4!)iX)Y9jGDZ(4*i~f&vv!AL zNkuCgE-|xWgpudUs#1y;m+@#s5aA4xBP?S0@PtaMt5hkiDguMf7`ZZ;s5$}>;o-Rw z!x5_Xt*K+4Wgx>;VpU%N+7~#?WYAjJaU1K2B#dxt<3LLxX6CT)vG26|bRtp$ma^@~ zq*ku1?D1&z*;EXRzI{^;wE>&XsM;q#5Ls*AXtRh`Dj@adT05tx1wf|m%Bw9@?Bi1d z9=o9Dc1v!3+W-W-I->v*zNHLyz^I4x>6A-*!Ep4>XtXe66Y)2HtIZ!pY;Kwv-5RO4 zKTBt`alrmLB;0f|+ICX(sNVqeC@g^56*_RW5?I13=cNgCV2$sJct(0X3m*K$Zg zaKpfieYU7Jry9`-DfTyAhJe9uiD6TLY^)^!`3MUbv%1(@G$_kEswvKtq^R2gpPOvl z#fjc|@xJu}=#~zes@P!zAZW48B1yW_XmB|+U8q`XVX18lUhF0TWT^;` zC}m|gG{sS0rZZcU4)5%u>o1gjxWbh|Kg{XOhe;k~DOS zrP;RgkuoRUIz$d_HLb^Y=bAI8Np$wia0!)*+YELqE3GaOHEv!uda6@vWtK%qGSNv3 zr_tSWO(Q(4Z471x$lPqtxpxud9tWsE3m|H7e{UwhwLE3?u1(V~ix*3hoD78+O1Qa?& z8g#lJ7M1dq4-XHI-}RoA4?p;0|BVW3-K)=wTiGY!8<&QgxMi?5+xZUm^s~iXr09U! znb|`y3DSz;0KV;8z7_U*H|;$-Y%l^CBbr*>7G<`#u$@E&7&g#xaYN}}fLn~O=&pc5@aUYeA2poY}zx%g+ z{r~!Z`+xq#|L=zoaUcLPykt^ZHT=D|J4)8Nwvh-|p6tXt(uCL(pFK$ExvB^l#Za*c z-Pwao!**B{klEuDHZuP<%R$!Dr@#92?YE^l06Y4~WD@#XMK_foIem2zyPMP2T4akk zevHG+a?ay8+B)LCBOTkXUVBV?+&y~y$}5+< zC+ShLRS9I2dWN!AKL5;T9-cq5s>4Gn4@b|lh|FB`%&Kq;8yzWcZDYjIQ_>!K(#<*r z=WuVW*4(_;SnH6cNmVe_S}F7~$=$LtS&M1vaf?Znt4z3zgJAc^n^;~Po@=EFs+Dt$ zXr1W(yskAL?(b=#Y=xnQ`@{W%Tk|R-Guzp1#FEbISyF@v@3`$uxh*=#+4=;X|a~?(yCABgox>LngQCTKorq)bSwHDnHx#nDJ!9v0~4rReH=c-I4s)QaE zv&>Bzfsa zq^j>YjdCXY-yxC?0B~=jkhgrJ+`yT4MmS_+6bw`<)qY16w_mz{=9VN|m+8P~!c$F_o)HaBdwXUk_ErZ}Ll`65rGgdhzw)J(U z&O9F;PMqsF>{GQUeeG9%@RxqzuYSk>?03#z`mxu(==1FErRUeP8StbyOUj}rXe>*~ z*jq`bc@``pSOsa#DswklX{OwbFfVjmB!Y1ncSnpdvheWmaQ~@KzxAL)(+lRy2*fAW#1AN|Q+{i&b)%+LS)r~lb6eCA`Hc>XINtEX>U z&c{c&=}Ev7S+k4TDtEpaIl(4KqOWCL&AC`z&_s)tRFoycQE1H+GSkWw1=uP<$yM&I zDriv_a5YAv;4v+G6paQ^~g409L(4~sD(B8E?$jv6MD zEcI|sXOY56R6&l?o(*pd2doE4exOj5-7ZN9CH7+%u09@7s><_hv0nu!-C3x4J-1D_ z#lvmIsLmc#)@trbX=UF$hnY3Ezc06aPZc_go{jbOhMo0`+E#wGTN>?RWxjKKuzoMq zmEY}fYH7KFI#8mxovhm0HCR<^CDlIUb}?*15I`a!7#u|edQ!gQFg@>P!MtzYG_Ugh zd1{~2QPm~F1{Av#oLkcGf~cZZ$+~)|^&srFrgn#1&Y)5vX&S$m-zH5fr-bieW zs>!yPjctX5p;*<{*$t%=tpHioJC`Nxu%U4an$0jZL33+WM8CHb7;d9`o@>%Z_R>>7+ZfuYF=!?dO1Kn`(c3 z+oZPjA?$C$el0?E+vwFgW(x~xkUHXuty%V^e4Cqy%KdP(vuJ8rk`!H5X}7qUiKzuC z!d0az(zSnalXYKg;y{Z&+*msJ_Vc1g97NZ`_m3~N!0+xH5JhxL9!jeKSR8|d(|UNq z*7CBH3iBQ{DXW$`b^$|IdxZPp432FSMW?kP$$Z!dcb{vC?+{u`wJMVva9FL8p%m_` z1#8W<`(MM%de{?Vw2Goyy?|9!=2@BV)cR!RTobCQYpDP?H?v?9v?-%Ot65+WJ(V+^ zF=Dt62{3o^oF~J<%b)s|Z`K29W%k+2tyfm<6dr+2E$LP)A>Lv;8;sl8;J)00Lji!c zRJuFJ(tr3TzDf3&Ap*2CVYPib3lPH473dNqTJJC-IcE|G@7%_wiP1os+r`64bGt*h zd*jVh6q$B09Pj$`fAK$WUvkS>JBrbd5J{qw%YC8&jAp3q5Q?@Up+|4IgPB|6Y9o}! zahIvT^8-KN?|E}xPj?e6_rACPrz3(yvLz-0pv#JDB}{+YSY+H4~$X*2`+E-g^(S%Ips>~~lrk$TtS>k<0ba)CrI#N+dL=nl z%|QnejVm?_)O`N@eEzn9-qDDxutQaHN6Fn`I*tKyNkS3I)Nvdm4g%RB87EEWTK%t^ z*?E?UrWP;cv{cHNr5>k{jIh;}Gv;s%4`=s(m9?+V2*a8?9Xn!(a2T=x8}9UxiM3YS zoE;V(;r5wr>Y8IuEcgHSa=Yy zh+28BnKRujVh|WUGPPDZ-J6_;oT-G4$4~BFfBks*wS-@DL2wis>PkN%^2PoAr$7Dd zt{2a zgyOQ)G7?Sarkqxtwf8m<_vA4Q$_5l>$|;qpCv3*9mfIS1!HAV%zV=WU4HKfA=1N%PfAwouCrvgH{Arf}wIhS(y;HDHci%hHJW+g6(B{#0rzDJNGQj0|oukP*W zFTj1R4}DdcTiq1NX#{RA;79IuO01xqK(bo0|R4JRT-5sbAUP5p70r$3W*WXRVF4x z3_2ejQHOux+5NlT_`>(Uetg@1`p19q+y0Z+-{W_$ec;p2smrT}9`0}otMal4TBu~* zzPDs)(;3D}o|H7S%0MJ8m+>%Hpe{D1QYl>yKX|w5Az$cMKlAX`XD}a3nHUkTy!PsQ zAHVj>@%Y29bFN@|WwAzjU3S0izgi-yMGU z^5x~n7k}4Dn{fe{*9Y1tHhLl*OaMZKLPON4N(`^Yts%Ov!02UF1;3gNnyClTU09T> zSJkBo$FK`(mhqe`NDr$;6=lpUdaQGfWViFd&6F$M9FiZ=g>K|l z1dQIO1(akQ3Xs|ogE!cPfROI7&PgWOHLa8Fv1{yI_H2waM~M;4wY^KmBAn&!Nbk6d zvEk)yxn%W$iQE_=sb3p#S0*_fu9azF%oa-8!)MhYw*J`Mv~v`qv(Pe=MARPCp^By@ za~0kZkT&G4%WcJiB$+wX6Uy>O+)aVM*_%AC!iuB2eY%@1wshQ(keNo20}Tg`PEJ=o+DMQ<2HW`>8aR_I{QY_cUGZ9Qz6xNpM6JaQc?>&*0lp29-{UC0fBap6alSbvCQZU)XXVWx(~8e zrJ0*qRc3;ow-Jj89o{XHiE>r@ae6quubdKZEyo*5D0(lzrc(L-o_9E$KmyU1LxL!8 zVzl-o*19CVOI`NwvjZV}cwkf!5ZqK{Zp!RI4t>9;yj5d!7q0DzbXwOX2!blQ<=RC% z3?*lYw$|!Xfx+CP`k}XEN5CZ<$)w}iEd)%N{eVZjyZF#V?kV(mz-W%c=?V0_ji0J|I{CU`FQ<0UkH2gxV)xL zkcC|%@XotJ>=Y_nXzi=@R<*Vjq9vl%3T-FrvyqB;^s!(1#eDIJ_kP}2Dj#TG5L{U> zFdCgHq3DjRY)f@X?(}k@G`lGo=24ZiDYX#k00961Nkl>cCWYEqQX{>`%DSc)=E1)Lc%(UD>|&}+?Yh66f6~3G`Jfq z%pPh6tg5V(EThv7k4ve_DxBB*=apr&xKOfFFI4BM6&8I0;%;i}I+MzGq+2HnVGRzG zARwrcA**|2YxNSQLL8CVAZ8=9Nm{fu=W#jCwOBrAUF}Mm59A4Z>^XDQ z11se|*L?LuU;an`_y3#!>F@u&AAbKEb-l{NXyB?%Ufz{>Y%7}Glo*tXB2eAn(Fvut-{FU#W|-)Hv|Xdr8HM+LvqLCS9lqKznBTY zwHDf~X{EZ}KVRoVkV74P1&TaERaF}FVpSI13Fs)gnl}vS#4sgx|@5~>2cvN84qBadFF;xsP#zE#h z*EmMSYM*NM5k(-iO2^&Zi}O0nXHKWXjaA{1dBzA8wQ^OtMXm{&i;}XjAV|_19!P_m zJ)9?LO+NDxnPt#*PHZU_-el7y(v;JL2({6$?~uqq55 zCOdkP)pVPg%V2&)WkEu(8v@H=rB%H$lnSde*)-?&h&YZh z=YrBaqHL-%jWCX;p>&LDAD?bwEe?yha!nB#5mj1MP(oA{hGUA(H7B6EySsBPZ!8$& z);DU(_5^r!t;nj%S;oT#9r-Z9GK_34qrt-p3Yuvx(Ft`YNVV5P>{w>8upAUM?qF(>3uPURB2uv8g0_v1 zRg6|#f~KYwIaLaGRrOaF)*BUIURs-2RAKw%Ll{<7m}fQZ0V!QB$65)KyO+|k9kZd< zuX8t|I0O^n)sB$TG`jj$mTN?;b(#-1wn=yUFS>KmEwe1FHGsaRhDRG2 z%`mU$Wj$2ooO=G~@$2t<|JT0pi9h>C|J{#&-*>D!}twJ`! zgtpUTRjuc1c%;E#XWoxvu#lx?xl9%AHr8B%$}B}Iie9EdS&@Sc=F>X65vWw&XGE}k z^<^shw`c+h7D{bHYYBitXOZ2gvO>CZoy+KEeHkJle}zpK5&ZzBvv;kc0)WnpulEB|uo~>tEcTPvCG@an0%uRJT}_?JQXm=TfDp zaB2w-h)#Bc&WJn0S_Z>;J zCY5n}3b+kNCbdJXKQYy6$J7Gd*eck@&Sr;PyigLn4WjC}2bsi9+4b)Tt6JXp@dmkd zTMCh#yW)O#z5fM)rd4nXJDb0Rk`V6joLUQR3p87m4TL_TPlN^*8CBDrpd}RP#svsD z0nUlbwg>%p@x4{WJ)>7AyJ>KtBrb5Z6_^BVxkEu2tz0h2!%-<1tkz01TT{>)$0aKb z0VGOtS80sMtW-L{;k624jL1sV%xgB0t%og1jo~S6A+sO1;&7*gXj>V~+&~y>o|H8d z*^Ud%b53J>CevWKrVq=O2y>Ymld#(QWd}j$0@#0Ltv%}L;?BJW(sC(=Q_8u3Odw%( zuDf@=@u`3M!}rhe_$5@i-EV*NZ$CZHR}Npxpfq~IWFS*XC%XZp<=kEsS|)}znU~FC6IfO@ z!nsO5oNF#PQUB3j`Y-Kr#EAQRaI;zs_8EYxG9s{z^3@dPZt6%>M|HQ-rzU2Ju*}XN z`*?I$uzvqdpys^4D$DH-9b&{}c5c{=EVS`TDaJca@V1DE1!##5(h}Kol2%*`lx4zP z^kvWpuI*f%%So9s(>+QF)S$aRL5#M8xyxp)7gy5Uyp&n=OXPJxD{O#ej4XLC`7LPU z_UP>8wv&!1p^$FIGO4T)>2II#qo>AIBBw_*^lnKb4`DjX$I%8}%QkV1S(TJou9f7` z5YMdeV4ZRttimBw>N+32@3Y@}_Q@~$(yuw+`sKLzG-#PyWDDfzU=G1T!-0A;2i=v` zj(j%mL}D7M6poaiYq{gU`H{c()nD^fZ@=}PmtT4B^ZVy43@kIBk}937EWpC79U10y z-!r8iGp{T^j*Tnp!E=k2{kiT4xU8$38(dT>_1w_Q3T|C62$-A89PL84F1cfSR(msO zgK}_OulK`3Rn1%L_s83O;zD)SaUFM$szmcbk~H&D0vuzU=Lyc+2!KnZd?xc$a$95a9hRlahPc(^Wnw)3lr{)OKgtR;kHtlOF3#W$SO-NS$Jkz=I%#u zR{P?6KnC~Vc5YQNEOP=jj!|pnoMVK!pV!lm=<&w&I#oC>$2_kij+r@{kH1ocevk3E!QRmEXueA~u;d3oeV;q?k zN31o8zz7NMah~Uh5L7eGZlxTlBf90<+^rUOV4V00jmDcU&;T_{znP#3U65+;f z$RR4%hyVq6e?FwlR(%ptWu~sJEeQf^RyVCb->Mp zKyO}s1WC{Vb=5_a+!X8rdO+I&)Kj%)1~K<2y)#r*t;5J*szrL$qPw8VCOL5HY9MH( zg(YK=R*)&pZZjWBvow4=7gdfvi33F-`@o&;HBFW(M&zm;9ODklp?lyYMtN&kG)bjm zwaZ2%vx;E2ooj7*mZg*pqHJH{diOV>x;1>+*3LK5Gt3GstZrazl5qE;!NO{7%H%2! zR>SIO?X>D+c9Ro(dKSamxtb7HD<iY4pTt6I!)CTS>}D=>ELMAPI>gO z44~C+PX)FOuj2qox|wB_kAoUlUY6<2m;IGT=b!vv{o9}X*?;ib=X?d?As0p)?1xoB ztbo@66O{=T#X^U(D>N}IC(;kuOPTiv9&A3us0AdBPd&Y_r=P)^c=-cw{D!am!ms%a zpa0cg^V*vqJRZILV%o#fr=C6im5=@GdDc4DJWo06JdNl&H~NwyA~c&->c1{feQ*!n2S4%*THA7yjEH{rf-lSBNf4pB(9uNgkgtOgl?cF0eci&S@Yq3-3@x2RZi8qx;aU6 zS7vD;EsoK3pHpc-SX}3+K5qi5WbyLosIsi2)#VuH_5N~%)j*Kf%BAvxdo?57!=S9C zVwl6M2c2eC<<>60?BOL_C+Vf7=?k`v%hsgx_EFQFsOrVRn0a2tWu2!v%uQMJfV7a| z(dO$aaYqbc)^@}sDc!n{SefvKhX`)SRWi9XzN!E(s~r?pm3UHjwWR{8RVg-?+I9!g zZ9KfIG0i&zYE4^URq|#FL8ahecE`sSuluUL380Xu{v1#xIHI`JtiY@e!?YJ^Lx+1> zO)Dfjz`{m+HipAptFo#a8|7s+(yzAae0cTM*G2r{|KlJ1)Bo3R)aCu}{esVb{`~#| zpN7#eVW)^*Nc(345OkPQFgj^6QCevGgtCeR=qk7|m%<`Zgc~z&Xj{`PH=YY7wX)MTgP{cP-!`oe|MV7&6UT7wsyIGHWy8IjARZynFdn_U^ zfH8c}Zv`pWZgGKRrh<1zV|!+A9yv7PG<&vx+qn(Vwoa?c_Nf`SS#?{lI@tpC#g9#u z<=&`zmMxi7W?nZFPdi*XvSwZUtxkVe{r{Qz_n>e0?5qpCuC>`+0u9`~DuTbzPsUCX(13 zlh*wGeYFZ;%vA~$<~(XoSCYDd4=TwaP~nlCWZIb2d!$}A5p)4=-u0BE7JIVOhAPl6 znSLBjEx92s)vzFh)uU<_95dMTT1aL+vPetT$g=M0uAmp>;&iZcPT+N zLHi44g<M)-+|w>=sjv+$3|SyEm|=gbGx*&+SV_ zu&am1-4cUF%W4pAj&U4L&cX(+R zFVUNTRrix?ZzwDRuU-opP?J5s=0*SpXW#1OX5sg$SvY^^|N9%^&*j#SXRE8}kXS(% zt=W)jEF5&JajiJVSpjq@f~>A;UjZH-wqjLonW{ve%5K1i5F2vO^L+Q6kGvnp@BIUR z_+R=pzsl+~yUp3~$>-KR1RTGXTANp3CYBJ`Q=_em;EwA|HX0u5;daZk-}zgAYx@_+ zT*;~jnbCdy7Oiq!@9Ai#W;FQ#U9a}J8aWKYpqSwvU}(e)G^onG&oo+uH<0J)b})>d zrl@W^T)RI!Z(T+>7|_EkA_QmiS|i0vcOU<`u~hQaLyKvuq+?k(iw&_LYq`Z_5@N-! z?Q#fte^tAD1>~5$cz(GpD6XXdxK{6ZtMQ=-jcZ{t>M5x^v0XD*&bq5p4HP+*4_7wQ z09ZT=%iQjUZnX*puu#T<<92{Z86uUCMYt}nsz9-;tNPsA5oKTc(|*>c{`?>MCx7k# z{y+IW-?%Ctk-=rw%4|KPX(zTfaK ze8cVQf937r&3*q|SE<5`9xJ=d3}Sj%5tBbee zS?<$)v@t{5S^GF5&z+Jnx{~BBBzW9zx91P^Tb;G*#9V3`fi`I0?|py0yC}hYG~Y^O zZNbqB2mBbf76{$9o0r&9#FJ9SA$GKg-W&6KzzSHr0p)HG&AnQON3(*9Krq_cVSwC& z#_l;x!fEDRVs_r_NVLaNSMO{hY=vDzBp)ogY6?qc{7>_yqS5MvR(LhL+dT?pJwTEg z9*hi~d4YzWPF@6K+0OC^3ZuVdHKFi0^U-L2B#BfT8xTtn=}_-`Tm2o2*ruB3g5E+IilE&bjuk#R0sx%%`i7PsH$A z>zUM*MR@pO#`D}9?$U~)76Xo*+nrtQD>OY}_Ym}~(BREdVkO4?Mzw#^`R4CMirVT$BLj2xJ%kO@UGJla($Z=tf0 z5uw5Wq?@&TO$C^SdLb}a*|TkpM*w5XoEJ+f?b)tdWwxx-+?73>iIWXf6`UxIl@+9{ zwHr3>*mN`V@io$5CQj0R8OCTWst3vwMAL&)&psfrs||-NRhX+rhyvV%tAcHIn6plY zcb7=>D<@H{&;SFb83U>^ESP9kNT9t*WECE{tNY`h`0_8W&;Is*@mJ>OzU%ET`TF#G zZui>lTvsAqE^9Wh(5D+EYt!&(G){p`c(hn(w=l~$U3EV{`0S@&z5D=g|I|%Z>rdbC?UzI^qCSKsle_g?SMCUT`a*KL8##a<7~J@D*#S35<=?pLlLVw{99 z#yZa3pa0w!KJz1=`{5&MbjS0D zXYd5taiL?UcICL;@}9SNcJ{8_Yt8W*O*85CaGd8J6~``}V}3p22*X&O$iu7C=ktRj%>(tc2MO4#H9 zfH4t}8INALi$O(94QOS%lh&At_=sB*G`kw-B${0lxE_+xHR>GetFA^75#wSZG>!@A zlAw_25OwLsPixo=Ca!i4P#6~o*h-(^f2L+c*7wKrgE!uJ7Z1-q{khM7{onnIKJ&fb z_Tm#i^WC@Kef{dyqL(tRBGrq(*(|43i_Xpx$Nyr(KA4)Y73i9;Y&XCQg<=EZqAayz z&M9zObhw*s^wEZyeK#P3H#OhN95k*E?vfd18`R%sau{Lxk}vv6VZH?J?n0PP?sc@b z>z}h(`v)mRj`-lSPED;EE)!ErFkL5|z5vV|Y@?Z>eKrmsX9ODKJ;ShqOU<4r5Dmsc zKbc{#45hA*h>*;kIcax~k`W`2G^SqhN^@NL2d_tiYIY47^@;&T947%Rwy(VdZr)P&pAL(iK8 zpUBvlN6f`+r!%y(=3FtGEk)%(VS})BsW`%iprEk|OK!MYgiJGf82V7D0XciyQ`QBp zc1hACVf|?k?2<$cnGua;)*~NKLSIHT?n|A(gu|@R1-UyI3^^>b)Wt3+R=CKntR9{BvU+vbHTZSIkQ3QJ2v{CxwJ=n5 zHL;GPr$|~C3KhgSt;Q>jN=E^2{O;fLyME2D`eg=GDjX7o4q{HL^#rTGuI!UZyzaYC z(gtiyY6Q!f?7jEHi*>^O@E`so>+LV;b9d*OE2fHKAyp31-85PwOYPa|5ir_d1yJ27 z($_Ik7o@6PwRK(|ykm-N#tAw13^el&fBsv)@f-hl-|(wEeD~e>Fw2mQ#5xl6ymxv^ zNM3LNT@IC&%tng8{77_K-(T-%FCHGdKl_8<{?V`fdH4HW?BJ>**)fEnv8oAUup>=W zHmJ0Cu&}!ChF~r9w5oz8ChVBr=BncTtm&q)z$`w7BW`DJPlvOV!3QMEau$zE#s;qx z3_eVFB1n*}$sx?@ImER=%7+B;Oba)&qs=C!)on4s~VAJ}%uce-j z(`IMU1#EDx55tff-S%3No&@G`Jb|M|18gCvB3xjLwx&U%AkIZY0Nrf*B^xyH>|7dR z>opzV_-|({MPI(2xRrxGNGS6>JMWBG^2F=M*ZU(s&--m4M zJFqTVKQFfuF_RLX-|5N5G<%o^MmH=4f>-fN-o4`g@W1`l|M?&KBY*tA`>(&^>wXdJ zXk=#&eo7MNc-|tcU971?r4dg(7$mk`=4m{Ah$Giy-q1@vp^<3SAWH|#s8WH)2>Df2 z#p;IpQ{x7Os)lp<%1%J4sU2HW7p+G1Ho|RHo^jl|6Tq|E^PSmflU1gh3vK4vs%m$O zxK-y^aF<6_cC{#*(RDS+DF`=;ral`6wfXYya*m;sL8hvAnVTWbZkkosg#bGOf=b=n zj4M{*suff!ca?D+w|8E=*+A}u&Z!Log@pk2eLvn`=6$cj53XjDFsF&Ou=8nn59@+D zZ)-J#IE3!XNgP+hX6}g6__QK09i&*zQ`SnLs|Tw+p8V?WBo|{WmRU`l_c-DJg+O}0 zdS7YgrahammtY=s?(s0YS?yC~V2ONvf4#!hHokpx&&sa4dF)I-4oFofl}B{foY5O} zXO|*ERU)SG2~bOiSjKK0;niinQppJF6u9$VRdHK=J`x@gomo{KbRJU83B!c*JRct3 zu!r#D$gB%5NsSccVZq4ztH;-`lu5(wh`o6!oiUv9qGY-mENi=326JyY$LcHX z+#a{CuC6Elw_d&8w{=vvxp}F8_M%|uX?5=^pss6mE5h>Jq}j~|>EIq9hITcie=}l` znT=GtuP2qCMz*=pTYG-QA@A08{Gilq!9#*FJwka|YDmO#G`okaz$%&5bnvPRy~P-8 zFWtij1)`Y+n4zZ;q$)48#We~=Q*#e-``bu(oircytgTfIFeY*}-Vd;qsHa6k%~`uH zDQ334%jJVugMfyytHAN%>M|KpAiL$(ggwC$~$yB;*LqH6%s)-x?^->D+|tC~%Q@3h*l-9x_u(RbdXG*$%JjDN|{+ zF*Mi5S)S*XIWk;7F&yU5El#OY4r2&&1dhqumo!((Imb^ti#5NF3C%9h&3y_?XM*0l zaCMq;><-qb7Fy;MQFHa^r?v-UCFKC9EsHtb+nG687pcQyZfy)h_0H4HoAOKNX154) zj*vg_T3zfFLMaRMhDDGhmt2B>`4_$MnNR<~Z~51M-Lubs|Jy(Dr@hY|4zvMf-3sq+ zcDt$IeU>=M-^Hu+2Ov_>5o{fJ?drph_jmsI5Bw-_Jp0O@^~-37Md7}d;LK~z58!Gm!;KWMH_ySKf3 z`N5BW->WnG`P=Wj^X#3U|BwH(zx-E!!;k;q_kH`H`BUHWNB_VNe(HPhyJyuY$s>_Xtn@%oiOtPqbawhIo0d6nRi|y=O6uoO>OLS9p(n0?)tOF2C zq{`GDL307laV5|V4RyBMD0OdQWmk6{>&Q%7Yk0WeRi@L#m|DBVxx~}D8sjB?%H-Q{ zcpPYyQaxx|K&-6r#aZ22w794iGF*L|G+NId%!!(O2)iJJ(o>|%8MvJ^h$7U!MZjnSMK2mtAOVH7%mMVP2Ipj1HMuZ`o68 z96_|z{c#`9*Bj5?1?=DbjlcQd{8xTM;rT~@+An%UzJ7H#`e;#4j&-YD5tdmUlVrBF zc-~JNS(0n`V!rG=w?)*xgXU%;*y3COB#?p0H?h&~3FT0TU>Gj3{2E5itX&kWr&w`@ zmL|wy&7OJt2p{rGeBj6kR|J_vPX}7I-0(C=p6Wrv(;%xq{0cap8CVZ}=P7kI?N@WN z75nn4h~r$+R1yp_eA>SZ!*;TPJo*I*7XKGF6rzs}qza77O12HOoM`Vzi|*J4kT>)GN8a;wd(1fD5}gKb2Zj%znYAhq*lN9JbgK z3nbxU^CCfAKH{FJ#e5BRg(@$=Gv&zxvPow|@e_?P006`qI5q*Ro=L`N?}!RBGm`nBsw8Hz$-5s}Q z7opaOPNW;x2dx($`$^yVZGRE4xV_jPe1SI%)<{h%VXiKi&)t6R&Ga$LTeq&B6BQ9^ znL67JFE#5t@f?5l&;BJ?KRi5t|M5;(V%RvL>8aqq(}rFI!SB`dXAc$g;Pe+@mK%qdA(5P6wR-5i+eF7oOLNpNJPBUHQgS(UU!A&3OYFreV{US`%8k%neKHGqq*dM#cW zO2quvlh(}Pm2JVh%X@mLIOtmAX2TkFxVL1gtfDQGoW8*d3;dVGcD*4B1ynysm6Gy2sSFvg{; z%Jb4hCru~<)lJCbsJsLANB)c7_x8ts(vSVMzx>YE{XMTAU&^ zlJH^M*qkDC-G-+#!seicMwzJVi{HcuIC|I*BR*V`kIt z4j^IC)jRJiR!i#Am>I?Fnv1NI;Y+1mz1&+9#zHr;?`9qzg=%K)=JiY2?RZw_7FFt4 zhq|lO$mO@$W2$9DBRgpfwB(pePK2v8jUCmkN?53Q#Jbk8LiIq?o{)D&fL4209$4<9;`Z+ov$9>+h4$b>_)gxACU`e zwA9_p=Ek{eE8H~QAZ9AWI$D*xoGzd$r`_n;8h-(ue(s%}$L)6B@3d+2A}*VY=BWQ9CR9czD*mB~@L=F`8nnJQIY+DkZB6J9ron0IrriXRAroxH-gDyM#%W z4kVsNvbyYYqs_@!Y8cD8+S|0xG_W(xZHACWOqDZ6yA$bwC$QbHGpoxZq>|uf5?sPMC(%mlGshNrlD0_P1D`RnY zX8Us|>i)$q?DpQL{@}m-Yw`H~Z+_WNOP>C!HyK&kxxzfkScYNXfSKs-=pL_ZGhjzYqyFI@>TQ_u8 z^G3KMJIgX-!wMiHIoVxZ66g@|f8bMbb2{&2tF4{tv|`0VQ+ z`^?|e!|nFY+i(Bf|J1Mfx&P!p^TXfseShx%_s4$toB!h<{-N)C(tqVl9z0bPcTLC#?e?Zkzln2w%?PmeI0*)!!1bwhGD zDhNqx)pbRbjI2ytnPwEU=Jc!@vZf2uM5Aet7ioqXK|)WETpEEwU+py0V>Jh@x@rOj ztEDDKQlBCgP34e%XrdnfGu%f>feH|*3-R0H5CI*UEA{*&Xqt7?gF^G3uRD(8t+!t! z_*eewCx6~Q@Jn9(*mphqqOW=LqaUmD?w81AFsHJs!UOFvoS8N>A3E7BJ8ln^Weg{J zI?@1(I6P`tEM3B6U@o`GWJVmJVT6p_n{_EK^Lg~x=KJZ|fr|!#o>urS@M$Txp_R;0 z?s_aWUFNCL*+4lIVt6vhTmu1ImQt}s1r*1K zG$FCeIRhQOFhxbQ7DntU&eLjrc|#bO?MAzCn}2ka7qB6Rv72^Hw3INno{Pi;qOL*i zWozLDHM*w!ASMtGIN5WSnO*NnW6l6$Qc5!pk>*1i3)o!6y+3TXp~e&Sp~^Kv#WmKR zfWcHQ*hETzr;mKZ8e%Pnz?kM_1GLfBM9kgwvRO4?XgAL;nPVE0q{bB@o(t>PuUZh)u_oQ<9<9#(XfQLQxvk^ekLWg!JWsbM zlVy$!JZgMHoibCs7cASdDtxdQ10Xu@-Ro19G$JRB^YHE%6k6MpZK}Y{*~|f z!5{s}U;fei{dBjUHcisNYpKEn-JWa>^B)O7*ySG^HPK*o*3=pU_$|Nv52DUzZ@qPX z;S0X33tbg%GdLWtx>=X9 z;)mHRc1ppg1VCMLlGVuZPnoI~tmgbMMmr9v1{fdBFtyA>=uUE0)G9OYM(^@CZgHDw zOe4J2wRi9A(^`zfyXAB@YzI_X*SoqV^)S8^P_h=?(dgOG@stYaDQUBw@EMS!=s?B> z4g<1=3^OrAxvb_)+k#)dA%pEoFlzGEGg_xdIQ^(OJg;z8osWBGosS*|{UP;e#jusF zb?evX<0t-(pZWv;!zaJy@BI6}_pf}jA1|sOVKACFFazM46!S6`vo#Cgp!|4+D#lxH z9_lVBj%WG!xNiK^_xz=ge9@QW4}a>NkNyO#>hr>O)8QVQZR2+}XG814>`zVK?00|+ z(Ia?{o+>b$J)AgzPeY4F8~GGRt0^KDfN-BID)mBtAX z5Hq(QtDndWxpVpt)IeoifZq=Hdu_LXxiST1a1H1~j;ll$Bf;G-drhi4BFQQiBzYXZfhFP0F|`|+f7$GT5P`dJKyo8T^VxJPsqT8pvAU0CU6ZZ>~WEvb%JmDy;K zXPx1Ggqy{^s+-l@X!Q9w%Q@uhVK}O*%{_eW>MM9qQ`o1ttvpLCkgA+VYv1ogL>%|W zGnOmQ%rMolz zzL`e0nd2S+$it?zk_17gPpat3L&3}~)|xp~6PhTd+C*D4mh3@ai=(_>8!xJ46aPXZE_H=C-N1M2->% zp=b0IfxgP8+rmIpW}~`wW=>~}VV*HGxhtz1A_Jh&e2f$lvr}epyA;lOCPp^)F+fkI z5~Uiod+rn0C;<-RhfxqbeFatBDj#3w#fP&V@yW=p7Tw&hOz^M|dDi*X8}EGnGoShQ zf5WfC{?xl)_EXREe0>^#qeSaiF<}=|$Y?&5RV+9JLwi{x&QkZ|gI+%mJ@@m+e&|y_ z{`vfhU-r-ai@*Di{R{ubzh@u+s=xR*KK)mJ;PYSDvculIt%ok#AF%ToPvG$a&vmKN*qLq1K{Ib!$8yHm;ANiiY`QxAZOf;VzXXt)dXOC0V zK%*7r+&fh`1Rx;Q9m5YZV5TKqGFvO0QRhb3-fiuII#a^^%<3ti8+SEE{F|#B4VU|X zJV;?K-sB2&I-OK33!m8JpgB*?%Sm(eFpw>-nr&aGETak4b=}tIKpAt6nM<__ylSIo zft;6XPTLr}5h^?^?6Lq1%Ux0?$F>7tI(s+;Vr{I^e9dUM{C7=?rb0KxuIw-e!|!Nk~hBSBjHeVJDv`OZDueRs7?o$If(I)c2=JERx==6a5v}WH`%#+ zq!-oJ(>6$}pSU-YY#;Vz(I8%rD8aceTxmgnCZW@P~sXMC; zcG*Y)4U4c_ZI>(qc3u42DL2j5vwW6FCe`s{CX^JLh zI?(q95S?9}aN;ZwHgdR?vCWWs3yGq+9duyIvg)d(HVR|%7-h@^)U_*&X?nJ5T#3Q% z=@A>n-N(#*S`tJ8-E(#sxd!MOfmo=z z?y+vL>uH2I@^w$>41fZLvU%XlZ8^vDU^BO4mAWaHq>`I~ICHy)z#~@f`DB^hyGtq* zx?0sXWqEPT$+@S;%yC`yyA7f4p@3a3UW)GXzvk9x>>TKkq^;Wf(WlfYx5a29YM>?@ zD0;Z*vWUuhu&rt_3}zrX}@#_ieJ^#^{}@4_2jvLEl(8*QT8O~ACG zWS)iUzDO)S(@l4f*-3M*HDxa5*tz%l3cDbYtqB#PhcRz%6Uwum-7H_7_vg=FY(D=T zzx_Xk+?IDr4J5W&s@4dInv(mg$?oFfG%kTb7(bj5joJb^UmysZbLPC*Pk`uIe8#mslS{P(L#q5Rza3`Y0L*1(mEF7c zc9wy$4r^7nWZg8gsQ{Z?0>{DzpM|V>;d7cAf2+@62W>V-#4#|=Kcl*0Y-0`V@fJyb zB_6u%QX$)(tiW@p5vp;0W1z?FS^KR?GX#l!e|-Og*DqgppBLyvDOotBeJrj7$@kuS z|4aX_f9U)E`d|82{;mJpX;L8v8+N5F*>&ZRDLsidPvHm%m|wpoImD;xn=`v_x5wB0 z{H-_t@PGBk?mzTDuJh3@G(S~Um(@`w7o_g)4)rL~PAvDiEdZ0vnZ31p7#vUciR<)$ zYYGotPE81o2Ad9$XJ%)LV)*>q>Xnyy1c=@_N5bi=L(eE{!Hi~AY2j{|zXi0B z;lL{#ItA*PXT)-gI6})w*7RexUhn&O7<+oC0Rjx;5MZ?{hZifesI%rAoz-S=k8Xu~ zEO&R(96qd@R#msit}Y>kom=yrX-=kBB!6~Ul12pG$DtOJ5N zIVf?`5BKRnHj7yIGkd2A?ercT5oL7^V7vRN8AVsa46Iw`=5T$e*OQt`uOU2|Vf1W_ zt~JdNbg(J&r2+T@5esBYe2CYW+h`3)r4$HQPpQ3xE|}?ZUR~oro00M`Um7knPm|cafOogM7syFvLRB-Vn(pnm^5d(<=osZ zD*JUqgTT(LYF_s$1w)bt09LEjojqm8*D>1X<}pWYzb2Ou&2kJubNCn;PN35~MjNuG zn@#cTCEhtnniTMe1@%>cH^100EV7BZJgSDCsT8lM0WPI-IC7JRz>@_LV`W#>bwm}a zrqh0uAo|4|6KDfYnu|{gw|?t)efmd! z*lRz#<#X-Mlio6vs7zIfowT#d-P|DU%)XdW(@sTi!KND(T#*epA@?zFK$ zx1nvU1DY~UsI#H$(%`R9=b3Jozrhddx2o&BO-8W(!DAtfhh92@fqi_9?;sLp#PQ)gn(w) zUFy=D&Kt2-k4d-s;dY?A0lLrl>}nh7E7H?fJK)$(36m&u!!USp3AvXT)f4W-Rp$rF z<`pJ}qJIsRpHA3g(Vai3ff0@`bLHUCC|wnh-NW;TyW0S5EQxA6is z$UGpjY0^{tMABg9tSTh{=5z@X+zfOR=T_zRp;NJ+`tC9C&!Q8$SP!^p`Ln`HlUBcu zxK5fzW3`Dh&FIr+$)6gXxzK>drznJ(*_y$u#$99ARR2;;##nhd8PqfSpVKm>*7PAZ zY_f>g7t}q$X}a~3s5)SeJZlccQ=!~OjsM4JFo^6v)*9vto9%311_SeBKs7QDht5lK zQR*Rr&cv{^eC zL3CpZZaL*y4$0{@kx(fK4G)J;^#oLRu>ms~fdnzb30CLK>#xMBPlLpqm|KE~73-d9 zZo7)=t_*WC89hAot1BVkZGy3shfa)s`gQoftcKOCzPKlX#)^Tx-% z;&r}muB=_%orTtnwr_r*tEyHU;W5N>Qn3Pd9LF>B1*$V^7nRNchg2Du^~kK%8o{Uv zT-yaX+^#}L(;;;NqfB$b&Ydx%@L>Jo)90hRjmiSwq6kcl!a3$HFR-6G)m;v1- zN-uYR@cAEk`%6ChSV=h91~+m16kQ$8Ve#D7jk;+djS0i-Uq+5qU+q1GkQYS9&;w9-_FCa|ly6`#* zM#^j*7Dtg`8-6*MQ2qJ<*oY3ym)nX*KC&NB5-gE#q z$9q9Okg3{@maA@BG_8^vNIh+e7%`NY7Wj+U#pR^JiT>i{qxe^34(? z8~bZJAhEQF<$fdo(O>op{+VC)d3 z12oZ%WV7Zfy>A<%b3C< zjOI>T)#@itT13!Hm82}fV|BK=J)DN_bUG+inX&71w^kWUqdvt_U6&WA4RD_`W6!UN zIgAVu2i+8e%DaaTImPHj z0dRAW^MPkwhrY^|S!p0YQrCIjZF#BhwK4SzPcs%8=++mMq5FOgT8!qhA)Aua&eO)R zL-fvTL`$1Gs`=~e>VXQgZR}@g2;Q7aoSRqm@+0Vt4yV!b+#U{*vbbEiG&eQYS|0B1 zMq6vmkj%^wCbFt>XOB@~dH8bD&DIeVoG^15s>K{CnXNu6-Hm1fecjLmToM|4C(y?cag`@?ZWldA=j-Hm(UzLDaj(F7EHI_A3ne2? ztvcWhJ#CQV80sF;uV#8ZZ6HdG0@j%`GI3g?ZTvEE>gL& zbB~c~=}_}E?L`>E2qUgpG`v-Pjm|D{P+d}S9;Chqbr8(_;N|Yxif3=W@$8+CoHOlb zac$AC9%w7vTLP=H)qC=65r;>lysFUk-21S{m#=>8Ge7*9`si2vv%m2_{B^(O|I_dM z#J}*De&BEZ`1`)_c3{;j?-SM0VjmS&eaKgGl^@j&v-7?sn~QyR3ocmBuRu0x#hQ|- z-lw4qWZex6EJ|@4d)_U7E@NBh;V8P>O;vr~pQG2lzx#|2tKa+J{crhefAcT=Pe1lE ze(o>+KmL~A|I7aM|CfF2t3LIqAN&00zpyeFHmPjcdZ=z^Kw;em7!dB(C>7ccKdg4& z3&dJ6VacxE=g#wSzdrr8s+*GAn(MG^q3OPMo{-#qxLLmeZ8#! zdywSJ&RrrEb*!doZ^Autur6p9X7VL2^Q! zhw-+^?oOSrUUluxvg3I6?2U)x*?q@<_vik~PyFhi`NeNP`?hcSlOO%+pZD(9{Jng} zc)SLyeq-x(?meqx-N)pvoi6P#BgF!M4qtoo#5E~7x1!ok6`)@31^ zrU4lZ#g@Ti#4hK!2d-%Z#q5M}3fpMm6DAu2Fk=1%8O`;0v^6twoqxto>jvRHFxb$THnh`ib!EN48jAv0K zx|`J~bQ{{u5N>q3#X5kth>`#|cSMZAXuvXU=H&roT~>7}chY}{Oe&xBqOL?1(k zMOC{Q;EtiH&g2o7`*o_ME2|R_c*%^1J4u7as8G4tO_h4i(X7stXvoTOuI)yc%dG9v zt7t~YG&jwJI6SI4?`LJzzK72?iR#QwTp#)s7jTc!{CL6nNLY7IiI~|~Cgx8KL791; zr*euiK@xrST~KuQYxFnB)jjLZ>hjk8_~K9ez;}Ol6UREba(c%blx&_JJb6lpy3Uex zO=cAYWKVP^8r)6Mt^U1#@V_qHpS^f%fwzSq7H#NkgjG(7XsqSx)O4`5x>?Owb7<+A zU+jICP?a>`i7-ix1qQmX;lhfPC#n-*v!p+CcYS+Rbkfe*l zJ1>%#{dVRMylf&aJgx8uD`>TBnaN^W!_NDCKYmcPy-V{}sv~^r0_9g~4`$7VBf>3= zOi;QyTdq9mHBO%Q_X-$Z<{eHRccPVaL6QsfMsuL9BW8#BRIOvum8_<*s5Dq`#qIX| zO}7JZHVz1T-_MuYrxVA+!wBbd9SqH;W0}O)FOk)ST=!lZ9>(%WZ4-^0T(Ve*f?O_rBt1{QMvMw*U66+Y5=J z!7SWI`m)6jy;C$3TcWL_c_rwK6XhzZ3I%I_GXBgA@j@zHHm^CfQ-n1&(cY_<(P>7b zyPi_(z2a(B_V6d;xFTYvbT)qBh^hAq`V(rp(OsG1c!9erhlbdVt`2t^=}tGm&0?Qt z7{_ipYvwftmqe#qc7hH$!IoujUzYEpLzwUpBF@a)YOZ>@(H3ETIy5kjQH zokTyrzJKsuKE8G^hA`8FSxb^R``o9|jtE`t3kHt<1ggzvbEW%2_llV3(8D}JKvhz+ zVzSkM`*F;JOOkC|;qE=B$SXQyX3VP0Q)5SgQ8wgkv$5(7RJ&pwrKVwdRPWrUo7=b| z$F1HK5tW^ptt#lM0T?D-Z**7Z-r3z#QaSSraW=?dAGMibwn??%7ORn2^+Xw0qxY^k zs~$8>#IC!5c>es2w?DF;Jx}1QA)POgmATw*!QQX-{qgnd_m$^^#qGEOnA@{TLa5+` zuLbqlE#Opl_43eEp1VVJ-tTp$9jMG*IXZWkF_y=IuDHR9xaPMeH|Dv!v%tMiNHoh# zRJj>0C7mjv)s>X#B05Rg?g61dcbW|sl5QTOasycn!@i%Tu5MLNj3LiEd|H<}OgSWk zEC+l|B%rIZcJ0@94|gKZnje0OnD&|HxpQwD8Fg={-OR&#R8GLA!=2+r9Tb+E(@Nb< zr;9WXwGG?CY!PZ)LT=YJS82{@SFDLs*!Zz9> zdrp;cB#cQ48w?Q(m=%B+lc#Ld^|3EZ57cZ_GL2b(=SWo6rLJbrgW0Jvk!?YjKN(&J zmPzZ{=4Oo94h=4&n|s7H_ar>r9bH8;>y*uvmE#v^Rqvj9`_ia5nAH>NX+)li-ZZtX&6OP{r}={NVGS`jMBPe)V(yxqt0n z`=&p-e(KNu@4xjsKKH3l-t6V!V)fot&F~xPH>i89h;UJV&f8i4LK1Kkn13a;MIWv%t_K`1p@5et6cQ9ID!4b={nWq6z?|ae#Jc|W1 z_M;HxQGWFO9w9#t$}Pe?6o~Qrw@X`XS>1cnVxOCI7+a{Sb=+q0GUMZ!s&;d^w}-;i zeMDr}!U8dAn4%D7?AjG>zNV#{5M>l(V5f$T>k$O!bdC$mD~pji=oZ;C%^Ns6R4}TZ zuGoIDAWeY#0$W`)8Z81P1;*A%F#}9ty^Z(0#{x`gMcKqUB z@Uwp8hd%ZED}K($zy9yvw>V$F!s|NG%VS)K`!UheB_uN^tzfZ?&J|G?xgZ;w!4A-+ z8iI3;qY!4qayP&XVVDJA#w6jSV>pQr8g1cdL*-d&3=zM8i$T7TPcRW{UTh^bB@-Lw zJ^VqpZImIqNp_>06BHEC)zug|adJ<(JSd&0Ds-zR6o6|8&Wk&3bmui^?VM5$v98X8 zA&pJrAf+x^&tPTP(Ir7MA3a~6u^U!r?(WBR^>H^}U71ylT4o@O2k4y+A&zGP zs!E*=q@h*!nH~}Xc8m@((d$t?&^Bfw!Td=g(e$hUCNquw#C)cXv$xBJtyVBAv1gXh z0#q0G<#HmGJV`Oe^Eru|5szqOcwZ$FRe%e?Fs_SM>HKZYrifC3Rwr1S8+F!gN`0a zLzP)Fqgng7dwoV-*`2jB?>&DSjYfEg)~K<5d4vP!d4`#pmpVL()7_L%*W69yFtb>; z4w0ZMwnUEW>=$2Qd^@k6HIn?cB3#E`iFnh+@WnfPnw zy$0iy*UxgQrg_TRAxc*3@b_Q6{GzwtHhu0-{pr6T)Z`o62&Y0BUTX6uoxY4_*5)+t zYfYmyT{bEE5oZ+30sGCr`5Se7^!A4DdG za(CEub8mO^zA}(A?&?ByRWr<7u>!z1ebXPndbb*F!GhIH*n01cYA_;v*)l_zTg#l? z2{Mkuk7seLbvw{NckO#VKCa~wYFBm7gW-OVnl{^MD-uvog%zxtnfxvM?DReiAT9hL z;TAM^x?{pEagBh1lF?%dPNc|lXQ%rzSdfUw((CilNjrC)uRBj)D?FNJu%fNw##VN6 zEgx3v2!!b9Hfd+OIWC-gnN;)wi6G44@L1j59y4T-$7PK*B)r_X7QEpqDB$4p2=DIh zJ3wQA)>F7^4h#Cj@$8M;!yA4)bTc>b?E=K?uH9ljvSHlGm7cUB(DljBQhk z3*B0I->=^N%C9+JKmOzY^uGk_Fur~)utb^Doi%|T0l}ut5#Z{R^Eq!@Of^Bn&0uD^ zx&Zf7CGxL*>z_W}eCvll^*23U^trFDZjP1=0_N@uhOXASvEKU}dhZ!m!p<>;y2D9Z zJ+4urVGN4cT}dmN=q*pcjC4yid1FInxCpQkY;?-YW_$6&397mx%rIhz4Ny_Q9@~Nu z-Mpj+J*i%U*@JnAJ#(KDVTPKaK;8E#a_`EN&xW;63FC#FU=hWvG%pW|n3bTqbC<5d zmKwjSvKl&`J%91$TkF~L9{YA>7$I|8H0ylCDGj=brX2q zazGke%F4{9xu7|}HHOwe_YnHNcUMvEu>>__;BnkoEzKRiE*Lyioh00?YQxQzxjTe) zyB)WP@Y)x73N$6q7moUhh;+B=+Rb~sI{a$f{@)iS4rnZtSRX^XS$cDFc|sLXN? zmrp##V40^8uGo8OC7%2xTjl}oTH#=nrn2?BSB)QPB8N+|4#LX!cBGWsjMBd@5nV5en}vB z4Mba|977O|jj70t9%yarL(>|mCtl!iIA@N_)|A`N`ZyGaaiL~s?JAghV`hm$x0xuB zj*%iw=o+TL9EEt!{!{9OM*4aL3c;7tGetSS!_)i7wTLQQ^ym zp$kA-yLY(V^tm7Y)MxX}kAK5&`%nL#fA-h?g-?Fw+rR7kpB)bmt~Vs65GaBxGWVV) z^D!q5Dm1(HqdJx98c($?k4DwrLt~3)%k9D4tEJw2{Q@JT z_rO1PrhxlCN3sC1>-Ev+i$34={cwN$_D_B4PyLNg|Eyo|5B+_={2#l&dTFwr3eavL z&jBV1PLmA}rL#8xIlI`EY_7HLX9*~)DI%h5NZ~mAyeDrKZsDF;?si0AS_0kj+-D|% z+8GfvHg!9E7rH2O*wSFe&7V?F*UrEQfqmjaQH%wQPZ^HlRNyp<4wyB1Dr^a$8$zoh zoQ^D!NL~H|0BC`p*|HH1uR86gJW#9WXpBkU&&x$%el&tzdrXx%O}DKJ>LUVHDqsU@ zbkef(AWbSKN(T^!`u>`|`(ATQK@}v2Vu~v+T_IH)Xmq0<4Fx`BEvx2S(&M+!tV$?R zo86VW_8sh2fn7rFd+z&L*(_D3>i+uGRy` zAK(noB{a_ao$9NU=YlkWlFxZ`usGxRa8_mZh9FgD4U~IUBes>$Qw%%CuhHsRX0n>k zb61_%VVy&2H4-_nIuS4S*6TbgE8O_kAlgz~vUh z$E^GP^#t40tt%dF{D15F%4^OS?#_ zHlSh?9VnuuM4qz;IZ}P^#v~P51qdcoyU7RxB3$U8+JKto@M5=LY(7&qN&`h|W>`v=eCZ|cWUNt*e6AFtU{OS+wF2F8_hY}O!6uMB59u{if&$HOtyYdm* zUDfKUt;^R0?Z)`Tff@lBS?OG3J$m+F zh5pt*|IIHx`cLd_iTtd7VXz6D`N? zJe9kZ?DS43S=&*jR%xLP)#q*i-R@dP;C$UP-j=}zTdNe@!;Wow;%M zuIgPTSj$_;R-K(EK(XiGI7_J{6ALA2_g$8bwoHM_esKMzzwqbu>2H7e-jC9c?pg+) zt4p<82cgzurfhM&x!!u`#f!IBEMs-Z*-%H8@2+Zh*fpCSKA6IMwXB;+)#JdDfL2kx z8}!MP4v@5^sb_#a-XA%p&z>1St3(Mk>UM)ro=%9JmF9j8wP6p{_$8BNUen$5IRFkwYRMt9<6-%=Fxlz*)VWh2zeYcZ%+<9gm$L+<7H`l|9 zQ_RxNt!lG~U?cDMSFc~b|NiH`u=k^TROe(SvdY|OUVG1_vM1Br)wQK$P~9ebcDupU zD$>?k0I2~KjIwV>c*C-#o=X|qbU*JPY1Rgh7{t&-nFPrUVpolA>WXA0P;y_I7~x=z zmz!|}&qkX=pt(y*?c8@YNB>GPYi`44haFutsW><5-jvRB0~Bnz zqni`!pSmtz7ZRx_#3^5)zT8dcK9#jI-TjDLc2m|}$GTM}$s=s8#s*t)Jhes`8*mK< zrK^lkLxr)bnVFjA?5ZPT+DHjxZa1Sb!i}cZiU^N9_xNHV#rV*{s&aU&Mf2nU4b;^; zOWNiZfQSz(IYyMgl*U8j@-|$~)aQelx<1K=yrT2l-VhOQwRs6<(Nv!SVQnrzW{%kR6*X$E#YSiSuG z=g;@P|E*u~Z~umW`PYB?Uf=#5-?P?w=h=hqFWoJb6qI~8)_o^|Wt=kCSP#8-cKHfy z$v`7I)F+XWyG64~O&Yc=3JJf2NW|q;-bA1Ya}8>Wtn7$5d{u6g8Fx%!su~_;-LLcX z6}RVExqy^g*z@3fAAI3QK6Crj5B@NWSh9Ny)sxZ?WBiA9y`ylDHctD9FnQK4fZb>c zu(cxMgAZP7S;Vb(9?Q;sg8r~>9B{Y*)crAiIT_1=>R55VHzf<5JIOG}&B4dpvFO58 zkxq8YC;QbY1lZjgt_olXnABy4!qvx&sp^o*lE(UQnYnW8LFC zCrLO_uV|%-G|xKe*EVQC^|aK;>1I(A^3s))%N|%m3`Z`on+dKY#U^AIN@X0N?!bcYfN}+VeLb zU%k9n;`1LUC`)UT)rdBU_UXA^)VyBfzy}>xNcYtOj9J^J-i#OU3+$OnP3Cv<#*?~O zVHdAi;BpE=$r@d^ELc@=Td+uP6O46p&-loKf>VmPi%!D>$!ie5#45FWd z;GF>33__QhOH^cE*G;JVSCrL$zYH@J?D```-Q*)aY-9!O69h|%L4%dU2P!f z6k!EgI1NaD`^9sd885~(Y7jIPtdhazm^~>8r+1$A%q`8l(@OaW^??A=AJ)u_N^lYd zFwvGMw{C{$w31-hyKyt7yrylsL zl(&#MWrD3RZ@)}e@aYa5$Zu6+P?W^P7XVF*~)S(PUVn&+-qi&1QAmAc(x z*J(7&mF_Yj&f7zS!75?l%uKW6{`!7<_pAQUfBFaa@A!W{fA&CiH)K}Y2kky{yoO91 zJy|m7>cUIR!NAy68MfX#_wD)d&42b=4(vBS_NC|R&w5yHIIczrX}e77fy2RE2g&H} z+G3<+(|#f*X~E2z42&yWOopPgiH6_J8nmJKXJOQN2}@#1ZgTYdtB-6CdHzi0jRSa)k2TE#il0+2>0%; zl=1Wx`>b^Ysv@F#s+^`)2Z+L02W1GKxsOfP3yP_1BP$SQEah06NH*nwyPc9Z53(w^ zR^0rJx1WKJl}Is~1T=E<^M~-8O688CwA~LN_p7_=Tr2GGsUwv$x0YF{D$y)6Qx71> zXsF8J?9d+guxclv(s_IL-PiAa?LYj>e&zjxA9?1-{XFkHk0L`;MCA}Y08DW`HRBQQ zIX4NH$AB9pi@>yfuoHDJe%(*`iT~zr`hWZz|LVW?(XaV=6ZqTY;g;D>oO?J7&-~%R zJ^c3Ub*C;nO$w-{!Q@ z3$CwoMACJ6w!~?`WJ^#VVREa&t_}}?_e>{uRZDI@4d_&Kmycsg9;T!>QX6zb&!sa} zMp^b=@ld%18rm%8&=PJXuiEpj&ezyfFp8+N);g-Hlr~4=DtZ($)NaII{f5&f z?3r5zi(!3C1tweaMNkN?UYS|dLvuo*FzpD+s>$@3hlg<*SxXb(o9qkfYMp1t_7(q{+WEfaa^XY6wtg2qlwy0DD^V}Bea%LDBHsr>xE;H>-_sTMJ zGR{74aceZHJ=Q2TohnD&w*wUsZA&P{?j#{&W=`^vUS z*E|KFp$6SL5*Bz>u{LGa)Fs}I%YhP2RpyqN?h`?(!3KnMiR-)qr#^$#Zi|pG($#SGbL6PO#H$sEay=)jClWgaVb4)EHjYFQ7Ss3ez4YRw)%w=#5E)YHO za$OvDQ#YJlGDuEb{56{{!NCg+o1vfTnkOj;DQj>)nEr_;H2@JYpNP669L8(xL>QGM zN@#S9tbnVg;;Na85y)984|6WJetiAl&wli?Kc>h0U;JNw^B4b$U-xJJ#;58>fAsk? z)BfQ3dUkI+TNV%1WoRo-cbI{KZWcQ?U9^KLsLTRQCp*?Ky47udp~QFfEu5}ho4ibF zYuWvtjMG<4FH~kr7GXr~dmcv=1=;So5T)7b>R54tUVWzbirqTu5wwpuU);EE1J)Yk z`Drfp6cNxIN=!i`2EPlVaIcor!>r1Whiti6bwaixa7CZ2c7?mT&-1(roQ+O99xQhX zDZtIn+!kCOT^jHO+2`Xck<}P$p&BjOGOI3hTLh+oWk4B4B5RwB;BKuIRrQorpB`Kh zxYWzb5jywpuDK}9veX>WdC2D@FsW;TkY?;ox+@zhGdJ^j>aq&}+ZqzR@>)Y^rYZ_Y zjCREtMyZ8HTCVVYc8jbi+yG#$W$&0_ag5A^1)X8A1~ZEx7kt>G)DN?MHE}dAIx&Wj zI=}D3&>038P*+O`M4-$cz=@Hbb+)q3ANal>{Of=HuYdbr``+*RpZ@B%{*T}B$xnXr zeE-uRAjgZ3#k)W0%f9?e!~NCc%g6Ke`MJ+NTSr#{h<1n-UR~31wt`@cwPA8kqJoy{ zQfH>!4m09Ha`(UcZJpIvWxkrZ%50M2&!KhTZ${fZ1`} zV%Td~}pRSR~r;vlFl2ZvoQu^|9l7xKcyS_g&ZBnZb9z?!Y9eG9cE&n-e?_fKz=*5{M~oxx90jpM3$6LUgDIAGSIG zeApduJ!Z$~SHOiXoj5QMc)<0^$*!jxBW@h?lwPv`^~8SoF+c4-AO0WLe-@rKFsWn! zHvxPTz)$+gKL!3~?z7-w>b{D|ch%5^a%UV16eie2v{7|x1IPOKSAGJ(?Zw+Fm}6Ka z(Dh=@Pjvk4pU(U+HvkB{K;q+{_)6dz8%F0PC&SEY*W}I^PmN}(6dW|DB%_rE!Dh{A znr@=%T0`6}_DE9lF>acv%U8HZo||kG8hvR&1~X42+bKXEVIu=2`y9speIZ(Y);%z3?!Q#3#t@R8dy0RO>n`5mV{+&o@(MT8w! zaVl-Og%kG{3G?O4r(d$w$}*J^7Tz-=bGtzCvp>aB%S1_&1)dMC1*tKFDP5D#V>!Ct z{rFdW@I&AESHJ&LU;C9`$`$eSsJNaI@?!zRwa$BkCav+n1X5%>1lJ*BZ%h(AWXH@1lp@ZWzePe0X_2p0C0zF1R7p88rAcFjsDd1AtTV zRGCLrnVDt7Wn9jNl!^_k^{n6c7y$D2?D@^Ee{RjI?bovK@ZrmDfBW*e5{LsQU|PU> zYo^6jr*+opU+?qY zJC|Xq)*Iua&E?BL(_qM^0pLOhUNs9qWmmPi^NRP#hsIw*p*n#!^JA^dob^8U`EYxv zn#Fd8DoyjQa$S$d)Y_6(wQ+It*u9N$9c>5z@pP?n_g0y~+NMS-1A> zy4{Az;j9{oZP0{0N7e3Dhk11x#<+js*^S(q8sCXEjxSi0&V3FPB7kD&S>ax(?6bjV z4=hsV;@-COKdfO22icOopLYVc}KN_B*(#a3Idwc4w)n+&tcqN|16dH52An)oA1 z`-sSHb<-oO;|OZaG@A}@uadmY!sbz5p~~6Ulx_4vncTd0H9bIeiO{i*LJ91~u~z9a z+Qf=8GvH+GJe9p3Zd5n4@8@xZIwQSwXI+yNeq zM#djOMW(zpjrn7hkp83QL`tHVrHARt_=bpwzf?9yVMM)>G1 zf=u;52%AtgFUFOunto9{yOUQrnW5U(s!ohmr`udT4efIU8Ek1{Uh>NTbzxJwMuEt_ zYI1mq%|i=ysYfr? zZP9%Buuj8Jd6oN$M%6}#rp3`+St3o`&X7S>bv}E;KJ(rGlivE$|J85%y>EW`C%)s` zzSEV*8#l{4W~MK~L#5p3jkk?^gJ#+wn;ojwVNq3yD%c_JtadZ&-mrkwZcCkAwH8yU zoyR&}pZ5r3EW@~5eQwf0%3X7BXgqu7JDWgQq>5L42q8Ie;12patj>(JFbFZW`RWP` zHmgoEL#b^fH&N6So|wtmb6STYP<_@8ML5)5VX$esa;Q2T1S9OsJ-j;5&2jEc_wWTr zW;*OVPo%Bq%bV{%zIR)Tet>Q3;F$np!fu8Lf81@rb6e--jhO#8Pb zP$M%Y_|tyIo-2@AfS4{EaXB>Yuaw<;yR;hDV`}*?n6pd)z2Ul+!)v^i)>1`GU3acVBp9 znXC;))`WsfFdr5ktWj!T>>`<2?&DgOiCh!3Aq`z^WK!OC?cZqY+<=4dU~N3UeCOSd z)$L(@^sDdt-terlHeXaKj0q}tyVrOGa!mr?0YT5c=;Pn~&ENbbKke`N{1-lF*Dxl$ zR8CF<5v-zASK&#wOb*J!DzlyO#N~0ax?@Fw)pt*DP0&jYKHXb9uMUKPj;^o4^+SA&~y{@;JgZ~C2|`OzP`-QG4I|F!xf`D>ROPK#Lf;?nv7+_~(Ls&noR-z>!R2#+M*`df;|x?k!RZ80 z?grc4;q>Eyu6*An{+&K-?OZtSY-ozEI`Ny5%JIO}SX=v*A65@@>IAS)8m!_6*XdvU;+KE_KlwW!f8}3!e|{FR_Y?~`^CflU zqw3*Mj9jl(OEGI$WcTO&DRo84*nP-~vbBIo=gzH>(#goS{h$^nLaSJF;t?8#P$g}C zti#v8`rrE>{rXS-?5DGJT!Ds)E3(wvW36V1QZr6-8t}+kd95$M{^`$u@%z90`42y@ zU;c~deehzf>=7=8-6@C>$sY7}?~Eh^{vHlR8BP>0-|E-z{o>o7e)*UG^?&Q@*Pnj# zn_tE9)ASm#i0;lvZhyUT<{o$|wtDt&X+#=(n zx)rVMSg92s`~B^H|0H`6jD&H}URe%;BeL1Dn!xFfNWJf5Y+7!h20VVW$*7fp*D8K~ zo^S78{;U7S|NH;>|M=zK`tM(n-@g6^%kGRT2N*13fUMxVn<4!(3@pBAV9 zPJa0?(0xk1>XPF(@Ar>C{{DS`uBd~qhye2AgR#zTe%_)8e|+Sj|Mvgj-}$G1^bcMi zulMO|L*+i(ZceB8is$Ga(C)AnUwv*xB!S8=KU}~67yjaxU;L%3Y8#1=L_}+^sv&iN zOmpinaJJSew<`0f>F*?Qd4v-AL{&?P&SamiRcCLJZLhd&_jpSU(CcAe*w6XU@MBnr z2kOSw-ky-9XC05zQg>#ZKFQQP?Ye7yc#8H627UK+y(Y;8AOpd8f4i%u zwv~|1xd)~Tkdf|w223+o=*&y3+G?1+GneFsD=`FH+8?h=E%yX+;I>l9NM@gowT9rB zjN@iwWt~3Vx?W4?ZMbqt9;olw_RrqQXkb-IavvB3++bY6GqDn!2C!R=s2_g#@rRF! z+PCk0XM{ZwWR`=={Or%qpZ57oM;VMIkL(r^xZfwj04nozU$5(QyBiU&YrQ{jqa(+d z8`8-vAV+UzM&&yDMAmVu@$s?lecN4`Fh?((vpXhLr~?Or9<(Jn4%FARj-IKDgR_kC zAem*hm5_muk60B~=0E=X|H+rX^{@TA|C|5d*Xu9+-~Xfk{I9QfSUmTQ z3-$Uun&j%m$}eAVH;h^fkj^wR$5nBk6IIcXEBf@@_EKcoa0K7`E@t-tACUDDys89x z-(MLYD{Y4|l5#`mXmCn#p98SsI#O>1%?Pw?o~uLa)*ZY)vLi@E)jHqsxd9*K)L2dw zg#k3Du}ZL`I+k5*!$19N?rnZ9X3i#ZJYM+&{AlZmmc}zzyU# zem=3rr-_OPV{b%^LI)TX-+z&M{>``^ixGdui`QTHgIaN|tA6}pLL*+jKi@23zO1F` z!0IiB17zgcCo>a7@SL-1iKimZIe3EBVFh>=3mHHD<$viv{g3}s^c(B-{>^XZX+B$R z@CFlyNT3^4fY9|IUPdg3z{2EU{+vj`IqwwwjzboK!LMAhriA)W z+5hmL{PyR6`CrOcSfA{ZtJvolR}GV%wO-(WyYF+Hi5dL9A88t*GICAtv{u#Bk}}gC zoS9dk&3*RDwQ4;_Trf4N`(}k#oU{Jof8}rd`9J= zO~N_d_kN%E3Us77rMT8P7N-xv!1S%!u)Mu(T-Qr(Q4m)}w~}Gm#L+3UPk*eB{>#7o zJAdy#!@a>5{QWNWH&hIi`nyMvcu1HV5xidB2l$HQuYdCouJz?-fA|NnsM8=PP!!-} z%22OZG9z)-)#t#Bj6OZ@H;oS+{M_%X`0=m&wg3Dd{E^NL0~R0D-wbCl+R~FsJU1eM zgZ$te9~1ET?Vo-9wV zY@9O_!~Et@;%b~`mS;zB{|a2OLj4IDnQ(!PU;hTRf)<o5M|-}q1d-hYmJqkr?ytNG@As!wE~0SXeXg%)hYdOqs+K^$P? z`p3Wc1;1 z6q{uCT@g7><=wyj_1Ci9`&ySak#UYJS0-(B&oDDxJnMQn(R&9dfY7RS@0%WU)r`q8 z{Wsw}eTa;eb`RY8ef0G5)s-2o&MaH|oFuQSPOGxcK2apIyJ_~+jlxDpWDpn&XOth$ zF%;3~kjSbL;LvUud&_X3o^p2%ml~cojNn9wS=0prL@cDUzu(7fNar#UeYl0@%TK3sb4*&wpE6?5uHiL|oPM>wn z9>+9eJ@|smW$$};khMxe`wX&J-IlJ851O$ci`Mug#u2&JB6!>j(ZjcgyQ6ikkAi&8 z3Fe?n4|-ayy2V+;a1bscGAi_)x2@K-*4aC-4V0WVV`&!DtPAHIN9nh35!7W)w^)_>t)&YYKRywe6KT)KA+%(A3f6_5Izx zKx7~cPygIJ_=y<+)J9DEyfYWvWOVAGAjFvqNV;@S@4B%}r?> zAhUFCFc4YvmS?|&XbPTGG1;fdNRx^4y*+dvtra*^U0lxD-Z-aI79F-T+`>Q^7Ww^I zLn1TfX&ri|CIOtXFtF8bB9akFo<3te&j^q8+T-BNe#|Zthk@D;<;#N=3LCZR91YSh z!JyAU70z@;3cw_Hvb#qOtfsj)Vtkcg*wZS180Ku%4$iWcUz0Y?JUw1?RTCvV~Gi&OR9hK^qLQu3e z{@H)=_x|9&`EUI%{&)Y!zx!w3{^5W2cmLv-pE-`ieRk$+oX)`%EpOcpq{-8_qn^?_ z8^uD&ikcKD-+k2QdcERkmWdy=ChW@SRBwPlM_7)KTYdG6YZ=BeBn|F87=}d~^4Y>$?7he?k0fY@TUe zk%_0p9z7l8Lxu|Uc4iTKYekxhNE?Vlh7U+13Q#2WdA1cyhp}%*#B52+IFRfs?4vhs znf=?}zF}AmuPh#HISb(rcpEFL+y>x$38IBn-J0JTF)UZaN|Mqhv)cp64+YXkhh+CG zvvL*=1SCaZ*!l{ng_;B^Gt1`)o;7=s$~wE5KI(`#b|Ko%F~AS-*!`FP*1uw6UPtPK zLO4osFri68cAy9Z(b&^FnT6@K03&nn9{%ItPjSpu_6aPj#SU>|bxcB#m=%N02RPY7 z0wi^|rilwOi`o&Xc{j~N{?P#jso-hBjrd3(f#Db8{jwlUU zEmrTHXh)pg6)0T2&X@K2gTMH<<+n~pMF?98Qf5SGe~ZjyO}u!bD$>|o98)!AD;$i# z_`?ZigwgkLgq2yRedvp`2umA;$O{otC#LJ!n~N;=qG3L zUm6W56Attd0JK>NAtMw@@Mv!{Wn-Tcfpgw=)wOz`i5m4jSh?1BUv~tA%ItHpCexvc zI_HiYdRRb|RjZ~E24jC56&XzC>C``tE zI)^fDM%EP{A0Jy2EbZR+e&4Z}u^N&Pfe!J271>nlfsxztNV^#UW6qFePya}G91|6? z*7Uw4-uv^*>-7i!;@{rA>vf%WKwui4<2g}A!y)2_RRnJxA24}*01=fLJpJvbpWNF_ z1F!W8+jFqmf_dslsQpXu`r z<~fRxr*T6Og=ivO6*j8k{eE}jC_k>tZGu%f%jo;3ujjra8Rd}4yeH!DEN-*+&Xw3w zm`*ZHWw6g7Gcw&hm;%_fQXP$_swtCwn4jOixPJQf+dufre|YeRxnkK>ulsB<;wZ1| zZm124xguIOBP1f?5ui61j_*fGg?So`Yt^^Ux1o>{L8K~^Xwg7gRSRd|zxnB$yZ2d@ zfAzomFK3)8+>UiDhJ-ob-mP#0;VJ2BSjxQG9aVByRPsKZ_t$Ujv$Fc^RUw*F#2SHC z?`=6(9-SgR(Y(x-<+C!sta{(?R=?IYN7k6CmF4q9kfsP>7@ZM}h{&t^$ajS9 z&pR?|rB5)J0HcoI70(J%`v9z3wvg+`*AKbAoUl%y8y%w}n;FZE#d__der*-q5w;zE98$?|tUb zxqDX>`HT~Nc4XNioxxz7?u^AqYhZqp7mnfYRAobnP^L#n4J0|jcDJ*_ZJ{Ibfg}R9 zGxMAdsu0}=2t%)`eflx*Wg!uIMq0I4ab=v-eCYE|t1=AL%AtVgRj>}@4eGIKtR%h05U<_B*KHFzApq>Uh9>}_eKIqG@B6H%LGwqz^6suo zuv-V`8ELK`u0Fl@Mldmr>Mml{YwN7K`ix18kwKPux=HgKAG}}J$Jx6~8tTWlN%=4{ zCd`r1aDq&DO4bj(zy|1uO!esQPpaRPyH=j*Ac!In? zE!bzu<2$)3)n^tuo^IVy$HxRSy*)6(l#xdbLIQKNf~UH7t_iBU$4)S=8I;hdg2vIE z5$INmwxbda5mo^6f-!6ktMfrk!={ehbJq=$@yMzS^i%B|q!=Ti7e~(+IL=URIku%F zE#?r_-~%U95{?;0B<%!6gXq?(Frs^64P9O&!y5VIoQ_zY%%o#DfIxOPGjN1p+hw$$ z$HHK-$0uzy3|0;{B}amL8Y2L@`=F-r=ey$wern;yPc~K>BO^2zIp*NOC-4&nIkK|c zO{&Kno@EUrO@>y4DQzn{EA7)v9~0Y|7PZ!we*ft|{EzgqfVT=b30Fx{7oOfhYWcQu9BKZ03lMAt~16TOtdbQ>A-Uhc#XYt)<_=}sD zkn39aeXNLnUtK@++dACmk@DTN3PA=E$K7&7c5Ffjs2dW+S1uU3J92dhqTeUKtPJga zt}+kICX*HYMiwBgdP$xhM^C!2>YUG4y&_Bd-Bw$1z4qQqQm97y&^axc^&rDG^#C2`+xRw^^3G)78r-{gg`$-8a4BBoS{G<0CSvbv+D zsX&nX>auQRW$`pKeM_m{FdfUyWUJ}y{*K&NC(A=`1t%W|O@CrA7?Ema0+HHkDsqG76XbNIr&Z>I;qIrY*P_!H^UHk~o{n1|k{)akM`_&yM+fSW%RN^Og0PY6Np_ z91Dz+j;&bF<|!OzLbvhc3xff=?;u5yNO9uX(dX3j5Yl^~H$p_3gOKKPH_c`iB?3AX ztGgKibOuk;y_uO;oGrA-%*B1o7KA*ey*XGc;XeI4jqCH|2x(eg8I!iP(GBYxz86z??)LQ+?*W zdrPyMP;kI{JYmJKpD)(wCl@CxBBS8;z28v@b*|M%D+v_^U_YDaxW@kHeMd5R9qkoi zd&7XQd?9)EAyepN4PrES;D$uEm8>Ynd*2b2T-^r}D;o<+~lDT0Py(5-0{XTqM%#?Hb0DW%6_^N|3 zz#8Y!5#1b*h&^KF4D_uA8JXQXa_zG-lIiY_zTl0J+g!P79kCle?<;ujTl*b}Z#K+o zG~X4g)qY$}NwDoY?6Kdn0Pou(AxAnpPPTO?e6+J(GGz;1k$ay;XH~bab?xH_pKhGv zKGzCP{RvnV$Bztd^E`RYsYr>_$E~OM%pfQzS(EgW-KM3ofowSO$QAeJZ%yy>DdBiC z3hi1Ur1Ukwj40xMC&)8RCSN~|h}f>RcW0GxUa_3flE#`S2Zy+t&}NJtVlyj?^8f}3 z9>M{g&&%=d9X#3NvOV{R$3XY#xRKmDa_I=})66TmbqX(UB~+-ImDZ5dH839jT)nSZd&a_Vhcs`8GL6Nt`3Akw~U} z#kzYhRiAIIt^HH3=?2ktC&WfeHe38ScvoJW7TWVPQ^dUmIHD)>o_S8c-|0SFk+Ix< z+OIkQO{3)Q_j!M+6}i?c&bM#Z+4uSB(>uN1kEHW_N%Um$BQD0#5IVbW*!SIRDB_&= zsxQ`#T9nPW8yW4{L5~{^7||%I_IL0jzl$h)%Q~I|s&!hGh-4qfY8rCSkC@=08Vs@% zGgI}AITK2tozvaviehsrVuQ1jLJ+OC;>(vW`TA%?PnerAoxvHA5%2px-@c~qKxD4n z+sw{Vo9ygVv>6j93(x@vE7m!uYR%}PrymvPC=oNj%MQjluuta7Rcyyf$#=KqRAg{Q z(MZ_+dG^P;P9J(K!$8!4qQ-N|Vgl|Xi*nTxz86QJ$Awe|Xi_lz>h5_kl^Y7%L;9P}!$f#U@w+-f4x-I3KtnRxGe{TE}!f zXkvna-pxu3lDs81+8xX)olT~BLJ0(O3B?z-SiyTjmp+T<-3o9im0}R5ZCTW zCJaC^gF;Wr<3V+U9yF^J5$6n|xW}|IbUc>YR$&c&cL`^G}*58P(wk&eKb&^5!Hs? zl1vS>)Q*VLnsd4O;lk!ztG1@G)CEuCf$JM|X>r7xth0gTMC&|N6iEKmOnU z-~K=U@jv|Sum9OEf7b8!`l;6iLhpOOqdox2okm32+f$U5D_U8rk69)Pvi3%hy(vbm zAosa5^6TfjD)!q3-Ob=y>%Mz}2|E40Kd+DKeQr76qr0N6YjtZC-|rJ2*SGh#mGO#? zgND7XrMrP}cz>SNr;%N_7)SZSZ@%^K|LN<8uSmrNHnXvlVR(+9gJ>~2{1O#dN2J#K z{mpFOjW4uMu2+AGuP=ReP8EHF3);xCx@)cOUbU?L_U-FhD>5j;#z1%wdN(X$Qhwc04Ga@U4$~B4Du$+O&Y&A#QK{^8GL`B5QkmS5xNM4BBXJQEv%WIiZ zi{Ko%8B_h{(+#AmKp(4EPQbVr3d->5sDxXtU?Vb)GU9AyqGB0NI9R*iG8kQ}x?9#2 zOAUnv=-(|;nM>0lo+y^o-CkKOsg;>yw2X{Fm)$xQg(3Zf7jdlcNtOcI`&!pNO`;vJ zGOu%Xg27TakrGzY^e_uf!$IK$7sHnFy6k|usnRUR71QCF8Soq^%l3r%r$sDC@LI1S zB06J4uv|F_k4$4+(vgskIx5+ivmhBZD_(YIQY0fNW+E3_Ae}MzgPBsTjMl_>8qQcB zeR}?ehR03<95UKILb`{#$7~&s-j$CBJVi`Tjv@sjy&`2y@U(KkSd1Jq49t|6>uR4V zRnTchR@%xS+sdopK0O{*h)+j&BQxfQV8o7LyygT0^Lk~-{dBVAhjqpZ38vAP&fch9MS)p?5osF=v|y#=Cb_1*|p1|yI5-i;_wv;A&&ARx^s1 z!CVPheL!qvRu;jdAi9scPZ&+aq^&3~+X&B*&aGKg4C_9EV=xIOprE%zHQUu7lR^%Jv8N_LPnlVSq^Ypp_hxcc4UH8HpOaP7+=^>H~(qX!VFaFR*UM~+Ma{N*q0u~gX?OL>VVlt(!S3Mu*xXy&it@VTCCP_vmyc5$2#N)H8E8ovC94) z^69+$RIm_&=~A!)p>Rn*24?nko`zVK<8`Npp4AzzB>{YA#JWs*KvF0MTlq5)5%&;9|BpZRe=8o}E zM@G;`+c&*)y(+LZc+1rdQ;3}6rvQR408*e?3%$Ygj*86gE=Oe0-8zU^Km3rf0K0IE z;LC}+82jAce$)Fd<{`t4#_Rgn{SGcMGm22}0|u&bus&Xv4tC)>(Zq0~Wd_XpSm*9_ zWk%@Gtpi~Vr#`siv?DU7H9?w^0V4&)M3mSBvI29`HgvpJoqd=_!i~tZ35v8^J=VM_ zi;g(wMy-+BA!a4iWY$GZ8)BHr{=AXsvHyPjJg;(wl}SrHTulU(r2GE-)o(0aYvJ|f z^cg=|l2;aH12mX{Ec<{k69&{dDe+(kEk}maZLUeQRSoNB%6u>tWZj6Tj!4}rijg=% zBEH+rW;%#f)8`Uduwf-5E_U~R-w}^DsumgQty(oJV4Q{rv^A@CQD%mv6AT8?L`A68 z92k(KBDyKNA|hV(YM=Lgu8SrCuE?zpns&EMU~cd#gXc`GO2M7BWhRdi^(9`{S}Pz) zJl__pA!QlydVRnL_viaJf69G6GVoFF_t`9G7OS<10GO+6ozvX`Li_GkOb~mti9lO5 z``JDjPZw?G43)P0alQ6AHjmf1duy+{+)@j0Wb8hf2{PA*XRB*Z^UN4Ka+TrjUe}@org+YMPv7IJ`aHds zCp%Ru8k+Jz%Dbo9sw*op?)xB{cIJ}Rtt(5U(eHhy<9aQ1TRpMi%4l?6>zp=NtV-h8 z1ZyZ6eq1#UK3BZqo+9p{eQ`GE1EaHGbOYHr!AJz49Blh6Sym7zwS!<*f;yv<1La_7 z=wcM?!FfGUa05-}Tz`YhwPY{?(~mhc10HSqAy|w@;=th!7G$JIdk~K8z#Nj8#dD7A zqb|nq7S#`RT0#-vFu)Rk+nBOWCg2D=5{=pF;29Z4UzwG(=flj*eoQny5w&6&Bk94K zya?z(oXK1xv-cgytn4$kl*cnPz@s4(WM1do#^V4Uvd=)FMZhN*v8Hv{rf64{aK^bq zM8=%xV;UvKs;((|F}`>EM}<9rwqpxug`edSm)_*fGna5ybvZi9$g=)1c;>6V%^ zy|XBFMs<$>5LTPa$fFZv_8puKS09}#EEgcgIj-#U1N)!+@jv|e-~KoM-T&?X>F@si z|KG2F{inZI`F`tm1MKmw$7;wxR!*mh1x>QxFzQ(aR+jh4O1&Q=5@>|aKA>h&{m2i$ z0=8D@?ziuVq=chY_11kHE3d6hrZHu|ld(y1pR=#)WqbEoYqhjLZ@|b!p(@q)>&wUe z`BupBA%}26TviYdEjN<3aqLilyR%9_laR$@EVJWvg=*z=5h!;@h0YnnKhzUc-qS*9 zW0+N^gS_gB3%Y3{vAsBO_>P;{n+T8t{HZMDm<) zpWo5yVhWaq_e_uHZwToT*>cRBIz1B_>^ic%^|-MFMNC5I@!}1G%W)zSHk0@1d2k8+ zw46u| zL(u7-1`gU#91kmja608p&%r9Adn3~45NuCkJ}Ws*i~e0Hgkd={j`fVCG!XXqrv2c= z$f@h<-jXvT$bA}ib~A`0U^vS{m<{jV1Q}rnOjw}00WdS|hXmRBUDO1E zDSAM3Gu7`i!k6bKj054!Nzg)IHWv^Bg*rWTszt&&J*A$4)MX0skbp?jInPTuBTZ*4 z+AV`KNRF3AIiXqxX*D>1g>x!%HuD?>fMMH2tBFR`lMn9$q8ke8X-LfDp~hkSs!&ux z?S1d63Pk%vJXk)?vMociW_!L*S|_TyyN@ynMF#pYXg-Z~TcS~!4xasvfyZ}eW=5JJ z-GoLQ@YEbocG^DOk-^|--eV`^BDSMS-Hh6O5_CrlNFKCXLjz5A_hv*P&QYwe z{qU0<$k~U&;XZpX@SME_+ie;(q>~=d(((7ywBX2mh<%B(#jGY|1>7?cR`od^vbb7} zs|qaO?6b*wej4W6Wo1G=33S_%s7E&oJZ-PtDR)I4cjfYF&=#j`s?js>e#b-+1LwCU zYd7!`YPv48MSCMMA|I{WQ`y;)D~Gw;uj|@_KWL2M`x<1_cPkaN4v@}?VK%ID0uf2I zm;+8|Ne|{NGl|_El|3VLju=TM5_6!ZhBw40c6Jz|{HGo_mh zz?z>JWA~0qSOgX1x_WF)?Fe@p4rN7f)rSY7uWre91d18OWV*vsr85USK#%J9yNG|Z zMGU84_>}}rF6%^Aw;U6w+oMhBeP6F1^CKg2)GttIYo9rxOh$|h&EYZRNn9T%99h$) zDd`zPx)n@vy3uqF=ZH2&@gcM1j6HOptZQ0aGH5x*Ck4Jinb)gk<$v7Euzb!Q@YU;; zbclYiN;(ip9(6@EHyF0-`%b`tLSR8H^dqtK(OOxK?jF+AbgRfx0D{YIXsfQWPUM`` z4Mv|EUAaQx?qkqy9|tpESJuVpT?`)KDnkABr*C~e6B$*K-8(9DT*;vy)XIGy&f^7a zHOzCGZnFdtQAx{lfXBSI2M!l7{JHPStc)W;k(F-sX#lTE>9W0LDe`&N;d{Q8jd|;N z4kt5xJT(=Vs1y$zcPs6xpZ)NoqqaK4<6cqpk-L97-_+jsfSF_R%9&E{v#YXL@Ao@a z)K%|Rxg6N{2}Uukt{f;VbU$HUXwsT!f$(*`?v~FO=uMIq+*8CA5jZV6ixDMj9ECLZ zeP`u#^_=kz)E%?gT#2;&JjCnUJ72wRc0___Q$iG`#fj&8(hXrzO>F2?!@y0K0m+SpLbZG8AO%_!z>wS zN^%h0J+M{Kf-@54T7h7<9&qHIaWT~Q_g-L1UAa!T!3e(ZyD}P5J91(I2*VRov}ccM zPiYDOkw9+0!)+5fibP~)t-bfR`%R4N1QC$wfKLZQ!mFx@tV^EIOkj+KQevoq-pIJY&o|0MSX;rE-s8*|zR#oM^=_zgV_dk4A;mK5j7|+a!4_H1UWt=ynrPgje+v1HuR`p4H?5VV_2>4^-trI zI!E{ZB(VFQ`C4|LGgH|hkKOWfw?B2Bb0sn(g0#0b19R*%AsruQuFi>PP;nWr*UCTn zFaJ*c@?ZX+{U81>fA^2?-~8&&e)f?_KzZ@0)*)!^FjnSpY%O2wVg`}jJ$F9MZ{I#6 zv)jnIo85Aso(I9o0{q+0Z}Ul%UGZF_V2sTFs#T!Sl}U2(HIOO?@B4Eo{XFUx1N-ce zTNs(aWM*W=3!;mW*R`%|U16<^(`t{++kU=;5D6=@BpaqQr;>TOu}|~d?aEq}4a!|f zS?8S0xbMBsz19j5je#8w_AyrwfzyU5G!qr~eJV?**ZRmsN1W4-Y+`@*1{qV)KgNys#aOVN7P-iB%BKBP$t%8xBS?W4?IHIaS;P-KRl*AumOvhMc!oPgKk5!-*g|hj^`;)OEv9~&kti%21wfTtd5{`&f}nY zzJ+GDbIedSV)&tZpJNTrEJl_7zWl_qdK{P#1#|!nt(=~81n3?o)C5@za<}bvfMCy` z6SKHcF-=#*z%USxYalYmkT|ms1FPoEka+eWh|KO|bzEx(o>j>x!tJ@*Dcx>;|5UOC zxg%>fm~%VqBOk%;h6wc@XSW*C6ZI#f2mCM2n?lD%%yMTq-v*fvuARvFW^*bU=~X$p zO)(8-Rg8|(oonS<)cF4f{Gy(nSEOxePm_ys_AKlMmpZ9^GR6{ZEB_bpRmtjbyp z8xvZ|%*r_g%qxAw#$m;w6FzgWn1tG(9IHlSgcX%wlDTSS2yy_C8CAJn5#c_)-}`>M z0f=Z!9+|{MA?&KkstNofp8bfSsT~NI-=AvR8ooDab0_Esa-m*_34l-qx_8eBQF8=+ z>ZJe8s~lXTfLKyjYUGALwJ%h z<4k_qB_;`;bt1TiP}l!ew5+*pva)irx%5Wxe(3|^7- z`q?jf8D3y<3m7s@0?XMVpR{%$O9Vg4x|UY5m9L3u%OLL`0H=gE0f%bYx58 z`V9o97?%gK*Ht6#+D1fcc=B{b%Yn>_s9?}UeO$SIWGoS#RHG33_PM`(<$f23)lNiY zRZG_@0Vd8lBX@zxcs{4h$Rz7!Bbkvk`s`>?-%kP@%e;Y=S&^+tr#{;q69)J3!JuKW zsvjrg0p^VNqxO8vcQnNDqdGz-*;_+oX6&*T^tb9?k8{orJR)}_x;{FaAZ}x z+ijzXZuMs5x_V3# z;?q0gr(l}Xu!Lk#ZtDmg8D`g25g|jf^tXaM=WaMMA}S*f_{2bHi?U*#Rc6~BrK0NI zd&IGoHS4vuY^CEaw}oeZo#gKW&J#+M!yp-zRI$t$IcaoYYjr zk=80RCm6WT24#=jg_gFB#=iG}1vRCXauMo#pF7uDUw-lN!_On@+r6tN6lC>GQN`%~ z{QUZ-e|G=&Yx)2x6qpA+#X6`8P(CzcRn-(Wo|Qv-j7%c3TX0lea{JjGFLQ>+AkvIE zr)03MRoB&?l7v9hMCKB7zd!pN3zA#gsab*(26*mG1Tmw;lB|6qc%S zmnTD-9ZP$9*W{S2ClHZqS|;L=^$ddENi)EKbNJ=#;NS_M4kn(h)}Vc6g8<@p1wRq< z5`t$*T2FEE^C~B&=Z%1AO~+^gQ5hLa?Tp8qJh%6NA;I8N!7>LoXKJ{RN+Y`j7t0{_@xV=l}ly`JerH{G)&LC$-kGZ1q~#*t#&M2VjzQI1a?_eXDoh z0vK-fvD^(fLgWz1r+nwIpxg`& z2B9^)63hXQS%K(256!vJoKqVawO;l3ZUBUX{^8@}F;F5u?+rZX9I|ybF%}$_eRcr; z64!+_HBvvkK4wT>8P;R>pT2Ww91}8E#7D>9g=WA?DkiNg1<9n30i? zlpbJ~LKC+XkcL4#)WkRY$Xh@VriEQt1}FPmk0d6DR5M zdrAj0)f_^2^4~chXUr)Yajl7H=Ts6|RW)r!qiTt>aBt}tj$~y9Gb1vJ$c#jz6^NvH z?;DKy{$;lvvu+%3gavX%FrMd*g-qre>Q%|A2*&KkMofu5Jrt_h{&#E6ag#$K!yqdw zs?X?xw!i0H>{&BS=zi`La7y6GN9AxZ)rj%$Gh^j!o4XG`_jd0-1u^nT^ZsEx-%IfVt2Z)TYoJ?kA=4`GRNR)fdF&vO&5SbA( zjoJ3j$d<vx?q{G1L0gy88Ccc7im z?%MN3Q#P78eF_gfIUgj5=VZS zHDPv}$&5@6(vm6YsC{~t9Ro4cQ}Pf~GxZoo5xZM`m`vtX2`e+*=k7*|73hu(*zdFD z=p6G;(mdzA_xk|?21fvVPD7-Dd}ug0-Bdqzn6|om`mro--GgVGjRRZr^(aQ5av5)Jic@HEbO6I1jS^STeZg4x`A8=33HEM@_H z-aoZ>m>{asZbeMI7o-p~Yos~kTF#3}LVH!s1MpR=DnOh*$RJ}Puf=JSZMP2?vDQ^_ zeF+#r9rZr<{SNtxVk5{kk4R4Zm>f^O5s0I9Ysy^uIEf_h`(5>1`(y^$_YTZUhGU~= zrp^h>eFxd+zDG=j4AWWh@e$W+s$esTqx=1N-*13bks~hblNlPI-_x|$trJ#v%g(^@ zv3OmtoC(|NAtB7R+4$#vtHG=xDs$c;RT&vo&VZx=Q^Q0fR)9rjh64fbbE{i&~!(ZbQwPtXLV{hX;<4S53lCL_n-l@S$adWdi|io?0qvEs{@AAj+OKl{ZW)T_?- zCEB48!RE)6Y4+Ez-+uG!uit*s*+FF{?W6lUchXq}IoHalNzVy{wbrX)B+uz?jlCLS zu#+(Y?LKF;Kog?Ys@+p@=Ydlzt z8r&B5zF*f0p!Yq6-Dh|*j7EczjH zpZV-KV72FHIG_Lb2!JEfPk80@jHW@2uIR1|sO`tdFbQY$qukHNVYGJO`zZ!w4Aft0 zwR`HC31lWvurv8xRvXJI7%Wnwk}+g$DVbyB7;e$J7PRI=m~NNZqg$t^)+qCdc1-6h zVz3!H4UYxNNis4jTei4X5p*lS$8h+3QHEw{vV5Xyjw2y6Uv?(Cc~=dQ_d7rIS@X$oBiIw+1tiGIj9IeA$jWogWEkQ^L^$rn?3T`% z9|(6AM%p)?jfYRLYLDD0rWyKtRh?h`vETk5|NH;fuRs5rfA>HA`+wnwhQ66?S}V6y z`Mg);Aj12&kAaWtORc1Jzu)I>Ko#u$e5Mugh&eHRmt2*5Z!;WRSB=3DaS?8{ow;VI zu>eID(4+Z6vfk&+-YoLtoC9!i0Z){VCSw-3 z%&Gw+Mm#2atODh>>%-O0d;%oa22OeI}0h@ygNP$mla+;mlYw zg);5t*2V&ex7fYM4FQ7`$?j&P zDLcc*hY&OF-r?lzHG+~JQ!(al1<6?&;`>embP_SC20w#IR%qW@(U2z+AnE%&9mxs? zW458|deM_u6ofv*5qlECGUgGlIhv0fiD;cz&);kw{fu~Qm5#Y|GjmFG#{Dio1sOx- z+-Gi`IaE6)4`5GhT`jk|yCOWBSyCpGIe-)@jLLX8V)gRb=>C548(8}s6dnb3(tB>Z zrNh(R-QJ2(qyfhGA%uAuAl~qC3)V?`_0)xy|8Bvv% zb1*>9q7vFo(z|s|WcFzhIwvFM;p}}AoIg=RTR8`u{eRhfFfe9SO~u^a`#ZHwhW8l) z8NPRsEO%Gdd@6KT&gOm|s!4mSGWM9#=6FVRw|hE8j*&U;t_QRIJ=DnVw$7~TXQdt- z?!Yj%xvurN{N`0QFIss*ItB+`HTRO-d@yiNUYAMmsl}RghQ|?EIqya$+L}6?`0f}O ze5^rrPlx%?+)22V^ZGjVNilE`3z96$WSKRiA0 zj??>eBbb6b1{jVbi5AW|$x7C6%B3cWDIJ_lc%)_-jgF+D$Qm=+yly=9sm3^rIFQ9T zbO2*{1*j+7j@jCgv?D5kG>4QRlV-_rts=emx%a6D4(QW5_wjUoGTfTC;$&7M5DbpX zIKqy(VTo}02+*l zFRrw?>^Kefpfpx3|L#>c(mGpx_P#CGs))>F>tQ6(gq?|4(J;XXt|WnsxZmFtUF(Y1 z3rvy$VISD>J2T)xg6chQQa;DU*4Pr6bB_Ez7^Trnx7?b;ORTjZ_tE>lpWS~Sn8>`= zE7oh=b+G%}Px}1Sxyd5Gld`4Wib%slt4(H9938-!`9$pIbt>(19$3L#rfT7z8F4`NV_^8I=C``p{-2q=S57SyhlqX(PQ$~;f@M{kOt z7!)F6?|q*QBP%Q7SbgXtj;iMY%kqjewWVQ@p3|21Ir|LgLRQm;nv)S}0~%7x_2qhf z`B_G?c+{q%oHS40-+rsJb5#$^LQTUBY7D36ikf(f%v{M#1apPXU`snIncw?BXVXcN zlm<^I`{^G5u(H0N#fNsD!DY32&zc~jvNFP__c(;dVJG#I`HE0*+=$@O>2tq>#kF2v zeva3x5pvkBsE=!%ufNgzr#|0SvaUM4Giu6}Gn2$=t+g5$Iv6LAi!m;6lK4jU=ptFh z@aZ0yZq{m=ZDGKR!sA!Sj2vrY&5kq>l}I)qHOQ62NNvCrPajEHF{5_3W`lNGjIChz4zHC!V;o#)q>pn>(^iX zY42|-Uawb0%9z#0fWv0ql?-}a(Q+auPD;>e7$E{7S}jfD2J?LC)|uY%nTM`b4};PM zx%b`oyM2OGYeML(g0cI)UTf7Q3+8oQ5wM{a+~ZB1aunRJ({_uDK9lZt435DfeSF-?2#{5|UTekG znuakCyYfhxb*&W{kyTMMSnsnVvXH&oL{-5a6h==6RGUFrvbW@|vpX^>lkM?3J<;)5 zyAV@Staj`4KCm-lpN{YZ1ZYP@>*(SBgyqW2D$1Ytx3y~JVniS(3PuxXKxe-x90@_4 zJ4tx<1{qke2ZVsAwGsEGCa7)mUPuo_|K+NHl#yNhpJb;l`6)dS|k_UhzCLyDR z86-0fgow&KmN3VTS*YMK3C{Gcc6)d%kM{UDLTPCX*j4rXZ#)j$p-E!pMPSOdrX^?8 z`ym1W)^PG+46`|AOekA^f^jgP6)zoQ0Gnjm1xBxGmh zYpsh*x3dzOZKq@4AkU(2m{XcmaAwW{9mV4mvOmwye*7}8+K7na%Imw|()Cf1sQ{R- zSG~Txvd_l7GBI&*-%v9dVK{XxwdGj9JABuh$RHO%1dhp+<8e>>kyjzrEjvgaakmpu77CbA0~~pGdn+o^I&~ zwnilENJgeWbwJ&FNWDx(ZmE^UzVET1n_iVeff@2k zAb~QW;mMEob!KNnVB7~Z+`B#cJTj}=;y3^Y@0T$RCpq_{5ivR0$M;)VwW|Akx9ssb zT|{&P3>bY*wr$Z(iO z)i^E)Gw_HD7KXF~<~X)IPd7y7Y;vI9d*_%&-AUF}Hok{gAj>#L__(KZe13a`)DHLF z&r01rAA*F_2c}v%9d(hcVo78r*dN%9`3$Ul~h?DkBwvLXICA+oH zxzPYKMvw$&Z#3`aBl(Q=1_ZbzQg+08HkWgiZQTw>Wgv=WDI#^IVq;c^ zK%;Sb-m~yvXKM`<+-f(J8Rq2Mu+PCDticG%N){uSW9fMQsqG9BL%*kenBPYU*Da|Gw;q*BhF?+dgX^+8Kav-uE8NC8Tt@R8MP7EurMT3#~`nc9* z0-@7KdtVb&Ghioct#w^5w*go&r^~V2_I>O}TXMp4sXU>lGVO_Dt%BGS1+{gCMHKFy zc-w^E+?pM(pl)>&Kvt26qJ*qu#F2@o+SUw$5p{j}0O7Y>?$f`9Km= zQGyOsL=e$OBn6#5aM%G@4Yjs#tJmw}b^X9x6TMJxy}!vjMx~nm9_pa^K;grH)m6&} z29Qtq%pN$s1WL?|aLY|RX6=l4W$Ls|=EYp~`VyJ4S7h&f?@!ZJ2;%N-`$21r0}jrJ zVIbeSfyh%4s*gd%elMM~#^u!A~MPtIjrbcR8B@-l%5(z+^ZC|7bzYb_+QGJ<_J+-GlA zo;ie1_e#c?;U!d6Rb{X;H=I=#!glx^-C(YZbv1lIvpCzF`+mQ_?ep6}*Z4lkv2_;H zfRo2I;`V+LuH7=u-u@n&51?xC*$zPJQKxjyAYNpJ(~lLD_j@0o8m@|AuvQ9oqnNEm zhN=7g*)15AnGrJ*L|(EYBW<)Z2;{yMS=SH0_vObQUqAa{gYVO=9XOdh`~CG-f7ZQq z-#HFJG4g8m^yhSUWUl!zPft};5DaW>07r5+<^gs*Oin;1$c!8|6OsY?_3=?@MosVU z*|&l5{~b5_;TDFeyJt!lM01cAQG;^MK4h9&p(89vVAK6*m=Inai_A}e{V zm2~gjd!If+DpvjQvoAmV{PpqC^84*5Mo`DERb{-t{&au-bbtH0A~M2}hRz(+K$)Zv z8j*&XSxfB|Gd4Anki)c_8N*hORT%+1xUFQq)|a*>ZP^DoOK2jiB3zYOYoZdBDRs>F zX<0b?3<+T@)MTjJgfL+*dZ2o0U@!&M^!#p{QkvEpdY!8RidT~{my zyTASR&wl&sfA)EQrh8>ZF0@%OK85=}-8*MOB%~d1B5c=+7`S90vuw(JcTfE7-fzIy zwYpDas6}-KnOxTb5RO?;L@{e(T4-ta0YT)It1@L{Mlibvj4&>S`>?Y2Ip^N;-h1pC zvz&-b!*Nvv`y4^7vsN`|DXUoFbLP}n745UuTGzrDcxn`E_IT=_lY=GIidrMDhd}_b z)^#mDYS?4Oo^Vw6+56o(tcZyB=iAS@9GNx7=lg8H*Lpq9qwaZfA);34?7V^mw5$kv z%2sn+lEF-JjSRCrta*f1Ty%F0Lr&yNu;FmkON6$UMK&lpCQ&UpwPfIS}0{67C6G#8s59qD(e ziLpi5B$JV~8WVk?dPjyZHx+AYJ61%x06FT@PT8OTCC^o7>< z{C>hFS&`B+MT`qkkM)!*l3a|s-=D9_pZ>{z@i+eMfA3%Wcm5}T_dotSKac%!&fcO6 zdD$%Q_kHY=I#yAEsaU_dPSev4TWM(!LqE)`gO#sK`}D_kG^)pX9u* z)lx7PbDurNJsDAXY+18}Ry#(G++^0znpS$|>bB{97iZP=^IRz@yVWig|rV)g0n&iTd? zjOb~gGhhtPwITHk2IEqHvv_ z%>&-um1Ecm#IxpUA%nRJjK=Z#4x5r~52^r$Az|{Zf#BZTn$QwpC0Ek0pWnuF0LGE3 zBDt(i7Rl3ReNSYxV0T8kHCJ}SM-5T4ci2J@kj|mbGrtftee?(!>W6CQhf5x;ffnTx zDCHo;sxEj8LrEh{!V?ZVy(75Kp4H?zO47$bla5RT986{f_rCT1cJ@2Qk2PY^ytdWd zTRM{)3%mO~P!+nadOpd=v8yr2-_!G#9}}cH_pP%zyV`Di*K)>?5VVd990b1XA_-(g zAMJa4NC!mkV2?Ch}Rpa89&Co2eCuoY1|{=x*&%zKq83TO*l> z9BEHBoviCitdBD($uokpTLYU8OIf()J7=uFBuQg&56erO48GTKd}qR=w4Nu9=| zwWOg7kEW78e95&WcQ;%6^QZmoa~UgM1V#!4bo$KLH+E^+qxaSCE}-wx`7w(3KCxCr zNRE|RD>4Gky0WJFTJroAmgh24@B4^Cu2=n7>y@w7Y;{|Ee|zt5@4ctfzGqu}?>1zz zhp1q`J&6$rPOs4>8&74Y?O>s|=01OXi9tx`;be}HZPjXx!H1J&4tRVrRZ|vz`W(v8 zF_96U=iP0tFV~l!N4+KxTR}p7w%>1k-rCc=5k}y2A3%1u=sB(ifWV5fnZd}ioKe%K z5K(IHy^lTfSTK-r)DbH&Zv#&zn#0Abj3?HLl?&3>&u{31cwk$h5m;+@3FkD7?|B&$ zxc3=7s*iHj`teKs@MTp6ao)Q?0@t zdk+Q7G$pHNzMs!LNYW8;&du-f?FhyM4y@gMP6H8EWe~|#A3yy3hoAl4`tipj?YpZg zLPlh+#kha^?N7h{)AQ|{yVYXmkvIxOBeNc7mVvoSrjk`-+X0)cqxQBrh1(UmLV%>I z_2}L62}7f6lO}aepVLiQ=1^$}Ml$iCf+<{%n8y3Fo}>B`2!<-T?=ckqv%a z3y3EfY7@vTNyAdP_a=;3`y9{KJHlY)y0Sp*-jgP(ENgI2*yCaMA#v4pPMVzb`y;fF94BM%iy`sTD8_9m=UMZ-kB+nW3>m>pRuf|REaBd)jEANWd!4V zHZoSLyOjt=Xz#P%jE>BxU}R-RAS;K8xX(VPvxq+0+d}u$fd_iNGY)id<&|b;jspj9 zpFOxWX3V;2PTjE4XJx!TUSyoJXI*f=-vI8ujT4}ItGi?Bd*)6UIem;Vk|G9zMIR9R z?8q3hhR&{tbBvMW^EpdNKqo3876hUr-%5w&IcU~ zS@E#+{>*aTy;q{BX!^-L6)v9G2|yC0WR1|#|@qiU;vCz;v~U?QEcMn4oSBXgR2 z5E;l6!ZRqGwq3cNEzATk)ixss;rRq?NHEj~G3*0O5-x2_Ay!bs5gA+8^R8>vEU+Yl zQ8l6Z`8#KX&!EJ^FcN`htbIWAm1@{MyKoWv98O%Ud%_FPko_IEV-3zJ9yK7b+koF~ zdarZ8^5Y->(I4Rt|7-ul|KW0^Si-CfrgW=N=&RVkZB z>s|CK^m#S%vK0UpPo^?m0V0h~TF_UQ>l7!gcPBJaC*ZE8~q#%Tf2 znY4V|VAdHWa{PA1iU~E3SZq;L&$f$u-xG_$T#s#Hn&XiLu zI#fZ&rqiUO=>`oNqjU%;K>{HfvB3k;14Gax;+cZzfu87rh-ZpKgh&*j`^2N50ToS0 z5<|Y)u9TIk?)vDe{juKnx$plq=Nul)>si@QP^`W7TF-kw|NHu1bB-~7L!%*c1m}@E zal+v9JDGXw-g}&at?pepJO^Pq6wZsHYVRCtk-AN2)39_jHp`ZvX$3ob{kcS;L3%iW z>^y9;RtaGo&z-7=%-?D@?!A?JWZbL`;&QLkUvn_hKRPad1u`;e^7yE{CD>916` z+$}8JSmRPQce4TfR;D*0cBKc8`D}cY`at8ki;ReZAi|~GZGw4bjqg%y5L26aZs_K% z9w5*}@6CPm1+yPIVaBvcv3)4coDMCdQfA?tZrLe+G^42ToSJzJmtwB?$6q(_y8$xkpbfmDGqc)6QlXB$Hr6K%eAJ z6TK7EuI}c+4AHu~>$ZV(s=KC5O2nXS6~5fOC9r+0pU$zjQ8wJytlHJqW*#<9VQ?r^ zFxgqkqS4t<*Scoy%IW8WW?Yzju1}!b-LGqTT!bpKJF5q(IR7zoUlDFo|D;xlD4t6Q zsG*Rmx(_J0PNH`d_Nqfx44>_Di&A!0=dGTt{j&4>6$`^12H^-evMa0D>@jy5+KhlS z5e7TXUsL9QQb@Yl6~0X4WorSopQw3WA@V@;NID8NU@>&|k>zvm7vZD>232)x%yN@1 z-&0FVkKp5SzsBAK4X<{qZ)JzsBoW<=<7gmkf)3NoeSB~b+Qx!Dq01>%oNbv+DqFT3 zB^K0rc5lJ1%hsZ_TW-eMd4H|ik7WhC_FavJprSD%x=X^XMvveHRA;x*D<=jrxb#wM z3~LjGxSzXo7!Zz=E+u`6S$gDOqX8~}T#QG%%L6cUqwl(RKHr^OEDLvg7<6265^7kp z8qz~7GgHL0Rm$Bf=f-d9Hj0ew6KNXdQU&0AJHyu;R%?*u({o^+)l!WIlNvR5HL(0b zSE(+4eERm=c*MZ;UUgKje!b`O%dQ*JwPwF6x@P}2l@e72v<=-!n4C1a$K*Id(@!;YVp;b&6vv}w7ihE))F+s zt+{(ZQ1&bVVVoSTscYJ_U;Am{%AS2Jrs%~$DcnKM8r6*1MfB`LmM!nuY!16Us3`@p zVdK>V{LcwPf*uiJ*;TEb1;{NxnEU%{zrRv6dwYET<~u&FUFu32%&4v~bL#!eFMj&- zpVsT?z~gcwEDV%KbQMH70L)vSZX`?XV9sqOqQO^ge>_(BwLI_PBjs3gR8=jyva5tv zR$=1snMHiWAfa)YSN7i1YNW^YXl1IxryG92F3ilZnAy=e7pOMcIaGIXtacD2c1HxP zjeb`P@?fkrpgxP(J1MW}AGL|+XJS@Ddx-I)lZ}}rd&&Z3%X~Rfvj-gyBk1a^o$qzS zuW!Hm?%QAfiLL8}G$0P5q#YZPM&uV|}&{ge#I?N4LeKebqPyDz=V^E+V!k1KCdkB6F z(rMuij1;=Aa84kr0mWJoW<0hFrweT89?d2erLNpH7ixxuM`X&wN<$y+$~<20>4^6@ zt4_n-xhv-_NyZAFocOvf0h#;sYn)!%Fh^&vaJscRcaZ@{qs@(6lkA?j>H+El6z+Rh zww&u)^8lzD>a`{$IREFc`HB)Fsn1QTs40^>g4T$-peQmxSVT)6EVaP~odrx2rOzT{ z4jq~)vu)xJdAh}T7#uM1!v@_Ajy@xSmMS5kb~7Wg%dqHnu(Dle$nx1Cutx(OYHF3y z8}#u37K|~W-0trA9%EEnGqY|`hLcCr)D3bXk`qbD)HHX{<~`hU^iV!LJ1g5Kj@6)< z*)S(DFBmi+J1HIGVMPEF#FrqW0bMkDLv9e{#LhjDt*Y@W=P3;Jfkm`YBAqZF(R9LA zF!w>O*sPAiO4LDepu022oe>gb=57R!V?{;xsjqhP$~wm(oJIjPJ#k}jYe`r113+o#s2H(C?}VvMyC{2`!>H6|WpE+) zz1uRlpvMcy_h+_j7w7}#ZdT!=J+9%!RP7dDnY->YiFPIX_5LId*?c+c)`Eq3Tcd#5+6_uUr!Srf6bH*{=99hf zF4?@`8L}T{>;K_XuE)413Rn5P^qd(>mRacAY0~8&wY7+Fbf-C3GKAZ`dT&IOTj!)+1Ya> z%FWCVuAfq>PJG7BPRXocK(AOMFicy!rrNy?w9;vHC$T&bJ~NwChWYsiGfnfcsoNC4 zs|wX09BSphCsahD?}o6Jj}>&z=Wr`EorPIi`IxY;YfZebyUfQ_pF8(BdS(YbQ4S-H zC(1d-spo!~k9!4;%$AQ$J$F{Z=P>rWN@~HgXaeTb9^z)siX~MoW$&G*_nt>^`zU1? z7n@jD>ei5aPIkPZ+!!k+FfVgyY7jQgSUqVpn2q-kW}dlysLN*1v4VGQ6JI;&9&3>fI{WU$=YuNr+>{93`(8sforhd)0~PJs z`oMU$P~~oNb90_$sIE_j)+?Wxvd7!{=0_h{0;6Ghv-a!#OXlsdNS7PT8t!H|(S2yd z^Wn;A1YCnA;^)E)?u}{LH7ZjA95m3pIx)b<8W@WEikbSMDNICn9+jFJa$mmokiExZY$zA zcn3(N(uvd=9IZwb$q))3TbSt#sp>iHBD_20v-Y=%oQT#G8H2~~?l_S?+nF!`T^@F~Mz!ryX2Dps9hTE!2dKr8lhy5j8=(T) z9n7j6`&t4pI?jx4jjmRhqZyACVSQ@Rte}E?3}fVwSl5cWMa_1MYIQX+Sq9N9M{qEO z`E+A?MBZD~@R{wbD%ApK`-*DOjstoSpJVET%7N+}o`t~xk}*u6fr53DK4QjESqA7Py zeJhCjz9|D))xEcQtjlO0-_uqsXKN&LGrO}0Mpy&0zgJ^thJ}<=-n%TgyRxbVIMWKo z$R^bZRLyPQWEQcOWbMALM`as_m`Vwc$6GfJCb>m-S6huVXNH02w@tkr#zo!$tub@H zb!n;wx^mdghuMB~b4*ctSGH;zwPy`HK9ym4IKUCcB%@(Ep}R;Hg^$*Hhr2KH7!lJW zq(b8dLgA>h6JDL-sVPsGOV8L!AkFq2hnm;3+~eH%M%u1fS+#|sDpN+wp@dB?c1p@= z;W3mWPPAc8KI7$U4!f#^jlej6!1=oQ=#xJF8%#C|6IRBsn9c%9#aTHun$>diK4Aq8 zIcQ#EI1N51oz-3+4rEvNnv6it*Ij$x`=0hzn_m=&d3^^oW8jzoMjZ|FHI){}RWv>Y z(=_(QWF$m`n;Tr+a5FcJSWXzt#uX+>d#Y-Q>fBHbgK`D{oBoLz9f!ddb8w@^qNKX5pP!=_YB?+@^xHRA!_%)PEVXVA ztnklQSxopVJk)UN&5HS=wLw95zvTH!JsuWrrECX<>oT`)Z(5&lAS6@?G_y%cN~m_# zpqtzuTThskZMQ&4S-#?0R#k#7i`qpgv(|MB9q^OcbK=WjcNmvk+#d$DwI52gnChZ#lLv@c?d3fXS-zD9SuJ-d2$~^#OH! ztc0>sILn%r;6XKn>Z+Y}(7bXE;HL+3F30fL)G8&1bVAJTyt0-ZY|zjaAT@Q;duCJ5 zcPykak(`Op(A-CF#<-a<5)w)JTEi%rjW94ncEXNA3Z7TA5e81PxTM^Bei(`p&bk4{ z!?&|AvpBuDqPlW$T4NJ}djkI=fqB3_KtJDeG_ne*cI2jvb_39kR zpPFXqoE9&05+r3YydnFdLSa1jw62a-5`+i}^f zF?kJQF&>X_bB@3ZHyUj&)@YeySqw;fuFdG#^2{o^&8>EKm-)EgdgzTK&H}T!V@Z^J z(LVh4jh;1X_v{p9=CLl4GL(>+<8YX@KzFaWF!mw#EJP~vfGA% z8kJ$HwL}^Pf*8k(4llFe5rP^$M9-GgHs%Dij6u3Snz;u=eRRHET{>CO581F)JhXNa zWN@6V<2)KEIA%(pd}FnCPAG~nNh$5zklV*z)!i}9!jZZ>#?eM|z-q+nL1U_W?ka8~ zIe-NIw| zf1Dcf2tvqSKHL%-`VmW*)#H$&Fm?cSSMSPdwOk%<*IMggRM3S)rd2@$%;zBYNwaAL zZ4)|soB3SNGZSoc_F3+qXoF(tyHw{%9hq5N@W)WmR9Ub0=lAbyg!yP~;OQrj(qt{3 zIjY;k8>LoEj7{n+m($O_C%a6@T^KGE+y@aW_}k~}N8j2y=RX0w>b~Ed72z}zHle>v z@#8Cu>*SIK(`cYCm)c=)6GlwK)};H7`ST!`QKL~4qUdYd-};Im+bRV{y!rKZef~C9 zXt)~ryzlqDpBD2WsEF1$GG_yZv8Z=eT$6HYGn3jq%zZ8%Q~V7Z%HTZhWjJdx$!FIF0ch)_(1vU38MLa%#dwus~+G8pO9i~jfe*gaa*VlJ+ ztyA;~bF1n#StfHyf-J)Q;h@uY&%`}xkrv8FXLM6rO{cQV!wJvH#c0B!9LQy7RyF;2 zhYxO*Lys(@l~6TUQsjJ()^fiHbQL)LCk-Km-Qe=a+c*C9sE9kOJ1cLpQJt^nem?W- z`xSAGD9Z+{VNDHRTdr!!G-JHkP$kYx(MMcvNNA>Nt~1y5$eltL+C93;8Gbx2s8d8+ zmtP)sZW?3PqVo(L<1?_J&6;mE+9EQy&rwX#EZoDKj_fHYJnv@{vvO+-UZ@B&V`drX zWYep$;_dT~e)9J1w-YB8hGT0|69f9(-+%eVm#@Ddu;Kx;yLJ_pIn0D!9^s+608q0s z1!M*orsNuD1RRt=h!l}k?pNJ8q4NeYNd+(~Y0%x3y=={gK9<9&QRnH~fds}e`w$*x z!;8;*ca!SN97ONll~rxa8(QnKuurvX|31Kn&fG!{u4h?5 z$V23jpc1mv+{~S{$@M@a8OF?VkKE}f#-!U)T(wH}pqUjE}(k7!hN-TR*M)}98u zM%G462$*Z+dtmvhRCu^M3ef2#moat6-1pEXM7Yh?IF-BTQxnytwkxt~OstQ!DBRCo z)c~15X1}Ady1QF6CvQ27U2=NN0iS1<6gUvK$J^VdPuElcLcRAc+@md-;g!2oci!gM zy9Qa&Z3b25Y^-q>q$O20=e~kcp9tLaa8-j~%nO5V%ZAl55B-!>t4TY;F73WI0G;Be z+0#vU6giexM)zTZ8EvKrPBji7U{9P5kc^YDoHpGW(~Llbg;{j9L$%Y#Vl=Rv>bVIX zjb5e!osNLhC8HV2dUVS=k^v=r&1%X{`%uunU*?h2)?+!Il5o(mICZCN);jhPT^xD00=>8hOiaDrm1v+il$ zrEHe00%@VJ?gQBcnr@X%Gl#SDG%rkp^kvyRzK8vyrtt!t|;=0bU%EMH5hM3nMy=*&DMV z?1Z6IndO3+!dx64wy0cJ6k-cylm~3x<==1oV%smC^>uI2wtUl^nBXw1u-j#D>{5$C zNuDKkn`y;rRi;pL*{)%N2!hEabGRFWpf}9Bv$N`+IbCg)J6muQ>fX0sYv*0+>v~Aa z-d$DAqSEaIdcwFmp3vGqkod2Op zu@=RTfXpGwj8-9#vCIguN588NrxgP!RS*8UtObAfndWp9tQwevCKV7fVa(l#6YI1OEW=! zY``Ge*%-{%=nz-q5Ts4&BH^v>25>$t`p!GmGBaqBi<2CmI80SdjG?Oc-lR??T4iO9 zW6*41=QKBVI|9bTCngE?hB>?1<^gDFei2) zb$SFqnb9~42sA%-gL8H49t__RgLOnmj^3ovu13>4CKt@s{a8ih-r1tsw^q%c zwWRsOkN-{v<=sHD^l=5Mu5Q_&^$K@Vb zTY1kEX_&)emf%%w-L>A{*7YU`NFk}B3RUnPhL#TN9X9Q*Vxgo$)6U<~cAjC7%uE<3 zWYtPIgVE56Wi+Yga%uGSc=P3*lz_VXe&v_%@7HtDJzS=)5{kY?a)cT{S1AF?-1fcA zm@3Yxh>0wukr7-L?5vg@+xUdhY_7k?fT2@v#8`;$-A#*!MZmnLz)z|BwV&T(?|J!B zlldJWz3tj1U27S6j1c<>kKG;1cV-U&zl#hr=Dl0(G~&p&I_ycJpgoi{yVfe_?7%%- ziAszy0rGCqjfu*;0U3OKUZ1~(23=8y_LF-*zkL1viwW*DpMFiKYhJqmci#7YQoVOd z%C0O;40~SR<1kgL1S3%D&QfTnfoEKh1HQLrV(7jv8u+R zx7to;qRc%k3=Pr>R=k<6?nzq>UJG_=J+|T>_UodZDKHgTh@)W%Qs%gAwsk(X> zG0)NV<%euxf+m9?+N|$2cDHKKn3)ES21#?!um(@V&K%3EhwXiLHr>~XSzr-dkE_Al zRh35Exj_&?Aa_FNC0<<)ERSy8`Kn#PlUc52QFYjK)s>f`TPC@okX0>@^`me7+aJwt zk+f>P#;OYsTEE`kfA)v>_dmOg5f2%kyIP94jxUX%`&~t&heL8UaqEOw5ytiHJ^Dq68&)(|TFZed1? zB?&zjMZ+8yV2$I!xjY(^RtAhyw(CAVLeWmNqUvsFmNtU&RUg!Da{0O*LyFtk?jVMg zE%wC6y)*aTxpPh|58wB;!%RY$k6&J$D?+f!BC+q`%+P%aZM29L%gwR#b|)j|$bG$D znjN1u#uhl;aKx^f20rJ?EHjH~IdH0LUE$$F?Th8c%UXmvly?rlB1dbXw7b-$njCsH z^26>v-^3LUnb%O2wR3jLRrk)y%7d(m%n|RPz}Ug5i5rgQ}!fV5S67 z!N_BtlEDh?Fu@cuV8ayz0_C(z>*DN(eNJW_~qQ`YGLSR=;ZIFH-IG9abZCX^i=~Qr(c^Kv$XCBu1(Qc)W zelnoC!lJDt8Y&`sm#C~9sP4Su_2Ffrdu9Q3G*yk}V>@er0X|ky46$f)mL8OZK?O(< zVFT1EWS1KrJOAKo{UiU(KeyMnUw`^LpRcvhfbZ(gvK0ndT+jFS2zzC+_XO+#f4<(s zJ>IUmD+n27NKL3qXiQWn+zlZr9*^!^5w%k^tkqcvVK**YYwdZNg}LI3f-2o<&oBPC z-r{W=KD)*BNHXHv-m2GKSljFuKl^^awwv1(O!k45$W&s29$_kRd{(tzOgYyw27z`$ zC5@oikfTzK*ZKA`$BKRY24&r557e|3 zx6IahNP4Vm;ycX+lp5BVRmr)WIJAkX`8CrTjg~{PqO{FJC3kC8R+~US&=a$uid;~4 z!`JLqWQ0`4Ae47{#7y!KFzg2B;smvj`O=B&jVppZO~$7J3{IPN_R&r;uNOlf!blGR za5`w*$MQd@Ki2R9!*oC!fo`GAd=NdemK{5!6O~DEBtbN0wpbPvw|tlAt*zK-Sg9%5kY+?%orQCO8b^^Dm-UP&n@`cbQSG%VVlx8eq*v{^Tmg z;RT;t!!c=2X;D?j@M<+UoasVl?sA(r!Z|>VWRL$DQ;jrMDyhc86?8yZO~OREq15KW z&V+{(eauZ5zj~O|ZuIC~4N-D>Pgfw1iz_@d(T$xvf~~?Rb>`%b1W^q*jg~pmj!1X+ zR85gwtHPE!*-iK`a3QdohT*cM`dU$?v677dP#@LFj@b{QsbOG;qJhpm)(}W{)wpiW zebh(?yL&j$Ql~1&Mv{(h;iDtY$M&ibq59*KAK+Y7)3`jcc7$cABvWvCcdHUB)J5}A z>>>uE%ZQkeRi7g*eDL2>8wVnLY55#_7ru%&h~bUiqirg?xM_nmUNs^2QG@n)zMD2AQd#w$76a#n}<_!IIYmx zO@oQFIxT-yzMRnfbrE^*Qn`hPWv8I!rg@6hRTV3`3o^{+12J*hs!f zC!tntvU~S9QxFxsDnJMB*Qw>Fc^INtOp z>ZH!CQMD~Dmk9;(hkgLJ0cXsD9q2JgVm8NXU4&sNcfrhBVtd3i(Qe z>IhR9O3fx2*XI>$n?dacRo(Z^PBoSV$OE(k+?ZJr-rWPQMYqwri+=vl$D|LEO#}^< zrQ95whfJp0eXVQYfKKDG2?7jv^Zl+XmM_2e?m}ZrGc$YUt=(qauxo{_&s?lTiypx$ zl7+lqU!63=65XOzDWY;LlW(!IswBbIvg%sl-5_Lcs+@4Q)Z?L>vH4Dh^Ri1SNRu&- z2#h1xee{mk>*aL1r}pHRX+!rq(0tAgn%pfnhS{!kSY|E@&h`qbs_R-0f7rVE>>B1R zZbbI|dcEFN_vLG75E{g>vGzWJ9nIBv;z!dn(e1+>9KSHmh8;46loR|IEv@cd&9$Hu z)HxfRYH{w{p)Q$Kf@Y{9@OnOJ?sjF~-8AD`F<_(XdQ{zX&{j}WHa~R z*)mpv1OZsky6^H}*=uLB!ylhMKP)bVRb^}b_(d?>7VMSp?_US?z{lgtOs z{7EG&CxewK(9IT*(9rQ)IsO+DyRx$5S_jE>5J`l=&eT@--h&3{J`V9&@r>7LekrxL zyWdqMllg3Tvt(w<8|!WFEnzKF73fYAr`tmSK4SPJ;qY-cdkiWYn_7N!)$XcY=B!M* zukcoz*~e#FRc z(0#%kt??Wi+stPX@)Nf7Ew$l?;#TvG3c%Exbx` zS-$2Y-78k^q;dCry;0d7R*(yHt5#P=_|End0BpCJ+}qab)_{Psr#K|)-r2d9lRmvB zcRp7H1al{VsyThs=GvQZzry!!XI5Uz zNmQwGdYI&~YB!D59PJkF$|-<{IYf4)X(86m`n>r4Z~Pnhv;V}O|4aY* z|M$Q1H!fE+L~mHD{EC(~!AxI%txI=`?JM@{`Sw^){pJJ+HacTcurjm~@L zQ)TgR77`g2sYCy$ssJtbNGytY0rjf4%YO3X?|$-2-#spme)07s-+!84zwDoW|NZML zuTP&mxUTj1(c6#zj`-#8@afYR_#gc3pa1PY`1$>kbzKV$ts<38t+!8|t%4ZL?RwaR znP5$C))DoF8D#3Rsijbzo*UeE$U{(x%aY>j)uqSvmX<35sNI_uXl13Z60l7U=fA(Yzb4Vhb=vT#h^ zL>g2FhE)bk=-EnTqWcnsEV>U-L*1%bK!8w_K@K&yN+PTUR?ioMF0#>Rz{k>9pk@L9 z$QnW&srjqyt|{`Ht+BzX+CUMSD~>S#soEYv8++DNK7@|d2p}Bf6q!qd1ap|c;Sf(B z3OQeoSvAOL)t!SvC7bOG9T!8l=;1OLSXmx1Q>cYk)u4h}NevGoC3W>#tsW~C_ugj{ z1i)O~2v?@_fcXussWMBsIc+gtRn73(S=c!Mrkw|HBWX^nrZ7RG?)DgPPkXq3p8AP!)RZmCY>ep#P_)Gjj3?sP{Jf&YUxl#8nfWmRpy@A<35@V+QExRG%MsJa6a@4 zOiczagEW-~qr%Nck^++@+YDYyogz zRn=+-F&I7+GFxhuzco=G$Iu!MrFuA2Vvg2qci_s%jafEc@$Ehj%{9SJ%a z^n-f6%`0GuHiF0pRW}cD|gp*t*Xw>#g*N@JgX+ohLSV(zAcu2+;nK{Qg%+9%A|qI znwXs|j7J9ai0cpmcJ94ljuJRzeydXXF(`-o?!*+EnC<<#?^lFXO|1aYG}lzh(#B0J zH=Bz4Y>UU|CbEixDk0SUboiEh2m`j%P*tLQDmJF97A^MJB?m3B@4eQwl@oy#sos+l z>>*zq_GESSS`WqoBdf#QIurZ#d@W!2h!nO?LsnCrZIH#9pi6d6YqJJlx9j*vazwrM zp=*N_e36>XxCT=;GeSv=cE|>8S#7c6Q^>4otz6*!de&V=tZNOKk!GFc3rOv5pHZiE zttFweeQG>Mfh^GjR8~3H_%zp~hl17Gog>TM`{nM#VST+`;StM4Y9pLrRlzOP<#BbF zv#Xn3pvyeMY%MWV1sd34ym$3;@BQMrLLV<85fi5X+30)k>ROLrm|EdicL7C)B>1VW zb2EZjDIhTUWlFs(=N%DlzGC0EEw{p~37sZNN}4OTokgTF;b61*VN(D&m;4AD%wMCr zHX{gMZ;$o(CaY?yiCfoWsVeX1{d!(BbaCjP5t%ia#8Qc%oL){*;j4F=Gknc*x$^{d zy2{~ai%~^l*Ce11a&cX2-y1{6p%0xuvlv4Ll)<`ox9IEB=T9+XZC9m?)=Hy0gH-PQ zzJHOgm-|}RTi2agyV8YNkE$H7W2_aELLEIsGKWyRn`SaoVY*+d+g4=CeO%_qPLiGN zrxnL69d%?HB$Fv@H)WTJ6?%h^eg#@Z=$ z_-dF)wIW=y+%1QORI_MwIhZ}<${waNfyxF}T4r;)t z+DebdeN*UQts#1{ru{*MYxM3@VgN@+INjwp$# zHW0|V-LEm4RVACPTJdHUtv2&S-mmTMU7BzVNQ<7>S1j9weC_aXc{{T1h;^=^1%`Ex zw8(wmz5;;9+V@Ss{lP$IQ{1~CMZ~mI93*i!-MZ2}4%o%iBfm`;&^i7=H}9@71kNz7 z8vp*-EZPhMBNiDGxbB?hws5CRoq~6zjR^y+uIz1LW-k563e2nL zfCE6Os|U!68J~F8E)7jE!eEtq7(H}CO?WIH{#wA=+hAMcM-;m6JIy>IvWw)fa+_ry z6Z7gWhDitdsU8>b=oS1Z4Vowi?SqOtJr?Mr`DBT9{_A%UJ zZ~cv5|J}d-Z@m82Z{QDq5A{82!-?L&XT$@3;qy-(zx*eE`Oo~BKmK?B*aP{@-~avJ|AU|XEL$cn3pJ{DRvVT8`qewjWGa2=o~bsCA+Tw*09$QvbKO1BdRf7& zQTv7&G=dVEV&$GJwm~OMxqI7-v^)FLvb$tsA%n8=Z9S5y>T9ie>?|Ui>Kj98>Rnl= z8G2kLhY@8Hb0TTTOfyR8PLG9#kvSb4;A8~*1VoXNgRoF_^CYu+x+J^d!;`DEyt8~c zNTCfJr@Ks9q-&rNU7GJN)qquJtV`YMO&;#d_*>|+gBV|fon+HwPFN}>V8m91NVl#& zaRfDNfzbIYXMaE^k8uR>flaU*Tw$d#^jB}d;C^Dbjf2$9oLt*rp44OiZnGcATq+4I z3+w8xA>#_@aGwQ-igDS!cPy*K6-%79^$xepa`&U=Pkl3FRiJAmSbERyJweLol`oo> zFM~d;;|)VNl=z^?cL^SmwS_iYZdR`+XF=8zD(~?*&9=)eIQ;-qt8S_u9@=nXn>@{1 zGL2tqCIB-hCq9g#%mZ0-+3MlWoFLVjLfgEP?pJtqsbvGz>8LJ@1zZ$+wx7GIdOIB+ zvt!II01;6G%AfOAiaAJmwpJt8h%LB!;0T{+l@$tz6?4fl0PIYd`#9JQ zHY@M;nM0eC@YLzA5v{9fUaDYVqLeguWfpB{lxN2Fh{}Qv&Zp0S%sv$poc3j?&1~oP z2vr&!4$MkN*2-zH5xP+3Ayt)ZR%M4))#$-g&*pFF=z?))8QRPzRUON_B*;lQDU{0O zRZW{nHDX6)(y7i;^C@tUzz*R;w1~tT`sHLn9$|cQ!YlJIo!eAFTY~7 z4_b`w-9@w9H|2147c`^MhZhkdy_7~?9;EHMjXwTkh8yfu6GxZ`+P=4is<%~lH66iF z&w-_w%?OaGgOIVHdg88`b>hGU865=Cj$vk5Ln7BQG}l`LeHXpC1?)+Rtd33?EX-0%DS<=!h6 zK^b8#0Hs(au(Qmm6dk$c18_L$)zj6fO58ww7bfU zZ{L0^qsgmNsOYS_dcQ1IIQM>W22nSsP@sjQD-)d-@w#8jm(5ESL%(vcCbBy30<@e~ zsF8WxeVQI*r}+eh%3N{j7+5DGV+MQPU)@(2Cz2Psq_k_rdeiVbC7?)L^xCiI^X^@; ziebAVpqd=wTQDJtIi*o9^Uw(+P*wBc;Sey(Z9-BbCm(*MX>79XZu6QjW4>Ny#Oxmn zGP(P7{iw1U%LnR*kK`@sK(WV`0j7ADBYidhuqlx9GHxutqsh-RSNF3;Y> z{h(9XkH_Voega@CxigltQR=mpTDf1(uTNJx`55PNWy6IEzo71Y&m(PN*}dTA#+Dme zbb4kUG+t&82W-p+-GssW0NO_S2*4~bLLDPkS6TQZtlTEBJ9mM2Jg)n`!(&^3EK_tZQLSLKti z2;cW@v5dO2BUT*`9&Ck?1oke9b(qUVv)QlBrE8$|1~w6~EDRem(+l;E3a_$t(SG3w?GkcK$yT{}Pj=#E9jIf%SvYm$MSOLT0tW=Ob?=8*?MeyoI z&{KEQI#E%SplE0|#%NZTX;ht)W)Ql?Zn?Pu8)cdrvg*q2x%t8TP)nr$po$hB-6$U~ zE6|MSab3(yVjK!I=Sj1HG=W_i>)N$v2KG~RFp2DWl?J=bSa$yD#}l=iggye=12Tlk z>D?uX4iYN#{Gww*Hab+OA!oyBy5IMYzWemIfAjZ#^*{cP{>T2}-}l%4pMMRPKMb`y zE3WHu>iPA_6`g$h{Pz6vzOx>SGKWgm`>r8o0ZvWO&-UK-xJp{#uf5%@@3Q3&d))V4 z%lEDW22fkmt<65?qh6VU{?1?d?vMWRPyEYo{$Ky<|LR};KmV2IZ~q2fKgYFreTvK8 ze)70J|5${RP1erDuATMu4_?3f2!d+m00961NklT6 z|KMNz&-}xG`cMBozyGe^`kkLXzkDy0l`pqS$)oQ(BuA9RK+dRk3k?JTu1fSo-TFD- z83-sEo+nwpUWMwKSn&or zaLRfs!J^sTPsI|Hig2BYWkRAbvnG~?!y$pg&w^`;&0w@bjk|hWk7yno@i5)Zy4#KI z2Fk))@R3RY^GS_OAQwc-yiqRFd=e{0SDmB%BV*Qem=|LMnGI_n31VQ6G!IPA=Ey7* zj8?7XA+kE#e2m>x&yRs_H|}biA%EiFtg+ykq4oeB=Hg4kIsTLakkm5Mq(0pSH1a{1 zCecoBtIl?VCS%a8arjiXie^83hGfz!9$ zVkoO=&Mx!ula5_UG*y-$TQH#oUl`q)jRtGjB*$2Nw#G zJr%uDu}N@h;GMp)sWBI_x?BzerVW4uQ6+apETOu3;1>dRb?+X$cYwFVmRa2Q)8oRx zPP@D10fU<qKm51AXE|hzS!*HBQSB^5yVdJ+Fq?B3p8{-DI(_CM&>)3*HjYnt z&h1j0C=g4o zBu(tSIq-@8o5G-m31#k`$1OET%s~?hb31}es$L$HjV?L~dKyiZN0b_$ zfXr?Bpv<7^#BBzYi4@wyQ8j$d?lSkD)I1Gy!=JQXYmlabp|j_YIL2mjMGPq6_53nf zrzz3%h*p-y^kT+&nd8tHhuXMxfJMZhTOHF_wYv6nxN5l1T=eDS1UjlqU4WUbv4I7x zeegYDW`Z2o7=Wik{E=Yi7cWC=i&tULr-Q!lr^cJ^3 zlxjs(^>jnFR5fs>nUP3L6TEk!lo26lPOKof9#E>9(nugx36xnVLbXo=oNSE0bIg@s zQuR$vO|8J~5e;^#z11?#81CI^&L%JgunjH0Vzt5CRIpawug@Ze- z95s^G!2pZRhAry`Dq+)CW__m!cQ-iDMngB9b#DR1c)Q}RN)0Zvr+HVPUsuFR(R)?D zx;INZp9b@5__gikZc(k?X&#M|Y9J*b-(vkD6PWN$8O_4?-T{Mi{Am%Zn5}ek!qi*9 z`28kl3BiqO`?!8u?p*G9*9rtLKzC)B8|{_1M}%KZpnBdnE4=Ufx!+M$hbdwyTxLa4 z))E)*PE(t&hk3P*(_gsveXYo@SkXH*ukE^z19)QLG-YAA(bf6UA2@eIc{pKN35ttV zX#)wC%zPN~T{Z7)Bj(!B(YOm{BBp1tBn02$TMO$Ud10E|qPba>`K5{mxL=r5WdMTB zzMe4iszbz-L}N9n#Bez!sU0ECzG~E|57Vo`MR=(9o%?Y;RB+>ptEDh2VcNohX^Js( z>rz$63bcli)pDQJPbwdlVtM+Yx+asJ+H)aQPAdIXV2v*&GCRL4uwtKJjkZUet z>b~#I@F;?l6twCL3$!(=^Ij2?ukUJe*B(5HNR-6MZtvSyj6pC_C~2r{$a3^xddc;4?3PC(r+?L#FRTz5;#>S0e}h)$F8Q271Y zZZP`pG+9@A1Yz&5=UQuQS^M6D0H9yjx9jqUKO%R}^;Wgv26qmDK9tX&zrTO=cnF)K zM-Z-{O8+Mj6;B>QAJ6Tn>#{SZ=Vj_ESy;T-y zAK8()xsCm?1YB2i)tyg6Om|1_j9{!c0VB9heP67o&Yl7+Q`HtI4h+igeNWa^-ELM@ z@mL_HceGg3ATAkQ%WNYp9<_@rYS$wo^93$<$t-t9EH}~^h}V5zSEwMWQdsmR$b?V@ z(j{7SCTR#jMXssA9h*%n*5#_Uby>ZWoVJLG0bTA5-TP%R)rZQ;bv<%ty^0X%rUoz@ zj-J_{t}0u&cL^Td;`G-{mxG2Y0JO|KJI#sl$(yorY~K#Fh66WwsBx!THAq(GNcyon zYo>j5&F!&kw=E~FA!npEryrF(F^-nZBD_DikMoI=w20T2Qr) z%yywFZA5-dK7Qg^s%9hYtnrVTjm{ZzI+GL2QGW!!h=VDZ0LhrL+ zsZee)$L#d}=)+%dbpG?pE|bgJCTa~x%t|-s**62IDMgZox7Xv7Day>oqhl7;P3M7f zyTQ=~GfqD!2mcMhIS$nmIZ+3E2*)x?nEDNH>eZ%w+%!d7;$a!VfSlYZf$95Vi}sOM ztcG*SL1y|Luhdu==FJlWvV}@%3`@S_{ab9ul=Qe z=$kM6|Nh2bCw6{)7pxfTT3^3D@7a|1J-EacAsN^t;1w`+P6M2T5=zPV9O1OK&b#B& zC#%YPUvB}jUt4aSs(R6^tNjr)IJx&;vqBMITqg3G7!SXOh&w4P9crBf3E3Sq3zlH!_kEk_VH_pOq>`DBqOx#czb8HJ%Qel&X5(6z5UCBA)2zB}>Ia+V(Yv^4&FuaN z(D4AvfCdI-r=BJyACQW{+B)c2A~511j#Wh>!j2UpAyqDWWN#_vV+E(}~^A>MolCr$$_XAun>EnDZmddU}!-_N=tY)NDd-*wx|V3iOyT z#{_|Wz|GY|iPAt^u{>%zwg!t!4R|JR*)mhqcud&nQ@A!e$Lu;}aDpC!%oplN%K%^+ z8v9g-xKLAaHM<6ScWb(AidE$v5?=Q!!puV5YC(-~8x}v&S?aO@s+r5m#Saet>`CWq zGP1OTjsCD?k|-977>YgTv!kq`>I^eC&#WoxJzhDttOBQXuT&Z4MY&t{#=O5F7HF0u z1)IkCoR!D!CJ0h(Gb)7vo|_ZHAI@p4?Rf(MUXn9byk0L*m0E5o_#wqaquqkC>N1nB zOS6|18)a_y>-Fh+%e=9i&|NnXz7|ASX3Ocu)yh5~^VyafW*aMI_vjssLObUF8Jv8f z?G`Rt6bg;K%TY*)ZN6xhtwCXe+V{O^O%xF_Xn?RfN%E09K-C7#2R!a8;3868yPOK3 zRAyddJnJMCe#+0ga-K3ki(W07xoO%92Sy)en(Ndl4rG`7R64QU`;}m-(*a*s?u02z zRGX73(c##cc3fGUZ=$)=t+K)v(R-IzTruo?Kvn4$VJ?nR=mmDCv-kTm2D;*2ui{$s zr0dv1Xr^vt*GTaJXQK>k$>FE=xG@1;qfNygNnaw{+#AEVR;Tu!WWC^>ZOe!_v0S?V zlS3yU2=HvKV02o}tbnFqbhv1Czse5bK(q2(-X5-XVT`~4Q1^X92^C|>!m_JjF3{1% zhCYIp4aM>)FN|=h+n800%<1|8YQi{fS!HH@B-b-5m>a&6Y8e+N#xLpq!7-7{_ z@2c*-Wmq1?>8J0YmBcEj-EHqZsa3i)rR+QRaAvF;=2g{&<&j+>8oZfR>11)Ljt-dt zf^4#nr~lC`s`D5WmVs2&PI%ZrIE7lV%$AwU{1^-&cYl9>qRLc;4!d@3Fvu!Qs)zp3 z93fbCjz@qaTC?9GGG*qSJrZVRUXKUG)Sf17GjyRl1;kpKunos4Xq9)^<;FTH&RV;#VZ*!a%39yV}Dfs*30m;(Cj1md!iCM9gL;D zNmJ!P{I0l~>Rl`R>waAkCU%#HBfEB*xlp89=FTomsY&kFpxQklZu6x9pYgye zU>55EwlU1Rc242xBzN5XD6)XVy4yYO{dz2~ZkhR7nkomiZAO>}S_kb~O%T3J)h(wK z9&V_vYpr|d)TZpcKV27~5>fRC-*>%z`-$sfJX)6ZDs_NHY9I~fS@^Q=`|B6>>!NkO zK0Q9&uX|qN#ei)WI4Df@vMAAdu!W3k?cUloPl`-#>{2%(qN@ROTSiotEeElCqh%*@ z+Ev+|A3y{voDHm-D$C7OWtukT4vtUXs+va}ZIdO^{c3HRp&EjFsB_GijoAZF6#=0J z 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�G}FS0Iq`91@OparbU#nG{+++$cl_`de!SlQ*`NKvKlS2xh)!iO^Eu}@ zYs)D#2%lLMX_HO7_C0itq0gYCo;7#0d&~94!;7E!!WZ`YU-&=#?*HpozW77m_L(>L z)2n(u&*#c&_$pdO`{9rsb~B@OTuYEX7M&G+-1dFnUp}2LpFaEUi$DLL{0D#d-}?{p zYk&D?KmRA~c&x_#`QtOUI@N8KIvn8g%hCaePMN0vD?p%{H*-lvX5B?vEDL`)9&d3x zto6ovbH&5);?1sZc*Cc7(gN6;`13%qM_=eJA#-~;0CyLY-NVCQ?mP~wTZA96B90>- zXq~-)CC%{|0K*G^R{5EPK04N)qt+kW)~U>Z2b?cnhSj>G)$$G6IkUmRd+o-eSE%pdfxf=!}<^Y;J^0cU;1j+{_0=&Q^4c8 z-GD+i+2t;C64BY2b#CoDuGWn5yc^*hvOY=l#7^1I+zZL|;=`|h^{YSd$9~m+U}Q{r2~N=s*7IPy8^d&-2x;y7n=4Gk0SL5d=^Hc2jBQVgQciJc5~q-sh%4;m70c z;mvqFd_9^kzb$*f|DULT4YzH(&ho(TYpwM$*IIj@i_Xzqwk27zB+D|s->@BQ@IxRN zjKP5vxmGSk3Q|b{Ar&wrB!GcRAWsn&AtWIoDG1nk5=a8U4(8(67~5P7zRK8^ZCSFU zBORTy_g-twIeKsHs~>G_=Z}6!&(Ya?tvSc&y|wRq-*LV9_0`q&Hm5djqU1m8a{%)jq3+vixKW|HMY&n$#BYSyLt{HykyQ8x_TfEwwzv>`{ijoF!kGIqi?MlWrG(<%_vb#`z(91> z2$jv4-L^2dl@k{1HE18+vw5?YM9N^4sic)hwTK2_&b@nOS;@j|EEf%GF%2m(yfSkoRjRDa zi0BpN!8tV(;O4!=RTo;ca%H<^p%fI>skUgU2wIUqS%-6VU_#XZJhw_LsiZyEf|l~K z_6YBU&iQ`&c6Ia23)jy)V;(7JW#8W;2Fr3k=lzqrCoeyBY-oyg%t-72l&jY&GB;*c zYK%xML4b8Lt6|KNR9MO$d3cw!=j!VQePmx|Gta97Yb0 zadmaIU!FX9^^^CH9#M63bs~_nK;M4%lY=ve)kHrPU9+^K@Zqk znUXo?(&o;79fMH$u$3#jTyum(?eI#FF@{##+zp_Q5LL{zMO zXizS}>2XY}#LAS4eJed$F%Z!%9&gz;`iWM~?mMfO;S(Y-7Op8#gjv;j&%_@)7FR}y^)1Rh6Qf6Q!Wd@3FeeDE`gqcf6YNjVh zY&0W|WOwcrLOdXr-5ljP!?QjNnik_fhIIBbd-gq!EJR*dC!%(GFs#R+(92?mN zCCGG~?VMh)TnV9;a<0_M){B89%vz;I1yB;R(_g4kIt;m_Y=^kIVNqIA10Dd>N)~&} zXVyVT3yZ9UBiV(+xO2RvJ$w{Nibp*}{iAZQSp8zFwhp^xrFAb^P`81V$7l5b475BJ z2bNZu3klJ@vLU+@@-k`-S|%&kgo(4}eim#=l}lpo3#?O&5t|Pucxq$v;RG><_FQGi zO!hg}3(zcAk%y;~l+&Ei zL&8GBP+e7(!lQvR{l-G89cmq4#G~m$H-oA&+154{kUh~A&@Q_E2^*FD z#~R!A_+vkde8qwk!fd#~Lqb1uVOrhD6-djRnWcskr;w;s)yW-i?E?|*@RSFek5@tm zqCUX3m!fSu%Zncr!D-n_WQfXk6`{szUlY<;E(P5sMwd{W( zkgC04*$f$9RRnfGjjvAA)3=9@Q%(K*zxQ`M|H7L;{-GcDXP)CSC18oEePt4B?sU&a z8h5oY+ziWrt$#AaOrVaps9Ag804xZog_X`)C4ym+RhO({gNWnF)GGouCR9hK&3NQ; zSD(8{m$Yg{Y!KGmd+kwGD_7-mImzq{wg;p!=BuS(y2O6(+oKedyp^S$DXW3KVFo3h?NGq#q4eOS@5+Yz-H0XVsS%<_SPt!=^dfa~G zXYW7oegEz^{ioma9sk2Atmay?IEEOq;0TiGz=)#gV;f-&gTyXbL$I)!fRN*4w~ueL z@{j+KZ~RMt?Ys7ue(IAy{}T_ls{yQ;okF&f!&j-pBb`$;KRR9%b8jJ{faT^=FV?H4 z_(mDz?q*JhwKGeD4TA3jT@=W^CxR*~&<4HB%Ys!orNRZ^;$W9Wg88)j9dNdX8aH|xGF%CC22ou+uy;$)$u+ZabnCh}mcOy_{TMTvP zUWCfR=3GMQSgfFmr5e8FDmNYs^1kCb=%UJ{V3ahoPTOg_eqiIeic6@6QV7H=0thzZ}?HC&miGUu9R^ah;N(Z7&5#sEaFjHCSjZZ-3WuNEA^L(pZSFyRHCk0TskAAgf7F5SI$5^Tq z*r9G7Z=$Z~yW3ie;9=(G(e_Vummdb(w$V>+^vJ-xvbyvI3f zCqHq%yJO|mX#_2mFk@`Aj#hMQD($tn{djy+s;^nTlhGRL-^B2=m#oXzeJNyfDjO@{$VtnR7J2_Q!Fs>ulC z>XZMPv#RAb0-0;hSu~>`?1jUr+uRX%^B^OI%qgJO&ZACN)@pV3JMlsWi8fdCcP}EA zR3Pb2uT{$aC07`?;R5KKbDCI70^J?GJps@oFDbcX)ni*_^|7N<<;?1BOJ?QT%^`9r zFRQBb;K8%czwULXn};f!i|3p?gfb4JnJoH%UbUZZA3uKb_^~eYG=`ySPF3|_V8rmJ zBI12c0I6h?h6E31K~-~3cQfcPAXNg~PFHm_wNbe&NOG>Js_L13hgwudYu1iQ4R5Bk zNIg>PT5VLF{>qo0$J+76(Tz)5#-NoKMZ;fFuuFENQV(eT9xX zs^k&w4ajW*jv!bNA)&_v)^`S`#xSF8V^}n{)m7;F`JoSK0G8OQL6E=DZE8qc&%1H8xzQs4U$ww;^UPdXbT49E_NoHHaFC}i zxhplybI+n>E{`qDwHvV8Mq6AXl%qSWZF4B)nwd&-M=>>fr;`OxS?UN6SOUVMPtz;+ zLb)|-%(76K9%I(*FU~OrwUY4{>hVftRvs`ml3s~QK>#Bf^9Y-{phJCC=4L(XtqH7R z2wU!eo`2yrdx?#5D$r^Y5mA+9HOA0^T<_+G$n30kDV?5KBL-y#Gmq2hiojgCMMMOT z1)ia<-oKa->Mgf&e{k_FJ-;eFO9)0}LhkoGS{9S+OTmIaC$EqjyXAIv?V=@6 zVJSKH%YDxC?fG(dx!hm&b>7!1Pji#8=B&Bqx_F%IbeiWm=j~^{^KFms?*n@Er+?6* zGMgZltc0M1)1=iSUD6r?(IKUS=(ZqK6RUXy>mAu^q=Y<^!?!_pkp3y64HU@$oIP7B z^w*bVQ<{Pq2doNLBlgP$!0m@VJg%=k_7DHwGgmjxN?1Y&CadRAJWB3(S`fhTC@!Hm zFBeKGRTV}QWERc=DooCD>y6)Oi(%$SQeJ7*Dqb7_Hf_UcJ<5|eS4vYTO!&Q0`(;%w z8&)*BvDQGhdhKm%oOUNgLh0A6#shxe&JtFg^JV`v3)=i*2+BMVfo zUk*2!z+_eBQMw=+7ZDbG3YatZa3^bJPcEEDL#=(f>T;gfcKXPVzkfV@_QN0k$CjGs zv(+@z(n6eQLE2^R=UKVd`EH(X&v%!*CwGtU&v!9c3Da1)ygy#T^$5q<&$rJ!h@boT zPuJzq;}8BMPdCGiLaO9i*=`&W(NjM3-}Zo@JbhKN+)sJ7s%=fl>mxt5p*i4X)p2WkL zCUo{0YnG(Smbj|{iCs|%cZc$zwPaN|kN)+lxiVGC?(T^y(K|@IYPDDh$MLQXvnpiP zt$DgL+>Ol&tz31P7oz4&0;_t{grZStG%qPFHm8cYW+m2QIH~ZE+Sfo<8O&lZCE7$W zZ58NOmUg*c2>i(Re*1eq^NU`7|My?Vvrlg4rJG0dY(0Ia^?FgI$}DA>WF=a!Wk3-% zM#Ky|ZFfKak@eD#{OLdcKmLLL*KYype18vY+zhIf9idFnHyo{1^0kbMI$UIF(^|+$Jw9A|pN~*-9p^5W6P}wxu@pcwEs%@*)56qm4Qs}pt(8?}X0>va zM#N?Bt!H1ll-c1jppaSWoY65+U`giI_IH}CHCHn*itd{XODTvpP7fY%Y%nV>LE#w2 zyuYo>WnONpW{{`TmYF)#v6kItJJP`Yid2<4I?*>Mf(vPMg1Of`?+xu*b6=NL$~rE| z%fq|hTGYNz84#Aez|IxpbPUq1fop3uI2hU zRS5X1q7hkc!7KnPMTTEL6Y)%pXo%X(f-8JeLg(|kd$RVspoLiplZ9gRN{q}};n9_Y zN~@=TST|>@IH4-}h`v4_&*6UOs4A6Ht*CK7c$rn1S$4?FbM5<@3s3+1D$Ti48E(VF z%{o?5T7-4UZi~^=q=trsp^t5SeqE}pl%XoeHl#9C_6@*Ht3+iL_>?Tu1>s!k)da+< ztL@5YYb|AZbH2MsX#&mB=hZ>Eb-}f;F4J0~ce;A`n%8dEHq^`!Ll{>dnNXnJ&qn6OfKCOmWHG3|VXp46B z)x0f3>1MQUaBvInO?J-d!#f0&syS07n60%sZqPn*b5^P?u7nj}9#nZ)W*RZJP0hc7 zBrg#@`u3cFRFrk!#kZ3I1gH-f=Hu$&Gta*GVr*Bi!D?gka-d9!DrCFHa$f5Eher zJ#)$`k5(_)TEEbAw?0c5LkBI2BGgJzV-~_pD?Plj7(rG476G`o_oFEVkVC7nK^ixLylK_+j(FT=OGB+2{CmV=5f#?x8YZwzbcfx}{R;)5-`~>#w^b_(C&!u#DzIPh@L>Xxs|$MGSBFX)ak-p(tLQ%N?(eR~ zCdxckrKqYLQqdCh5to-=?UUQA47HL%5ilcW4YO?Pa1YK@NPw=aX5My1n8xfQW9H0i z=0vH#GFFwKHxUgmHLeTjolZycG7E+=EcH|g2U8Vksm#n`LRLtmtTS6gwFDhUw=;aC znse!HtfIQA4z*Rx;7AoJX`4S|bARO{Kltzd{y+AIe$Q`%aChFXh9_&EXBnahm*i{S zr|iMic4f~rTOTkiAh2I@-!Fzewvj$83t?4@&JoU4Yd(H>^YGP|UwQt8H@^BaKlI$E ze}QI#S*k7bplfJ(PmEl2OFg27S>*uoKVZOfJ9+sHNF_WBoptFuetL$%!8=_?Z=`lMn|k;9J{luQomqwT@WZm@QR^_=>MoOpLP0h4fY+jXAx z;K75uOx*wM-~LBGdQD!|C97iCl7OmpnVeXmak|;A%<4*22s5A&wl(k1tA@Emssqpa z7@UiKeRrO(d-nPN{#*aYf9BVJ?bU0Z&y8+|vP3nZsS`C_O-{+p$&`*QAwj{Wr<==T z#P-pD^xdEG&iDPq4}F&d=i4X7t8mXkjG;jjQ2puJi)^4Q zNSRhSsil<*bkR^K5Dg%yW3!_K=!6WImBFSxb}EOe%GIoQ813mHL`=vd%&HL021`dR zDf8(I->Z&18myF!YqYE!@)1Z?&1z>4sS=^#gXTWQ(PRM_A`ayUY?40DIL|pWFB70e zQ_CZ$q#zAqubnd6XmGc=EKaBv9TZWI@9&8ff8jU$s(s!2bQ_yVOcCB_ zVG@@;({}UIX$ykbwzL{BDfg+lPx`4>8CgX!9Ld1+S?70u%3J=%|M8t){guD?@q?@F z`RBEt;Z(CekBn&tSgoq39qhwx2dF`h;RGR5&kW5bU{z+E`$VSp>{uO&drNH-$sVew z`dqHqGwDa#+r-Svbv?Yje}pQNaR8Smxfcy?E`c5i9m}L()q;9%e?4qRq09Lk;c?nV3?f7dHJ1z+?h#U9=0%q$ zR0k5-Lv_%&Do1#*_GR?Sv_K3uU@6_h`83Cbc~ZAPr6G)sZ4I1bB(Q2JZdZpB*HV3Ej;S-Ck$p>`=+QzBY>?UP*$1-7VLam$-d<@Xmej&)JEEyRwRM}&V4iD#AMuY{aeJwLn z3B{!(QDxPeek2L3>?a#7#;|H&l3NOJj&7hb<}Ro`2}BP(|mazEeR z8MtwrZdj=zXi=(t&c-0v;ch0Z8~2m;w3ON*0ooB*>I0rNIey|s@MH}@wBOov-lDe2K5p6VZ5cRGxX zbw6IRC9y#Xa>Ucic0YzSJTg1dMjy@UKju}CN_n)Gyrm5(lgk9GT4vT-m+pzIlr=%P z9c?}1?6)ZSQ~_l$XoyAuyyeGKS9-VVOzwzz$HSzz%k3S`u(BjkS&Jh~ zhLo(T$$K7Ke=b@&CZ(GLUn~IE5fr=f0Rkr!H>NEd;jTw z>9>5-@BVH3TD8{Ln5kZfnxN3-$>rvm?X*1yVHG}pw|?r!e)6NYFWW1RU;i2Jdfz)f z_4?%Fbd$)nm+tN{2IN6j`Ru5l`IEc*hc{O*z5Jo)Uwq@MKl8)SzWMDFv4tt+*3{LW zrqkqE33e6Q8oymk70Qy`*#P9nYsEYYIBjNdcbu-TkAaxsX>X;hO&1+AX93(Rb>4^j z60Cw;;BH3VjQw&M+k-#z7yjpe@i+e3`}3!4K1#D0U6~7H$DC=MP(eFK)7I!G1OWmQ z1tAhLX32)kueQ-`@dh>t^0KF^V-!!(^g|pCQ^4BKLhuIt_~Lf;+{`wPqqB;zL4j(l zd!Xq=06Qv4q3U2l0k(6UxEbP-00961Nkl{vBJ4fYIST`S5?{Q3|C|0`iX3Y zOmi)PhJ9UzZ)Jz~-P@U{ayrmo6qqXk2a=Y4iWucL*kGy*R-tYPTkALjv71!^5=iA@;_P4zL zwJ%;j<3Qb=b&8=X-@=Vqw$Ub8s^9qaU-L&k|4V-0@Bh6QKl6((s|M8=_*P72PP+FJ zSA@xAL?#3QndRme)pJ81`JwN9_O-A5$$$I<4&C41bDV&3MIG-kr+nAEdT_ImD(tD3 zKJnz^AOE>|d%1pi{m!?2TG_a{8Ksl6&QC7e>FNSp2QrCTh%jp2WjxS7`2O$w)OWn^ z13&QHZ~VM}V!uCo#|!B?!UQm2U+Lf&o3g5wdBC#T7!qa-uvX^j)cuP_`~WDlpb#jF zO=Dk3mItj$X2`8gaN|J@z+$Roja#mS8 z5s4);V$i4iQbsxfxOLSXHjtBn+6l=|_3ZUS0M}J8Q?|FYv3OB{;i?~3K%(lrSNi4T zr_}}=kDJ22-*4OLZ+yqMeZ`l2@%jGEfxNP-v+lyI=Y2F9O;xMQJK>bpTm(&~_SLKv zw#}dZ+rR%${CEGt|K;naCT6ZNoVK!Y=Lwvu?x%QjbCPa4D|dU|Klbw<_iKCeYhUl- zr@+;AgUWp=QSKfbC}?Vnb(uKZ{#9T4CExT%zxf+~$G`EG*ZE`QUG zyEhaTf-aXm%pyD!mwk8ZvcI8nt~uu!I?>USBXvWu!3F)-u~=0NkT4tEhI=IYnUH43 zaOHA;x6eHy`bt&V*Ra!NKOg6hLRN;G$rzDq#)v-0d5pEz@dz}|(kWuCDe`nWLBcAd z+2G8DLO5lOTTkomd5>|Lq%LK(GWJL{opWBFwiH$+ClIz)hdy0KWZ&(&=Te}B+o~Gj zX59DX;m9hj%nF+Mn3+vbN%HE!Lm#JJAxoY4gbQOEYhEsQcK}nM+n|>Yla7a(tU#*P zB}o(D9xIbfMg$y72$WPQiV?oFLPD!ypor1yLsk({6e{Q9a5J(|%~4}-2GCjw9SjfFl5R+50tUo$6S}#VlElu^x(?2;TCJnwG!TYVvw{gT&lS) z=W}JsYJko`GsuHEbH-^y!}Lq^fL55zTrSMZ-r*+eF^yolFN0YXCXdk)aiy~Tm*@%@ z;Fcw4pLaCExaM6_&+VE7_ym zu$lX?pj)oBE-9xVyS~1;x`r8TthG16qugCKu~y}XAj=E2=H>25u7t0_5FG9BqLq5v zMni{o)X_h(UrA=76&5>uqvq!HG?Orf)y%9F+vYUO5y3fUFp|iepvTx&Rw}Ei^J^ZF zD=T-~My}-+M=Q#X3#JQ+OtYv;DzmSoefiIlIZ=*Amvr2eroMN9=Dm<;(NsN!^R%(b zEeI&v*4bOJV{X{T982|$*~N54xf%LHAOgiOuY(@e0yTF-b?<2=nrDZub~0;ugc^B< z1N387X3;=|7LOf#5LHuO#5!I+WXfno>)Q}XrnW>V~LD8$SXJTHJhX-!f0h;H5y4G>X2T(L$s&1IU(&6ny z%f#5QW{!w87mPIvZm@n^^~(MD6SCzFgi97qnYtCx)LtC;3X~e>+}q=xYMC2pLN%jP z!U(S{W2xy}e*Cj7e}ZGpY2L+d!XiBh`EYYWeDcbxuX{Iz0m*5KF||;|U`fLqRc3y5 z+FBeDTXgbm&b@nm#W`ZjIr|a}ld1gbYRyZ{WgKl0*@wZFTs|%6)3n!YerL_{U@m1P zl+`dOgM^?ZsxsZJBTl5L67p?}{j!tHBv~VT<}%u>Y4TR~8VF-$2g{iKRWt7a4UjO$ z%3Pq)?UZY`kQuUpwe~by1d$`ieN9%*RoC>}ec|Sr*F68)S0DQpKmxH<)m2y~=|e=W z431<9lG#Dl@Ep)c|N(Y89c(^sr8hxhQh43Tq3gfz&E%Bb|9+8LjF-WtefPm}P7# zVYV6pLZE>IWoQy~G;M=MXTu0sjyN!2M_aSO;xvvXd>flv6>g=Bt7m@x$NuJfzVMfQ z%YXg<1upyTy=@PMr8L)~MQCZ}eDM79M814``NrS#2mkbc^`GVKCtDGU-k=Jn>xaMe zYku|b|EAybIq!O}KRf2ySC(L0bqb2pIY7U=KR<}m5C7ozf7UzSu`X}io_lt`tdr9O znsq8Y+-2y|k21UN1E$R2q+}6-l16lv{In=l5r`Of_mBRQ|MZ*R^r@fr@cJY}n2QFP z515J;r|tCOi!XfUyWe$nWxP6N4@{3-qG=+cF8kbk|4qOCpZaYteCo>|{@K^RZ=<-Ct1OM>Hf8ygG`RI$Ud2J`{nK?$3R@l~2 zbegZEagO0w3uBwb(ozDn7oNYC-_Wm5H_sL=iKNtw6)D)~!3?wRs&!L!V<2d51sGI4 zwWX&@)kGJ{lCqMP;eY+hfBkEJ#h0uXUw=AX-S2mXE)4@_MpMbm)NKR6((B4^=#Kz& zqElh+(iB}iw(s(<0ce}EH%-!XyRuxn03ftm--cQ%#+yB~MdfjVY zT(_6;;6d$YXf|QCa&^TFRt~Y#mJmY)N@c@x;VSsC4}CE0$x9!7G>~`qmvK6+Rn8_- z31aR$ZtP^&34H7S^lksnZ~wPG_`#oK0$73(n{bA2Z+++c{-Zzq`@iAW{F7G?pSx7q z<#y*5Ren*~Y4!!PDvwiuiq1puX)F(zxi`Ny(Zs7I54VjpseadQ|E>SopZHTB{zu>Q=Fk0t%PX(IPwF#%_gh;KODh5^ ztC#@U`auKRutzY<3=2?E%kAoifAmK`_R*JL`{p;Oc8i-;bxOgSS*G*a!#(1JInR3$ zv&<^HFQ9$TXPy{Nn==30ty6N4hDYXdi^>#{vuJ$?Z}waI zHr84_p*HiXLQ!h49NVEq18qP{L9QcWpei`ry)sGLhUKvcw90)O+srcby(U9GED)Y^ zZ-UTe-v>J}kxij+a;@@VG!LT^Ar$+m?V9xU*1zt=a`d5NsJSjE4yUG+Po? z5NYnLrCgOt?@~ghAMGgQT2AxmPKL!`rU_N6Y($?zrN)4I+jpOmN9fKJ9z1*q-^#|U z%gogyG-QRD$0%uCF6aHO|3wBlLp`N1qw?r4=NjX*uZz>W4Zhay?kf&ChNjF!^eTW6 zUQaPu?6o!-M#QGduqa@k`<|--#=ua`#f5PI0-vlos9EELTvt zuT@9i$52=UBc&Y};J#nX;;<2zK+ei$J*`#OSEtpp!ZG%FvAzuY#%2qHrmD{>RFq~A z=2|9(n;=z=h?Gd%*W8YOxkfmgy*5)mJ(xY+Yh-3ma&zXkv9lEF+aRoO{lYPclbKX= zR;AKZDmO=QtxVO32=lBw3Kn#kt(EQ$GK{KY6K+5rEX>YDd84j+`qzouZtMb*6RVc% zsDg=gJhG5QHm!g`2z2k(YU5!bz;Q(2Vdkuoo9k$fRknsiEFiq`omtgKBOGi0N&}TW ze37+Xv-5mea1Zm6%pJ!mSZ<9{&yq|AVMMH49WlxoC3}#xt$9jRi8gfLiY9ZGOcNlvb)onVk%e_xY zHKh@;I*<3X)=nU+j68xr$cC^QY%UpTmSJ0_s>)&m(aj5WeJvY;z*_QXB<216-IFa& zg4W7@(^SHtxu=I`$569o&Mh`oW-~>)Yy#Qfy0^>;x6aoOvr=8|Z`mS2VVH;0PuI}Z z<#LhTXeG@E%UUIdd6mo~YkH8?27NPqhjW-6FB$vZmf57}ZEW8vAnP znblUvFq=6EXUF{NFl?g3=8Lu^1(XDHr%XL~DuB+MB?~hPGbqC6`IC?Q=CxN39^8KH zr7MemX|bvoOiiY8ndqN|lz@EYztpy_Ws0bxo{kDZVKR;c4rQavDOwmercb|M5!ydiz(ZBNTf90?IFaP};-u9V)>#zRhcYns)IclBHJyJJ| z`#pVJW398D-~EnH|9#)|M}Ob%{vD@hzLJH#a_ews|3Fh7v2qq!Yk9PQZ;46Ts?Y%h zqCxP1DyJ=0UKXydKKy}~|GnSy+p8RiBbaFh8L*zlfdWXJ_^F@ru0QqP{Fz_=6`vQz zT2*bsBP;9r`g*M#SL09q*WdileBG~J^KGEBm48NvW^6A=Lk9p>6&c=n7DaEiNUszu zNg~h2=YH#N`8U7kJN|0n1YF=JWS8hm)}xd4G!xd9WInyYk@!EC4deCix_NlDat=vL z76wm*t(>4yObC^YSTV*dAWCey)~y2zRkprei0e&iaT717YQT`L4ML zS*sxyebsb};~ob#=-g=Co2w!lvFysZj#R%hbF!+!!ECh;bDpmKqaXO;=id0vPkr69 zOZ$M)U2E@Pwr%0qe(*nec;Dm`EIf9YTOr+-!5+~ls3sg`d+ zsQJE?^R(sPeg6-A$-Cck|N1vPd%DS-E6Ij8k`zqjz+9aXPAe~^2PP0lyh6&t0N{i@ zeUb9u6>zm_HHm5!mxUS=lf79g3q$4R0a!w$dkmAMfe5l`ga>xLBPl?1mUyY$2b^`@ zEljI@E=v_4>Zrb&EM3MK*e_T!S}!4{lRzt)o(H2Zti2;a8)()m#TzS-fX9x_%*-bU;4Ih{WCD);oEQC z`sL3)^H8o_d3S$%e)Xkq```b!Z~KhD@P>DO{@?!2Z~yc+y-+4`0iLt=Wu?4!?p2$u zzw^D{^(n7?_VW1lv|VK_8eKk-umTQMtCS**j4rOg;o?F8-90`nRd`L-x^VDc{>{Jj z`@ZXMB5tty|EF~!9db2rp|kwQgxX0ksXp-1U>nAbKlcX9s;oE}(`WzgyMI(zi4l}A zJPg+25%1*ustS5^ez-S|oU2<=6%nb1UaNOtWLS8v)r(y-R_54FlzL-2E2Y#09^nS{ za#t8ztd-5QG;?!gCJbvW48IyDi$E!*ntQ~MwI@aEa&P9_RS1}~f-Ei+j7+GZ6$1}*sPRca50XKTl^G6|)uE&PuESB0CIr)q2)P|73w-C42T@paunsxh1zs-hGJSE;w{J-ICoQ=+7q8GR3|l$WEak9RwfcjY zD=jv%lv5fOk#oiv0DJ6f&H1K`2>CuQ9eL`6ROQ@kETy?;;vzls@Of^I!af(~q7$Gj zSbKtkPN!kCb${OHlic@InnlEBrCeR#W9F`0;X_A=(=rz=EWBxrkX0oKbGFuGcx267 zyuKcLYTIJY-JOqRFDpioE_*?6&1 zMMTa?_XcwqnQOI<#DZMyAZw*XE1P>{Xzg)v8I4tfyU@T*9Cth(0@=>w3R=g+#09xo z} zxGl2!$696oC&IZyI+6$(x)RpBKj&~$>Wz^v)wT+7THCX{hV8ZmNRtmo1*x8bWQ2-|$- zT5GzS8#f!PG^H}0Z|@$y@EoqM%mFJ_kQikeiK#}+Q|WZA-Vm{nM{KNQWfI;b@&#X&b*eqbu*`izDI^q)n8=DSnCF~9%XJY(oHo^zm;%jX_?NjuDl>(MDf?3H4_x|oHMxZDyRvS;4g$*pg$vO8!9nzc0#=-Py z1?1r(NEB%1?ge3W?^K{EYnCFYJV2}^KxLwh5ay)e_(?~8D>roS5=I$dWgds*p`anSPljo-cCNnzsHJ#@VYm?7PxxnXMfQ-9uktv zW->;9&8_BT_xs!P)a?g<_JhCjtG?_@fALp;&v$;iMdd{>miEGxm#w_tFu&nzzqb7P z?&Xg?eDTfuJO?vgMoKxtNcPE_-7JjJlikpjtmY9rqF*`NR2fAhQF@i||1 zd%xE<48U46kQ>$W4CRtL7TxK!H7`_zZ>kB2*@S01%Fu>YldC*7 zv8r$J(Z7QY4K+9RF{j8}c@^7U!qV>dn_d5%zxB8L=9woS|M;`7d(Gv%wx;8oHR}D~ zC5G!j;HfpyUFV1hcv^YSd;oYKqh%-qS4TSxM_CyFp{BR=0IqF2bIlQ>A19DKHA@u9 zBnX%fs0$Z8*sn1xmsBt}F-S@drxt`!7v=pYe)I4Co#lSHyIfsg@9Q#RU=}Kk*Dt;F z(l7d~&%(HV`{(@9+wFQjxxHK-r7u>nF ze~Onvm^o^hQ9iWp@3yO(Km3ROz`ynlzvh|E9zSk=v3DZ`WoDk(D@mh|s9)%XN|df1 z#!El=fv^3ifAbfA-uuq`UBpeTGBeOiN-f~DMbuos_^W>T_kYjd@Yj6$v+w?ltL=0- zzfzgSIA88*R_@Qd=8ez2>Ft~G=l<~z{;R*?YyZSoe$C(cYkzs1wly!===1;=B~;md zzkk8I-tn*g_TTlN|FJ*v%;$a0yuF9$DU0albasBXH^79PfGr)CJaZhj!VYz|2BxR9 zVpVq5U%9LZO6taqRhGNAT-jALu98^R-mGI<)-}c?#W3lb)(HIY)U4RWbPn8QceVjh8)RQ_3(x3ZLF-jbz8HXasA-tH8*d=r@rredGyhr{-Jlg`NiM=hrapu{LbH6 zh0;#BL0OoaO1Qhfy!pjve)VtqE&ubke#=|l`#CF-3&zYUA6BX6PZ20%so-A9&O`c@ zcM)||Ee5jW){LLe`}{BYzVG_M_kQ_T-@fwdCHE7sZx4W@TU6=^a6{T;ab+f$1KJBU zx%NAAU-Pk$W-Vgu-z|}T6ST(Be+3pq^am` znM@R<1H))#uyB9Mj}RqgPe&oFnJD07^Rh!ixLW|Lfm$9ztIX^u4R+wa`;tZnry4c3 zf@a|=U2;E-6M&M7ixytFuN7`9)8N)rN@cBdcWxtmEM!KU(u&y*+)%M+U29II zQcJ@eN67+)pG z?9Mf2N=#&#bHpg9)=Hz%RdNg8xX%Sc&W=$s_lplV+U2}kH#xy7HAlP;*k-2@?ew%# z8ZB2{U2S`I&C6EqohG8gt4->?F)gVI3A&j%Xif1ED050rIonR7ks)_@3sN9b=-xOR zm5F2Rt`5=n2(vf9onqk84kehiFb*gtiMg`tJRp%uB?%{vz32gDW3I$;iWLD$%sxRw znMEV0%tEOuXOiYEse4`HiJoZfp{RAa9~bb_Whd97%0D#FQwuW4p9? zAf?sBD+;nwYZ|(r*)4-wZqew|4jF*fzD;CCkK0l1BXb=@A*js{jn5%8f?8<9V{5zs zJY}Vs>gx%97+ZS3b46 zMYHGyl&Klfgd_ySE@29XZ2ULLELbb zNu)cqq?C=}-X0d9Pz}$lEOLYcN0U>cTmP!Gv|Gc8)|9$l*?Zh0Qd~lq(F4vBTSN5J zFp5S!2n01e!~+~&wKh~q8FI!Pr&;!<_kPiN-8Y^}U@V+Gu57r4(jrb2T~hZZ8F3nG zzdUX6uVJW_J{%sM+%p4vZwVXZg|Y9Yx;*#bnUDVLPviFP=E^qIY!hwIEDd&i zmHX*dSx0lR8Co>5Q*w6nD?#Pz0JgGH{X(;7zc#J*+_q;Pec<~)>kGc}U;2h$p;{Qh z+~I0RX^gS7#<0Km9pC%jcf9rL!Rudm`xiZU&CTsAugoW(Sha6sW5Jl#p*Y>%K7Pc_ zUiX<__TVj_^C!RgkABUs`{x1NT%QVrd53m23${I3qVli*t-ppk?~m`c)0jntL8@8I za`T!=Sd%*m%A%*Mqi48AH**xF%uCv?%C!I@H7d_9pZWOl<5yn&+9FQ`?Fqr*H`|X|KorEWxw*DrG*@8R$c~Xt~De4{>de4 ze#KXP_4%cr^{Wt~IOqj26Ke^?D$$u#8rE9w4lbDk>o9OcQCX&tkEnZH{W2*A0nzy6W9R;XOODn@zTX;Slnl-GGjRX@w&Gw{>lIH&#q7Y z=r~LC^DL_I6NI^wqr*USVuzLH0^nXaE?Xm2Mp(2B+60SsvhaXcN!fALL*CJ@C^Dr= z;jl+DtTR6a_59x@1l8AklBuNi^PO|4)7K(O`&x?<1RJ3Ha0Bvdf5opflu@--Fe)>> z>}nYCzR&%|fWPHEU-asw=F2bTx}a+8i&Yt%c|RY&dbhvwhWCB`&8L0tKl|&x_LcM8 zPB*YHn7idN>a@%u{Kl{S>hk>L


SSwEK=!C6pSU`b!A6RAGjjkN0r_aFKg?Cvl9 z`EM?C8+^~&Q=qU`RnF@Z09?Q6o!|erzxOqt@s-cM`OP>#zWwA&xl(Jbx_J070-9^x zz542-M~`3kw)edLv%co{W`9J=BJe^*C|3A_= z?cp;hp#_KlRIsl37qxn0&f%8Etdf?oCA)2iXBu_LHee2#(LLGR4F}vo!c+2yIBkkZ zxX>x*sh$*J1iJ=EAWW5nc@$_W(Dq7`7b-Jd%Rm$?1}tkWY{CXaPx^D`@5g|nV<8^zUZ^pIoBM*s@Mh%S(p8mTW#C*xBM^P_KtVF z6|Z^A>p%CaU-!BfE$`<2Bh9-=J>WP&w$}Z;+@4>7$D7{w#m~L{%YW}T{#)PhFaE0* zBgUX9wH%B49tB1~_%Hs`KZLw}w6C)8@JrF%PzZz8?BiKe4KOdOZz>5bV=MP`9Kwv6 zMl8MhR{WYo%*>wZ60=aM98RB02L$|?NKt)+VW>%F?zb1Sso*^ zawX|&?V0IxGb=&`8v&t@yE)6itgKoFhp-I~bIO1+3lM8gsnzeQ0xO$kJ;qhw4p#X z|G9a@YYR6!jOQx32m8c$+!&y4{~5hOj*az2hItsxhEU%BFjBc2W-t%n{po6Z_O+*H zUw3-;wad7mwJxqQWhy5e9`G%;!J3!5$Mf+g<|jWMc^TU&PB&%ScG_w#)>>=#p-#yH zE?9IeP{!dPWl<_tnQdK_&rF!dc1nqEG~3rjRl}mB7{_5pNtDL6d1u!|nYo#}#TXW$ zOj0KL@RSN9x$kROI7yhfn{Xh04z}Xc{%()B9WEd%5AqIxN*F;^R)1(ot5Q+3?F?=t zLF+bI&!V8i7FYzW?{$(Dx&>H$>{-^UfK;UnW)?CWABTQk8~_Q5<$jp$j3U_E1>qP@ ziAZH-zk6|Xsn9)6mP$pIR;C-9h^?oEL`V(iB^hx#9>twm>en8aSp?=!Okt>Cq=Zi=iQK>Pm#=!aZc5Dyq`8VC~w_%oz2VL2@ zRc7<8l(YPp${p+5T9uirl>0hnVC5Zb=#K&$yx~msOE?`K7V4joISo~+<`)n&cvt~S zDN#zLIzQWy$ZVWLNu{~woU0%+9|ROK7X6AmU(Sf@_k8x}Jb85M1)xshB2`>ONp8O8 zn2yB6l0f`P1D zM{?ZEynX0QJnfU2(XEhl@?f3AZ6wnS!_51-)GU7b`UN(89}@Bc6X2$`SSuIS{#U>K ze~vBod7&!J*(G!?)x6%Wzwd{B>eqkGS8T6+`@>Ip&t=Uyv;8c+Erc;>W~hCYcs-ms z&v%c;gYn`!zx+G?;-C8!U;ob%@$lxlS6ozyqB(&5e16^O`d59!|Mkhw{m|8RMb%)? zsesHYvtJv8oMwhFE-O`*CLy4z-M6JMBSy)l779JnRHbT>-m@>btpZ9`wQ6o2^K!X= z@`ScO^BG_E*Z=CD`_AwGhhw{%_X{W+gcl9D5+1+#U;DqgU$*TEE-?XbY)-2+6h~ztR6`pj^zYsEs^R3wwZ$o z)xHj8beA?!bIwvLPQ0?3!3P^%XHG3p2G{6fV_NQ3Q(DTIv#yrSw14ei{`$9n+LwIv z=l;Rfb_GA$8bJggJFML3&sdvgx*Db)G+Ppj%CzH%kE}|08U-FNmszT8QY=uJS`f?( zcF-H`=j0a;omm7k9t==uiB?Kk!Fkn3wZ4 zZj|V>X~Bo*gX`ySE3O{Cu)qAVH@x?Yt5UOoh!|D`ysuKLvdzW1N_ zAY!$-vVXdr{za8lt-UFT zlEyaJ{pAix;A!BgCr6FpL8S^3$jiRZb&;8eMMSe^3Hb;!xY2DpmY+;!6*K|VD!>a_ z@}^Hh!9GN&b#agqVyW4>{gj{_H~@bQB<-v)E!ro4yyV)=)*-&jMabYlWx@L_YnwIw zyZ~U1+%K2&D=&ZSQ{VZnUF*w#=`ZiEn3lbQjnM3oof6!GYlm#{wZ55D``HDay1Fq)dASVVxsuzlP2{M~=%>;9?Jn?L(aZ-4LY z<#PA<4l+Tctf6mcIi!_V=6?6+)$N&wZ+!1B{hz+&&wS0V{^tNEecoS;n7PlK?xA)6 z+83UE-KV`{|L{*;d8~vFD@m}mRK36~lD!>=*k+q@S1%=KqKt$ZW)~(+Xdh+=Efa=X zOBZ3K6>7p}U=8sGxz#!EZ!i0KR$n051b}Qsq#qPX9A;P}HEa-W(Mxi#RgzY=x6sTT zDoUr*l@IUPNJ(yoxOUG31OkOlAo}p?m#O!ep3Mc!sxAlBl7s{j$XuE8bakR5fwW4( zPdC>O9=MMQHH;ukR;u$l-#(t_oiS*!Dgmx69MddTqNa}6nrh9-r&tJ=%V5E|)>^41 zl=nf@Oq~NVH})z3fXwMcW&zl)t~$J0D)sNFHH*!wF~GF6DtDI5J?H8LxP*u}`n(jv ziVE`)+tiF0cKCBiudC=quUvr8tOIwy+D;En54LeCajjag>>azxRhRSa+Aon? zdTHwcRkLRHn-J}s64bx5na7W!Z*N9hb2q}>Je*CE0o_41q!iXNCRUMF;qg^3EXxmcb2LY^O zHz<{yZthYomRB@U-hv*_J@DML5!T3JhjXF*H3XJy4{>~pVD?$s5Na9^u)dSn4+ zWB7Cn@jY;CXlXunVSrmsZ1l?YNgi7h^Q>7j1H8u8V}Uh?#_yUt|}C-wyk7t z0kiOMn53n=%n4A0xtkeOsYcW<7)J~@D;)fowHm0LbFHeX(!P>?fKAM-oU1A=JS&B& zF8G6FIkE}BA&T2_zgvmnr-u)=n+N9QDAjb?n$>Xi1kK0r0L!#4j~_pI<<+$=LAPy0 zY(WwUsUx|d#Wr$bpHq@*t*U*W0D;*UCZgP6KB}+u{jFu?Di>?5tQ-u|EaHf~EI~A2 z-)Bhx=349oN_7@5QQC8^ePw1z;XU@Ua9eAxQlgGKsw(lcnBGcwsGZ+jm0f{q77Ts? zr`*^rP^CO{Pu;69R3Qbh8Swq|N1+wl%B9uI`3`l_JdRqU2zc>G1i_BJaaFNfAyCTo7npbJg6} z8r${5=RWP7n3pTBj&G??3kbOP1)?)j0#jw~#WEHVBiun$*->4knHx<8W&u!^bC?Zw z6sA@Y4QNH{VF@$uiKB~k^cLl2&Fbm9T$4@uKRtkA3QO* z=F{Hs@}oy%sMb6yqb+l@Mr?&N`ssAqFPB7`Zx#bGq*=5)y2$7y<>l@kfV+28I{|lh zDBWf%;8(f7`V&74W#(40%$j+D7HajMwve^I?+#dNrJ3s;ZCDu0`h6W^Qhw- zZNpS&)Yz$@{#tdrm_pJ_)q=Seesy;Om1PXG(I342|7#9cWdbsBWhPLi5rc(UDI^I} z?UK_fF0CDilOY~F^W4in{&&9cD}LphUU+uSCB?yC$^IvCy19AjNq))ay?Z?KX%F7` zj`QUex2NKGktK68X+J!yVmCb*orwqXxwn7WU;B%H?%(>IzZXKUxs2KGx4$U=D(F+ht11X0pMhrR(RRZKT@<{9* z*R@s}Ey_??yL_Wym&I`nd+s-V{jURXb+hpR*HC2)BkC)E$(Ls0vae#43bRVmpuq~3 zg?164pZHB&WI|74TP71wNUdW;f|_}8DpxsR1r&|gIuU5CH|qcBuT!G3$9qs!CaI(L zP(^a;7<@PB%14Ab(TQV)d$vqR6tE_%EV^b`*o^SVYDs+ec*0_vcW2A`yZ`9hc)q;+ zk)PehRY%SW+H+A9l}NIR9u~n6usTnn#LCgTStigSIXC0hGpSw!W`?UFC&OmH{ZZ*9p=4@FxN=vemL9zM7k%g7`0J|m{0pyx5x#M|K5f1Y zGa`bodEKYY``ezlnHelds|GtMQK+@MH`5|jdhqOnmp=HjF|L2dzx`VTX64eZfdXr( zbcxt9@!ofR{^kD38{YR7``SAa)%RKQcqTPm)6JyRk`u!%YZmmT&;E*!zx083efF0* z;^Ec9%e+s}C!vbGoXQONhOhe-cJsm~KJ??;%~kg}x`%Dv@8VP?&D&afR42enf>z9q z_mY(8kclW+0oCfyY8&x3VjI`PBFrnZkEVc-vswr)^%?;n!$CL@2q&Av*^}}9Orp1I zFtOjX3VgCIZgmUM;D|4GF+(uIjWG!3K5HSUtX^fdiu*I9#X%V>B(+Vcw61xb|kqQId59EEq$dqhEb9fjAV8860{m$Cw+#7B~vXoVY zLfCPMO%;eb>*5C_IttHBP(gP zDoYwykvQKC_<@$}}T9tMIk zy3vM*xtp;X2!V=i6tLEub4mw~wzAA)9rY5^!A7Vq29j`(ju4a8czzsM?{?0rt03m4 zS`E~o1)N#s>|WsNchFpGv(fUL{?|kdb64eBtCz%$$cu2dW1W??KrjO69>fkHrQAs|A70J1Uu5t(t2= zg;Fn?L1cC!L+*aQ%zdtiFqc$xXV?}t=e~`of}h+N5h1V@f^Jq;ebLLD5H@ei+#yz~ z)<%vX4-WxJz-R%<3_ZGfYF%Q%dJ5Zz_EpN&DOah1#5hj$Z2&fsW-&%bt9$Y;Qfq}r z&ICDgWy#5XpOrbr=s17>Tf^)W?q)Q2I0g4W!;Fm$1(WKjHkOz3UR8U}{r^wZzeoGN zW@UZg^UV3a-`~3Iz0bXF6jj`W;wGXfpx`x;cuBOQcG{6BCfdfB*lNV6Mx@)e8KQUx1pxsI)L2BV zI(mjX)Nj_?lo<7yDQjQ0PJKhGb5FK)$au<+gaRk zt~z=m8bD*-Yr2jC$@)uK0kpu!az57JJ8<_fY}L83P(#te}!61>&=;Y zFU6Y(UacjxvP^oHb*Wo8t$|tnAZ173a6F#bXJAGX8Lg^RP=ajsz+rYh45B^4irJ>0 zMi`E+;?|0_A|#AqG^;3UYEiq4y3sxxP};5_mZXRV!Ky@vV~)*DWvKD+^yK3&-|g`2 z;v4~UiR*5`MwFr!+KLK|vH2KPkp;*u=cx#vq}$zjH#7G^DJn~OaoQeUp7s^(%Oz3U z_}Jrm>2rTR&M{H7VBF+bN?Ns6-42x28CBH>7$hK+D)xL=g^J3ErBY?t@S}wVd)9*L z=zcjq$_1e$bhx3~`ctSvQ>=R_&}5LKZ-}i0AgzfIPII$hr+S8fXJ+ZOo9DmamyF9t z5wg^9MKXQBUEtl_t<$rVmGgAUD1#zXRBG>NNF_?jh|K0xF;$6l!okdahcdXAxY>h^ zAN=8eiOcKr#=N)!Ngq723Ct4UsG2s~$J<7|>Rvf^z8B`q?o*>3p$7tFFG^GCW16|5 z#ptZeDzxn4Zk6{1o>WOH+L*oZH6sWt3%m}Y&LNcW^RJXjp+OE z^ufxN6UGGgzw{UWd#3GccghA6Orz!byPHtO{;u`2 z!`$6e2oOpdLSftG<)?o6pZ_!e&3k_K1J~Q-&D~ul64ei4PmA1Nyqxd&vR``hp?6P> zjDFw^_d!^!thQ6J^-GlsB^a{1i%kSAWern^=xZC<36e8<2V7MuI-BITaR4GO2D?DP zH?xbE-tvJDyjxjg_$-hv6)C4sc+(qR1aSL!ZE(uqwN0ax)S;gDERaYvOKsGyqFCPU zaU9$>2XLGzAVRP*voOjbqLFMVaJbR>8AUhQ6fCo>dk+E2BbrMxQBHO*A?f|SELBhc zP<417@W{PczMuldt{yj^s?+7=<;6v14I*e&nwRs*d4K-$^1u3%e=cA7ac7tfn!GPv zkkcA4Kk~4K^hH{IKLjF+YPqAFfHHw4q7s5~8LTRm(Vky`=9X3P-s_Mk10k$^?{CHt zo{l==ygarxYAsfnW43NBSi8<8M69-SxDg7V3SP2sHN{|VC#ZC>0q}Xbovy3dw|#x? z?s6e34Jvp6`+51r1L$v>T;8?;Rdq*mq@o0|Vomj4 z-F*1|@gMnpfAnilrMt(EPv$-y{RnOsed+7J;V-@ar+?_h&;Lq=c2hHD?^B;yjcV!v zykP1kgKn7e^QtFzw{QBqU;dLn`rTjqC;kk8IW~COC?{euId0ESwfxV2{nz2~`^>v8 z+p;NK$Ct~F*S)n)?`yu=5m|Ck?YjZ`;n}_?NSkv|UImivXkQsCmyXX=q2o5FR4r+b z1;eK7SnIq-x@dE6t{)fu!gKbtnHzEshVevgbEKFlQC#+}w`rNeftTWK|D-IP7bUcB#mq zb^ehhtqALNY2$IK20I|hC2{(8^^#?NF4U zwIcR#GXtyJA)^YaO7|ghUwif+5L6z-g04>}xB!Qsu!Gi&F*XowI*vUIsDL6^<)eQ% zA~UmHK$NnVTOdn`UU`A$jw&}YE27sJWuViB&&Z0q9gfl>+`zS~LTfK@TwGpVTt4!7 zQM7$Wp}IY0BJ1{Mzq^UMyNYuu-Q8ezR74$-cJtw*8LT)2*F65*Dw(&0mqw#Z%KN3g zj(Zv)h7U8i>~QzPTp33#mRV*D8?@0&Bap;^+b}0-817x|(3&zjahR1o{wUSs<#A!@ zHF94YtuK=5lzh(%=C;jCGgrXeVl7A_<`_Jnb=CZ4(N;z$7fEqg2|j1PG8y~5#%%`f zEB94%ZWj+8owhkIu2PmP$UqOOIxj;xbo=D-&E1nYpB-Y4?NF}OCbDS`=)CW+UQ(=7 zN|XRogx%yG&iH`ME8FU;=j zyth` z^8{2z8ZgG}MHC<#bGW;WER8XuA~LF~RGUvTj}@JLX*0@cn`4ZYq&v&nvVisibbE8t z{F_*LFzrE$YRUvmtqZi4g1+{)d;ntWD@FhJjG$mvqGAE!v3Rs%!o2EWNLGoYWp*cm z(IOXdcz^^Ii!w>3mQL>5xEh#%o|xLn;^@L)KfFRlxIu)Q1B5xuk9VivACh)ds&sC| zjP3-ADfW{LCc*ljTIj}U5-1+tFR_KE-hjcpdF8y%3JXU|kR5p7BUW%P%eA4q{|9be z_*<;Qx6_X-qc_soLDHgc9_BdGbTAukKH8RPgP_B!N?Cog$Vw4tJOnDUj7NeS){Vt| zX0Ag{k_=ro3_DsC**Ti&(`{OZG*qIs_}8wyzJ?u?uhKA|W-Zu3XnOpmPaj<&Qpi_5os{l+c`Q8AwVbj00k7t;|SyeEUL^pzFIvBS{R*3zRaO-`>zS1j zi`A=iWtP%ZPSz@99(ATwsH@Tw)XnFA#jpJ6>$j~y51*=vEQ4J@W~$P5Fz|oo=7Ja{Dts_UPdwB$(O^z4dO0=^VyE z8Wt_qj29ji6fV z*a(3kkX{x4fA&QO3RyMGdkAhG%n2LjS;ro|jh+HxJ>4Fj z*2NpX@aKJL3D?(GiB;Ux1KgZX9^VP;Z~fK3g1S4WRkp7@D%Wv|X(0f^;C0Xtq3)2u zXzO9fRBVT3G6C&X0Opv0Y?>MAKDr>X145$KEf5P>c^muP!v`+_czmJ~aJcS}|oY}$PQt+M9?3v@v^B*8pY$k++Vh9-SFx>kdSKT!o_ z#=cAIlVXW(AwPEU#?dl)H<~a?%HjTjk3Ibl ze)k^&ZCqTJ(JEleYK@7tum9s8`H$ZC=68JTUH@|1u2lRaZaPDybeO1!)#rrr_;^F= zsz%(4TY#gonmb=2z0(RHwOYgkfKHdE+DWRcfWV{k7Jb`cyEVNr=)EavVx?9DWbEsi zSwY6am@-r5FlIy+%`r__Fq65DZ7b>*eeo9q{NRs&|1%FBxL@Zv67<%j1Z7Ul>0_Ww zyvt=?{_vR>-un65!#7@BJ$v=sr_bj<{q*otubzF|!|OM`>GOZ--}~GDaJzn}S_`7h zdlZ_9oO8Hu=7863%z_WUee!f*{K>EVLyfC}Swx>xAa!|h8E(J-KmMJUFMU3=o%fru zbJ{e6fmQ_xS>0Jc&R}yEdY|I$t{td+dVct}Fa1;h#n*h|Hr+4w+?`fgZd;!hocQ1W zj^7Hudi>Fk(Jxv!vyKjsAUplQ1n5;VB?SYJfhracz@UL-Hxio>h)~gw!^dmfOGyp? zN*()O8CX$WTtK%{Nj+#l*+Sy|z;PV5EuNUH8#B~(4r?t|mr_=5uwjiqDOI^PfC*z! zl{yxGb;xl|+IK?kX|h38Rw_Dh;{XOIm2*@!KJO{w_IrQmhXOgoN|_81dsRjZ!^N|Y z5I1Hm>On#+l>`o`nJ=KChi{y5UYWP$853&A<8gKloGM z|Li-y?C$O+EJaVLnG!fp~~mQX-syUUqyG1lm?VyQccCR%0zd)v?IX>-09q__oxE6XRxQ- zdvTeNGWxaY%vUkYW);_3IGR%W-rnOhEAL(B0`2hBySv)S*yum=?ecnDTsjBbDnrC{ z2XdVs-#mG&^X_iuUMb@!b$G!mjwr3s3chVyWK`}pJtG=h(brBR$M8X}6@Z2hH_K`O zUpB$ABVXH`My!Zbs4CBUSradEMsggTNA*)|pkk$uhSQ^O3IrBYXQ;|SmBygxm!a~_J( zh!sv8Hd9)MnG@w^gv{og(_q!#<<*KSeGDJw<|}Jujnn1D^~2NEBa9O;6k#sPkg=-F z?9@HsH#aw*c*WL!F@~FGh%R%d9i2UmYcT3Geb}J9|6~9&_6~Wu&u)XDA@+sl^Jl?W z5$!duET5--Hjs9I560Se?|N&RO&imhm}3L6B06nD+EK-ms;V(&%e5JyOqgZtte)nw zZ>SM5I7mdmy^Gp4&59M7?(GceQliQ@5X%v}b+lyd2e=cxDG=qT-XDT6I4UZl4&f=3 zQBt}Ob4H{}G)Hz@xz>Kp>YB3tU+PxO_Sk3Ov<*}#!pCs4TA|i4&9-4FyWMXC8e@Q? zAFO4CcD@4LFJnH&>GIKwZ@zl?aQN7>?)JSy<$zVuY!JD*G1ik;KmPcYm(P!%OlUiu zh8wcM$exvRxQ|JEvSFs6BD)ArD!?&^nQ`q|>NJ448Nke_tWxD#1bw!s*QPmC5$0h-=NM5r=A3hDa!t3CxAFfz@dNV_8Ij?eqil?g0NOQOGNYx!y|Wc+{F~51 z$?;P3zbYam^y0Cjyd5}_=%Wp$JW?Na*qDu3>B9j=$JqYZPd5)1u&w@>+I0uUMAI3)I;LBvrdWneqIvf`7L;1r@8z$%H} zK&Kx#9YWdZ6q1#3uPlLc^p}MVdXi;UhXbqqy45eI+9ysMg~pqT-h;l5Am1lFPwH(! z9VSR&De9)MnfH96HrfQFPA(6ebgBc7$Lq)nVFjKO=Xw@Pt&KMi9 zUi-j@-~Ym+NBeoDUk`QqDdUc2GtNwsWJRVEg)%Yk61ZbMc@EjW9CVv$8oS4FPu z9V&p~YQj$iAUE&qtElQEeih6eq;D7P-j}MagF5mEmQ~7XG{kIK)2vHK z(ir2F$FJl1#kYUv=Y8mv$GuWqcV~A`wt##YfM4;75K0x37%rt0fhcS!r^5WfTg^wf4vYVDyU41~k$2_-30A zbpXz4xMGD!wQmJ^UxgE9LpYe^RV*X~^U)sE$U^laj}kcC&2iMYl?mpfRpC+@??VHJ zk`E!P1t4>ScSn|Oy`AdKy2^xz%Xx|Q`1gLze@4~q`PRo!twai}h>M5MIQU2Y;P1z? zZ`(FoDW`RfA?K{&{SdL?ymx`+YD#`tg#r6oE>7p#pT6<4zWC{@ANZDU`!=^oW3h&l zD%5^;wGsL`pYdtjPES7izU|RPA*IB9wyvt!&tk$P8~uk;NI*hn)fg>#$DrwuCIMh& z0YJGVr>)F(l6PGVNo%&qX(MoXJq`HDpZY1tN*Zoy=zOS-bk&K)G3JU|SyT-7>UxPx zln8dGw;}-!NZ{W1P{>r3&3DrD33}(h^1NbCsc(Kf1b2$oL_k?BR2mBz=xj8q(Vk7* zx2hJj&8$;7&fZvA|BbyL>m`MGKRTh3QF7#ptbFsQyzou`x4-ah|Ma_N@#f}s+Q2Z- zH?aaF-uYwSZ~6H3*IpeL8=|!&!*C^1QHAoJ@-f>r4}(|9yRqZ=K!fU-BqcvmlNkZ1 z5yPGE$V|W-*0`7kL0RXziL3z7*$Gv34JNH0)aWz{AOqT-4Y2#jttF*#B32zO)Y*M4 zr~%ZIySxPc-+%8PTwjEA=xcXsiy_kH;C`IjEN;n~cX!?Fs+mcSaL4`zy$jwIYB`0)??)N?O=>Nxd{ z#djr@%x1f?z_0$D|EZ13hoAc9+b6HVQO^B*1{plW{eB7n)#%$}&QX6q`?0ILx_j;o zFM{@)|DCVSf{Q6&dRY1JNjsl!S^APM|7A}<_%m16C-2OujlZG4eAc{+d7f#{k?t zePSpi{N$=)#^vSp?)dHh(eJ>spK&p5Ukm*Os*DUnDSN6C9OyBiS6K%3e(|)8f%DDX zr~I5>czVk_9=+`gAAZ^wU%ut@F5mVA+gm^T^6g(d-|*S~!kbRdKU291%JxT92kK>L z`MXu;kfahsSljsRXx(W36CGu0|R!D26G|w-qZRR0F9V(broo^nmnFswvdgXavN>7xCaxf zx)u79R(l-HqM%hqHl>v?n-fh!sl%0HE+ z&4ny0z)CAu7OMx0XrqT&iM9<8)>;_*8rrfOqB#bfOwhA`9>*ph* zC}^~PFzwXj%f=VZIk$Ogt1^i(C+>+B=XIAznr&ljV{^BNy(2MhHjPfeDq=;%e%@DM zyLj;6ndj%_m7lh~GIE6^rj@E;&{2K5W}2&0?*?#Rrgx$l;?Z8mmND zR48i>?@MM$rOK6&6)OS34bV1SOjsE>rVV$a%LH$#m?HM9GH+ZDqwp|#I5s{H(IXkhGQOa`frHtKoY^b{urDUmz zKc&pdN|+sH&tWbWaS#|P3fZ1exsN%AGHAwjF)IhzFpQOHw6#|BBg>lCEU20n*kA=^ z`RE^B88J3n`x(&a-xZWMp{aRiZX~iP15($6sJbNA*-mCylUORCEZ|UCI(!9`^;;hWBUmzWa)3jI4Ek zOGAQ=39Vs5Ef9g7UM=V7vfjgVM1|7OY!D~C#Qyc#t<-O;$Sibl1_hXWOn0KPpgx?; zm`9xi54EDNA62kckE-L5#IfTz5_uBTK|4}9nj3he_?lxWrQ661=*a1)QJ0lWRs;_C zHTr|qQk1GH;cYW(LK8K}l%jVHW~IFF4eR{c``&%&^K@~MxF;AnZE(z)k#o#J&sd=3 zwz44jwhc4)&3yJv0HCDPnA`NIePt?xS<`HigSvV8+H((|f6LGN@{hg#v;lFk+we{5 z9WW02X{sp^Zj+_qBTH^7g;sQuheE|dgc<3hB7HcamDMghK{7cB7qBYJyE3jb0KMrD z%>4*9ckmY|MOAc{laU!^Bv`Pt;+(^w>GAZn*WUDnU;gl=2l;ft%1yFxvyt3u*U1Y~ zGAm=9r(3AZ=V@&2ZS})pvO_^QU2N4PBa`D$D%T1aPM4P%dg0k;-~9vM0}J|Tl>s)) zy69A9+Z_FJjd|tW896lEdpc?wSyrOG8ArXPjWL_YQk4#;ncU3AK@%|Rk8pcIn=lb; zL7;g@CWpBiej@-HJ_S@}R#I{@sxl)gL?FuPlnvXERP3sv*o<^#SyMBHRd8I)*B-xW zSpUg?`0v9w1sJx5%7Y1n^cTMI|DKgEz3J0$AKzV_1}ZmMo09yK*Lm<&>Ml!Q?* z%igMiEMpn!4%ct{ZNK$*1E;I;K<5N7-3#tnPj7FD`i;NktK-$5oi?)+ErHZwIuknu zn?+_Z0kdv6sw&ZHutg#<+c9&mv`bP(%M%gmoL;3-9R*D#ZQA{cv3e)m#jTM}mq`V0 z$GvI{C|4f{LV-abi)O&+8wE*-&2}~lQ=`KRW(GTQF_s}|X|Fmuu(~fNQK0&;AyAb< zwzISQ|xXUkOMD8{B}#{F?3xwQZO#!H=9X%O zcDPX{ul?fkO2E5*?57L0ukZ%#@H|SVVXXK!|FvKCPrvtjxIXd0fBAP`{=m;n*VQvG zXr7?1YS|J@mQ9o+b%yf6qX%z%<6EBl)X#k8t)KDe(>~>yH^2FXPyMVH-}+f^_|!Lz zsX8yG+hL*UGXQ-_=!A2$C$MT>USNOvdw$>l!3(#qzc%L7vejdZ`L=e=zL=5=&gEG z>a{FX!mwfVNFh6DNuab;xuecySh+})WG2wF+MTCzqYs^H7=U{I*=Le*!lYZJ%ED#2 zO(Rw|L+2z%``8!3T(rw42JLfmp^*< z%Ew-K+h@J@`1a!BL{=ySO}8#&_CwoJwo8KTR36SFzJL^6d&I+s&-u8#et7lZnP;w_ zefH4{&p&+b`q7KeKAa~=9!=MwqpZq~93|U0bp%4YNEu*R8*8ff@(!@QkkEA0E)}4) z_M3B@?{3cfjUimh%FST|l}V*CyUN&x$%+E0LhlDvmDP7=G8Im%WUQ#zdp9X!v|*@q zHMc6UFx*wzV-ch*D|^6}LJ7L5SE%ZPphB6Ma_y0RSm}^)&Ri-bH7~Bl>7vHi_YBmK zjWJlMSo_^g!w1F~!!1>UGJR3dV*{F=tVPkLJUFN+m1PNs}hNPzCNd4V1 zV`NC>W;6XtXQ!xWVw%0f+N*tTZiE0pdZ8vaobMAtpb^~qIwQMHEcBr+qTgc1aq_gIYPfZ z91JaUi_qLQx*c_+1kIcF(1TbzIZxYm5NO3Ye8tMDZC(Io9P}eD(U3Busf=Ppc61WG z`!rj7`+@4TU7WTlRIFTUwX9vrm9c7Nsw$W=lZ^B7!Rh+pxIB@jl`E2FM+6JA_1-$4 z?_PgpJ$d3$o143rBs!{c?TgTu!<}%F zoaS&0_c6ArAZ)EYSIjZ#M#(kmSaTQah`W*9g)PxxW@hGNjzMym&(qe~`Hn1YKG&*! zKWA1}Bc$4CQb*VU9OfpYw;fK6ZEhzEq-`6JqDl>riX7(c;r3~xktaYIR#riG=bNmY z+gK4aoAk|HnQ`7%$}g@TJ^!Ywt4BGuIsh@EWIjqTZf>@X%}}xKZl1n!e)0+B0x{<% zc__!lCebi9+YBCgE>x;B7+NcoL2%IQD1)wM3#?3~eE1y0JG&g!6L;5l0JT6$zx4=; zE@zMg?XfZ<)u_`$HWk!c7YZq{{kh7FAaQYVk&<~+sDdaSl~AMa+HnpaqxUCLSplLQ znN^@k5|j>!r;j4Z+<~f0@68zMU>OWMASKl;6qI$>N=r)Kol`n6S1>p4KVV-s2sEy< z(C8-I2a&TH(9xb`10YzTi&2$X-3UfwSEY3#&)7+DK`Ek5o@hr?zk+5gGq;W&9?@7U zMY-Ub1psPKIFqXP(vnM4H$XY5=h(o!Nlg$IOMr_(W z8;P=Ri|fxin*x{y_A-+FzV}Uz?VjodMFN(w#6H5MN=VfdX13*wIKnJ_K(x8sGgVou zqT|#6LG%TnGt%vn5Hy@p2Zp6q1q3%cou;aBjBPp45l8H)GGaxW<)q^{)Ug3N{Jh_2oretyEsZq?c11BYeHJP+j5K&; ze{nI~m1|YP=Tx_c>nxk)C!F8)1K&L^uHEX>X6=74+qpPOF`DVJ3t<#(^XS~WiPt#1aZhOJdAID87ae((UmAN!g=47=cV ziD^EL1^@8P9g6V70AMCWe|jKQv90n6_ck;pD%QSVzxcxA*Wdrq*PqZC*qiRzay26$ z{I1{i+kstc-?kIrD9K!Hm{m3Qi=?7&0@hQNy9CC4!o+|H1FZMO9YS^y!vqYUlQy=E zF!<<|j8zpZiB$&Lv(G-Hfo5ZFnaNg*%%cFTtwu&R46a}qF4Y`nHrN#Bc0Z_b_D9yw z(kk11jA0^RV-mRXt8Hv^T>10?n`2zg>GQOWZJVdzmp)GJmwvjWUjtjpXJTBAOkU~RZItRR1%|#=Icd$4M_^i+T^!@e||L3p&OD1o%%?mI$ z>0+xwecgZeU;5R<55M=v#+ao%5$)(MK-MQ!>u|k<;*lk&Vs$^|5GbgrCuObt44)IU zwX%B~x&)%vBnSDeL4-8xC<(nXIwVPNntx?f>Md5B=RrZa4^_%PN=J`+ioOA5C@0i;d;O1^^hYzQLUNnP| zVMlL`QC1DwbS}6Rmew)x*dr<(g5au&GqG8@u#O-yGIor4G0bWV9g$bmKPYtYA$y8Q{P2D}O=x$m5Dx87PMdM(%g7>0+ZfipH__ZYZg;_Pwzy zZQc3$hd##B^Pln3^Fa7WQ<)V_`w}Nb{HK5Tj|!JIZKD;TOef(U1%uOEZDuJs+gI2e zfzeBRWR^QMvPGF%Pj2?L?&9_~&wHKk^5$0SY{Ts|QYi~GH2w(Qrc#*_1==*T_DtbG z)Euv$Bq+21o_GbG9B#@g8SP?Txj(?X#<(;;ahy~m;ANM-Js9(uZM!O)RWr%rWZ$9t z1e$itXL+ZFt(8yxks-P`jJm}Z`_g{>t$pYiWRFZF5T}5lza@DS=lh_ zsUe%yHU0GP`s(Tt=BUH3hLbsJ&vm!Xx5~7mJ>}T8j%}bc3~D4fKydo(B--F4F=zAX z(C(vqF)FLjBd$3k%iSxhNA5PX8@;XZnMDASkj{2I)<{ z>l&FVM24zdbnAY}Ji^Nn5bJ=KD=O*c+jjNv;T$KMwj#?K1VB|ep^EeE&H3hbNYlo& zS*bE51Rp85jcFr~#u-eyKvcEz3~7~oG_|8?n`P~iMyUjKKS6*5wV(HW?LKJq(a0zq zFOK?1D7CUCDXRfEO;cd5Y}s;dLy273E3RHj!4y?SKMI}QV^0*JG&fZnN4R2#DkD@f zGgY2r@8{CWb5*8Vmj{82tg3mMt=p)y_H~f62pi2<<@Dihcd?d449PDp9-b~AlygZ@ z$pNam7HBpjKlc6h>C-2#fi}Gz`pjcFWf(PlBBjw(Y|jxlI$Pe_04#4HMUJfbDDXUBFk*dIhtBl>%ic)gxf$7 z=g5#5ra4v06?+b&s%~Sy%M>&(9z1&X#mfheWT;*d-iL;0=5EuFD}=mx{Q7IJzIJo- zn3==f3)YfTtrG6`eau;kRP^JbBc;8a8Doq&3w3wCTdT9f!QEH$9 z=x#?s>o7fJ)4AHvj_SB%3r92%MQ2&lubLRUc~ zARJxBea<-@uyOJNDzhoUcNjQbec;D`U_E*5!lKN|;Jjufw>kQvyYItJYsH*inNepq zoAXi?Q8CO4P=%`P9R0}I3@$L&3OCy>YuLE*kACDMpZ+;th`0Xy{p0Vu+^)p4>74Fp ze2mIS29Vu}NfN5u*BWDVe<$2)FHpn01)T=S0$O)_dle)QCe=~1($;7k3IsT;zf5$s zrwcGMqYFG*H7bqp;kgj^B{I_rhLfG1y!tbE`!D(OFa0$idiMva&K-OLZJS$Bwq0%8 z<(yYhyFuF+AS{Y7F^f*tHU_{@(QP|z`-)>@D5o|;rSxf4wI09z+>6h>{>n$rA9>$1 z&pe;|87?yoc5_y8TAD;O^Qmw2-MHXxExFKUe_~Td>5&;ontDPrGmD7frqFOVb`>#f znvQxSM3#B?R}Qn$NSF?bsyYpH{AJV_v+Zv_JlY&?Mw5*pv&C6N`WvXQ2m+bWz+kHGr9f8am2!YD6ckE~)Kg9h3!`9)s>@U_RUrg3iG zCHk7V?;q6Q@=pzHtzaXRvdy2GOGf6r@k^)RJu!^YrO{cYD5FcaLAYdHnS5=JEOV zc1G;#Aoy@W%mSiDIt>FfA+liZ?l)Bg9=`ZC_=ErQ z5B>g|z;@d9WlQVCbgLb_y}cv#BR}wixcwMjUpB7Sa66heeHaHr9T=92Wz0$#&EWt0EQv@wi@AhN`ngg(@2zi#Gx|Ztsk$h*oO_ zx8ajEF@}VF-JPEQ^l$ivzYHIzagqC7RImxWM#NrsaeI4ya54V)ANd3O;}5;_C*Sj% ze(P^LfBdIE@mkO|q=ct+%y6DSgNWK?B#YH9d3 znw^2^b(qE=DC^)COR`{D0vkQXS*W$II?{-%yELV9)p-$>OB#Fb4^9srf9wO`{wu%g z*G&M(Sb;Jld$fIWn{|GDyM89lkDDjWIp~sH-6{gBFx&T&F4oiceaSES5(#^_Z5KFV zVpgovX&c1%{*!OxgXfvMZ;2@S0BpEd_P~lB(R;($D6yhdiZGu}-&h5tXyP*GHq2qe zRCQM{*b$_GI_x(^W_igKYtXWnmDxz8GzH8finy2jT6Ccy_5#jv3+Tz?r*~0n*9zPB zJ#TLAo<6<1xjo;l*B_s6S14AU*BW8*23@Rwc11I)^-IW=L6N)H>GLsxjrKhx7ChJgv%g zjy8u&S+Vkbmn)8X!U3^pgWb-)Y7EarNj|1BoAEcttjKEoYqiUsFt!$$IF>_3x>>G8 z^EmHgPJ;=uqj4EbH60?m_GDV$S9Em6X!t16#zrj%g&Kjl}{{ z0kOLBB7BV4&(mEUKaAjT`VdlG6m;}Rb#$`_eVUD4yf1>Z=oL9f$5Mr^v`@F$ml6^g zMZ)LIh+(cQdfz1#6;(MlpEitWF&*H_y_F{$PFPmjoJ|vJ$4u{|-OOO9%E|`5xOt`e z*qU=xRqVSE-cC)kd!jii(o`TjL`vE`UHbL)^|Q~)=h`Fp=suuT1V?+rVn3g6pXTjd z#u`2$7NJ2%Kn;{w88RC%MB)Int)1c^kWsZ%NO2q6LFGHPE3Ht^UW2-iJr+oJJ1{ui zzGod7DG779(amQ={a`F%+fKbchOxTjbhsqnY})KqKeKOYa`*OSqiD{IDqzCpjLdG) zrO=P@sElk%F1sggxS>*sD%o(z)KG2tItMCcL_tKZMn}QjLvh~2HwUq=-Fh*LTCv+C zi4_t10t_x^R}9I-F*kLLKfr_4D=V#i_c6_AlMzdK6bJPajb39?RS^l;X3fGxX;os?3%lGBZ{Z!~JB_v$P`bZtfnxet!Dodd#b_6;K>$>Zqgn)@X7l ziR=j&a*Em1;8Y1wyCP5XWab25t5&#kxJT{oX0R1|L{uSb0rWYEnm${dA9Du zepIyJVCFzW_Xp4{U_$UYBSV!{Ifj?$?y+{8qrqxpbAwYB3ZZhgi286=<_b}_K#(sC)tunpSPwo6J(JfU& zAXpW!L1blHRvOP(KzGl!yNa!w~RheM1LB5dnGwp%Zd=XMP2k>Y#=7&bOQC zqpH8)9f*UYs{Gi_u}bvnV=7aBAPhNgBFJ3u6rk@5Qx*W?1)!eq*o7-*MQe{NRh1&Oh8yncq z>z)i@(;~&lyIfMvu_a^?h4$>P+gNL!KJ(Xn^-ur#zq3F0R^S52twD{IC9^>cYhBWt zK|xB0J&tIf&;ozNf_cYwVPf}w5`+zB9UVLc*dPzrGLpusP??qBGFoH~Gn6n;k{=0e z%aj?7qUF8-r%b9cJI{}Q=+nRY>z~Aax7X#>Mbl%As#<_&q^o2H1z^Q)q|XtxLj(eS z@B;+ad0k%k99~LuGKXMD)v%}?hDv+$i_g64+y61vt9tO(yh9ZxSSWXT8LOtx$~gK$ zvz)U87Ngbyi#wKGsO)n(Q~zI@K=;zQd7*sFhT5o-HrBqBnzQxOCT0Yrc4suF%*QPC zeUWTnW4lki9f;-hL|S(QAZVnlmibF|y7Fw8o#=fks;D$yW1E3A{rVE^Ks-&uJ2p?7@; zP-j$kx8eTT_W$#j_y5Z<3rnZx?s$Fm(u;ml|D7$>8>oF*9gB@&lU}W6sEd87tYa97 zqmj5Z88hU$fT^9hiaKLnMC@Pwi+|}4e$RIp5^IG&uv$*Jd)?iB)@Q%@-~QkI&cFG; zeA7!m_m}NYZ&sF{PO35^8-mwHzur1@NY|LiKD*lZBNWV4VVr^N$FSToi#SG95mK(m zIj2<3=MAY*G|99w3Qnqof=_R90VgYqf=|nmc?Tvs)mo-p&WCS&%gZnS_@DZ^|M`#o zC%?@w?s7`WUO0~#$}ws`-%8l7<`;bC+y9qu`U}qg>4$&neShLl{I`GSZ-48DfBchhZw8c?L2z*bfn}&GOMY6WpGe*!^ZQwUw->r z-vMBqcXO+*3XkGSTwGM>XWsK;7jOH5%(5z{lBTwK1q7L)P@b&&EK3J*B)Xxp%&cn3 z=;m^`@r5^h$}2zl-8Xw&ZQJb~-O(`RsnVVt+n0UCFZ;)T=iAIjKc0#qSQUoZxsq;X z!z%&+IZA-}K~#{c$WLa1QTMP#8?FHQ=e7A;1@lUMvS&xezHyn^h%jSiVH_Sy6WxZo z-l?jJk@x67s*86HiV0Z-TFo&t6-HE=hOB6U2WW+q6-*tcXM1%}R$P>=i*q98$&jk3 z;|Vt>Xi)Ac|;j1xO!0Q zb`Fm{+C;uNA_}USbX2qNk^8Uyb-z}uo7>y#!8ZLVYp=M#>D}*spK5>ct#6O4LuBa_ zA~cLE7h#!eY$vBzB?OKs%2;JwD+~?NcNA;bV8a~2qGO{uwGP5|mD9{kmCb*0OcH|# zpo*%ZA0i5v0F>a?q)4iAp$vHUkH3?8`q3Z#dw>HwVfRnH{ucqAd%w>Uv>R0O`s(rx zpICAI{KJdu=Zk?HO*kcv_{^cqNY1g%O)9!q$>vZr&atYQ4Wz+jnTk#{kf#joMY>? zv2Pv)rrJhFI;-TJ=c1bva(eUorZH1yqoAzR;+S5EVO;|XH|t-$3cihuWewgH_v$3V zu^9yrOU^L5c{eN0LReWH2y&~Ew~ybfkU)C!9xy&u2F))YK7yIps$&?rl$%+CC!goL zn^GV`6y)2sNg%v+C5|I)H)wquG-ESd8ypU&wZWfFe}E_-UXfB8QrxBps)HwL45F$u zx{Fy9YI8;%bS)HCmba@v;pP>KW|d{gZHxq5z?gUYzIEFGq|)GMv9u}=IWK~sj~Oe* z=1T1A+~bG)X{|*wgF-Yh_w-5Ah}ws3d#=+M3G2s+8{A!4MR-~d3wiG!&9_6DWQ{r(Ed0_fJZ1)D>u-geL4b6U9#np*;1Fh&(& zbByykyIBvVXd(`w3Ljf!9;IwbrzulD!16IF7YZxmG-tbIN?H+a?P;&7*15`Q*_pL5 z2ve7qCep%SrSk1S1JX>1F>S3q+ijklgFsXvW7{01IeFaOAL7W;F!nvnZLMYQa~u2l z&a_38JIXX{DpP8RG0S*9FEcBFm6;kxRw?1WQY+THI6b;}RC7{{$f`2;TveuF2B*7? zG0!(oBQo#KVs!b^#pP+m4zuA?nY;2dw|3T0>fJnx?XR6?O$}4Ea9?gy$}%VmHG80I z`|f^@d9t}}3^ZM(iZshCl3BI+Jg-~N>2$erg$;{6$8_ID?&qj-aWw}Q7Hf^+K8%nJ zi?y7iPgj*}c!ReA?dNVtPWMrn-Huh18C8*;Ims*@tpMuSOR2^-DnXcoM0H-z)DPCg8@Z8I~N(|kpTFi}+~G+yDfow90`1a;7=Dh9bS z2BzB>o4t7QANj8Df_QQ#;H<+_nkuW5B959vro%j|M6*e=(TzSX!I)|r0wJ@erwgi- zkv8fGE@j<2@_I*d^n<0KY%~&#ZRmm2zAYY)SlTeG;B;lS`K=j4JtRTuD7$b_(5(G~ z_+)%W%%Y7@nBw31b-#k$lHtSPEMK&%i;dK`e#<`+9(bLgG)FHA1achlj#|kByJcg{ zF-CVf_o9^qyTh>EK!ZB(&prG6etxa;ZgA!~hHP;2aP!mJ(_o+TxnC4dK5=>Z$b*E8 zy;Ds=-W5{S{X%3h{1w$Do z(m86(M1KEwe`oF~tyG>%w_2HssE}4FR3R-XD)v}Wd9$9ZJ)YjZ{EjdB{F{%y{NVbT zemom3GnGYWPp5*_sM#1rAN{_6`c41O zzq3tSw6cA%!U1xJvHWlR_5Z8p`1rg2)#Za{_JS;kst(>n@i3(hZ;#T!|0zh_z+wa5 z6};9eL~kF6ENdTzWb|#$VNO{^lu$%TZXGU%!)dHSN+R9a+N6wa-5ql)a?AlxS<1#v z(V7$CwY~VcU;F$11Hi!PR_!!Zk|_%a@VWWLw(jD|5UO#w78s2>YZcYa~VNeHMq9s)H*uVo} zYY=k`_uL=&#QEc2@o)SpptO={eee>W!<>7)L7# zRTxeVYi_?PI`V-mF_C$`UDsC+4fW06`mI9IO_AA#LD=IbH$Z*GFaO1;8!$*mcU{7p zS?Jb1A<8TlOlYC0lMU((O5JnKB|EUxOsUKv%zIkJflaNnVdzuO+bhjpeH#a5J^;Yo?6g-g^(9~U`GOoZjvx{^T?t6v{4L)yfN^nI zS-q!H3FT0ztJ(%m^F$nOCGlW5Cz}y@#4816?#8jQvN9vPIJ+vvDI}aUQ)NU*QtFZ}bRGSO!Ts0cqOdyNa3!LT$z&q|Zt&LUzZI{ zph1RE0xi|G8K9~PWJDLdH-sN+?dDcl=d}z*0K+mm!yy>w+(NP;8|bx}s(f>IM$|Mf zEq8-_KSz`>w$sCB?D_%c6nM^^fND1*UDk-TTzP(ae)@W?yU05UYCB$&IiQmEm9^U7 z&*N%ZWf~MpQ79XuLT+Bvc`ffX0%Ax8T&Fhz&SSnS)n%1 z7Y7Mx_@rDo{3~M{s4{Y`J2z6*NT8_f2BC{9 zX-WpkdEbxG{AvnSi2|$R?kJgAK#_+8P4?&g%(O6gK)G4jn?d%BBCxk zV`a&RM4AY@=eM8+CsJfMgRyc+* zV~Y=>d1jZsH!KlgLf;HVLBBSWA;hpe3-osA88QT|7 z)tv1kng=O~_MF;L|A3?G7wT5sI($401nl}@^zeyF8^-QfObKP}im$#fA6wmAInB-D zz2E&EZ+!M)gkzpG&4F}SZyrix*qqyG4vaCKRXL}}-C8U5yB!>4`3@q8|b8ZyRMpLQyCd)V|0hafUJaq0aX>5gTol-%)6IA z{$>B(AAC&c3Fk}2%wIiJ5c-MsRFkN?njZf|(Q+G9*7Oe`k}S9GCH;U2;0Zc>e=ksrB7$^0JN&N#^U zI_S=@(P^Oj77ypa|L9k2*oL0U44J7zUPV{mcCT85nokiclho>}a6#bk{_d-aKBVeW z@yx2sy$KWD|D>dO*@#+^VTN~n#@hf+Hxy%#Y#QH{7QXKX|2Z%t&ePi{4mVD!3Qiph ztH{hHlrpLk^sGZ5lu+$%ZB4Y0k=M_>I2`Z%;h%sgBcWgjAclb7U&X zvYxHnF|1#HsW=GlW2cT!Twt;@UmApAfLa7ZZ7wA7n`{(|9=t^rMw`a51rv!L1NRYY;`4-HHgxqNpEfr07+JUa-kv=Y#ehw z4b(7%Vy%^xa4$Cq=5P?Ls`L%hk2El#s8Uo$4VsMsu`-pah^nMpDoQ0|Sq5_5+&=Th zw_-ec{!`yUADhqGE3+!1v=+w@AX@;E3BY&$v+ohM%Q5j9r$p%`RIr!!ORs^m5glnD`|uQlEt!% zQ`zM={pG(#F!p`eY3rJFl}|V4SAN+qhAFFe^YD(M_{hHU$SB%4(!S;_8*EPo3nGS9 zYkY(bcZFIhqO(YY(Vd;`B+X2PSYgKlvPRL`QQm7e0V$!7EG2OOhirO+t#WknT|_S& zB#rJI%}~3`I+9;#di)x52pJSY>;+y~lBYI6#J-+>{QTO7@1DMb+Haq}_WCD2^71S1 zzkB?#yC<*Qy!P@ZUVZsPKlWYk{pWxC&2RbammfbqITG~KhOK)m^RDv2gDaN){Ga}_ zc=$Fqr;kp`cZ-UsIR>pAf0AeJVLpD|7k!?CbId4LD2xlZvPs}O|HV7QpCjFM5Wd-)*T-ykPjPe0COR`6A6i`jZCwX^s?xs|m zBWnTu?LZH34fj8v_f|l1tp*4H%o4lgSz3uwO=qYRligB=F$UBB8nSoS^2}j-&HbJ;qRp(YY z=42ZNJE_E`12sdP($No4S?(k%GH}Q_T+y)T9NwUBcXOwYZI&?l@)8GezY(Q?+%2;` ze}=S-q#MmaM;>3+`>LEO80=!(P8XMte7o42B$s8-q-KWzGVY$<+&+B*#V}Tc0%T9e z*x2#QMo$EEeB~kNzCYOA-CS8|1Y00BslDo%87h_N)+^Lfc2C=&ihXJlYX!iFqM?rN zog><_%>ke?_FKGB^Kv7ARL8Iiy@vBmnxpB;@N-!fp z4702hG`C5^QoyK;tn8k?4k8fNMa8klpk!d$T6-bJ<>mGDqcN{ZQ(2YN4TxFR{7bOv ze0THo?#azMpJVN2Hhs7mXxr&xk0P+I9JDb#Gpj(-IWuw{l0bu>My|bo!O?Vj`WO>1 zRCb2lebSudv?-x7IT)qNrm~SdYI=yqCs~zL0b@eL)WsK>{W@7ikXUQY*^xa1nI$L3 z98opg)>;6En{REfU}mgX9bU4^!#f5{AALW~OoOSZP4r<_k_~hB0_Gfjmn0ymdranV zT7Ly#<}jhMYN-b%vy%4x_SoNmO0;g>IJH!nd8nC0rINW*hjqip9NTP3b!;;l;|Zl| zz)JgY0gRN5?dsvf2hY54b@>ou+(w+w{R?tV8-oV;H0C-#eth%#>$gu{Q|;UE9*M`; z|I6r(~y! zn+;Sj2=11VP>wlR$cSoIEl4pUQo1;udRwECsxre3-C;U>LjBk*H_JM@Til%uS_3lU zZePkAa~fO3>mjP67Xl$zBUIVNV+Nn@PItHdVhaKjw6UE!WhA!#W9YmVI}*IKs=D*i z4w78;p2k#JMi>hSR30$wZh7rZIIF*KO;hgi2mPj0vk&RLI4||&(j0aQI6fpLv4P0Ds zChJJfbr)3s=1pp4+p)lm6l{9yxoT>+ignaBAft%pqfmt=aT6|O!&3kpQGfKpvh_L? z%E_o8n;VqIQ7JR4MveCCAIHa2t!EufR!QA0Ca@$j3TB|CvO+SLn>p(!m;n@oRdv>; z|M+$k(wiG+sn8gN>h~OgoK9!i{iti4mk)mEyZ;#=zjzSg3^Rp`j9teWXStS2wXcF` zgW}lcwoOp%h@fP$b-t^@a9jKCqz|$nW*!?{v!xVD_erVkeAdh?J;T6P~BaJ@Yq>Uo!8F16I=il(sPkz@w!6!cW=-Ee)lL@$$vgz+B zvjpw%?6?_f1!<{>6)<(Jv^pdx0-AI4s;2Q)iKZ3%VPb~!9&2nMx`DK^8wyAx52%z4 z0*Y0!3Pl@sxVyzMXJ++3G^!NY)OL`n?9gimiG(h-;n6yDz$h{NboYr@3m^i3(o(WB zicpBdbJ!<7@?JcAE~&_lQ&&O}P$}UVRaFh*8YG}PjDdN-90MV9Kbo4A5;O*cfBJp@ z9Hm~|HK@W9!wBH{PkAF+C@vzjx{r`DSg46#99`n5u+h&qaR6{0NrcW)kt8^;uAhJI z*%u$a^uojEp1FSX?BxrO9zOTngXf-k=E0*!7u%y3t{z-nzxM8*{@9QG!{?rP>4QJ{ zBSk!Y`g9m+?SQnqSlb*C^~2x$j~;!>+a;RW>@NVatSgUtg?FTFIwT8F14LC~IN5VD zdAFp>_4MZE_HMtqd%T}-Z*J~xZuZ-CyWibBxqWaH)WkmMDRJ0jS^3)RD>fqv0_*Z~N zBG_6xI$+^!(1fW}{lw1d!eTqB8cCIzH$%Xxp?ru+I|SFX`#Mk#$~cTLnGf~om7&T$ z_nQ^zHX*5!=`%BBb$j#Tr+vXE-v6F2{bj!ahIutA?tBj0Y$GMlTv=WJcN7q8rw169 zw^dJWZ`SR(P;T+Hf9O9v-@X5D|AT+@mbbp)m3MvbN8j^4WlhaKG&*KtoTItqc0g>q zY1FJMXi%9;zH}n$b3W^B0CO1KL7&rM8q?G8PrmazkgMIAJW6}rNCygi*+Bb_rR=Ub zlpMooQjXyTRJAgq62fi8E#|`?{Z~KUc)>Ob)7BuS4Zz;|X`hP9F4~YQGpSq|AV|gG zaymw06`2Q|R_bvF4Q5ewbCwxx8>6}70y1hHnAI-HIO>E|LZ%4Y%!e^ z100sH{yW`b=YVM6{hj|1bAyly)zV?3@ETp1(wjRs+eF!z<_5xTTAx8BMGiMJYKd+Y zMenD>foL(>V1K@P2xWV;K~~EdLa&W&ZWtTPJBmVR+K5tPy$6{AUp(K%)BW!JH1>6O zv(9%ncl%A;-rk*W*WKOi?fK@s)_LFe{k8(JXYKpbn;lrUd#O@(lu+>bgKbbpVoN5OF;->OFq6rPECM=5$>zMczIyPG#*C^cH@HSc zoS(jaclS8cTrPN&p=e8PQ5a zMO7x6g6Aw|#GJm?qO2=>rD{@dW%Ri)#^`J$%ra{Z&n&6aUFkF!x`iW4qZv5PYL~4* zb^mi8rMf#mNf}Nj8{5U@rCn?dcw>9!8b%gXk#WAcySYK8p@kBfvAkEgD3qX;dBi4Q z=8V|eN}N^RT}VB#lZc>%;>v)Ok>+-k{upvaRv5<7aoMCK8UUxwZGt)q_7W=#=8}AD zYVlj240E6&%myktS>|RAH*>iWtR%ZyxnyQG%#B8?Ji2^(L}f?6ONahKnlO9}_nx1J z`H-0`s|)Hog*{YiRB(F)qEfIR=Ee2J^`q@{DUz;YHMTWW+ccP_&p4m&ZXVx0d4dYC z<}h!3@Ie7jq7Hr(sui(u+6;_9gW`vKRKnN;D`ZE@P@?e&GEP5BXoJ?6URA89hKsuo0%lN3RH=r~Ca;e~^$~-)|ktrZojcrs32{)VW?%VK*)wwQB7W)lo0nGYi+tqKT(Bk#_sbc`|Q-Kve=RkjAfGDCO!((vm?FI+x& zCNuz^*SRW9t*OB{T83xk`N^wK9)JA2->!A%KJCCO9(T9CERQizXvnQl5Dh(zh(4$W zU#qhy>dLl69y#$exYG;hI@ZpAo12-b6dC5u;iZJZ;ITqdQ5k7H1+Z0?s;Y>LSZ+4V zth(3+1Ub4C+^V1q-yEf^P(k4Nd}lOORu;sy_FSsWVRmu3i5-;~6*;mKD(1R}t{Y6E zP=pVsz^ZI``9Y>@N4A#%K1P=-mq@EDv0pUkXdNias-A--nWI8x&Ni4x?ICH}LuY|f z(F9}V;sMk_hm~7hgu8Y1I+~wiXtl(tsspYud$g{~gXf0=VX5#g;tsY2m+C~ck;n)$ z?=)X!I^3AYY)xc__4XsG0YGg?Z!BJsB%_Lcbesu@j5(Y~H&TKJgmCM^QBw?bA96l8E5hCdS7sZK)Yecvvo zq~3yOg(}SkROaKzRw13<5r2}ESyJQnx?NTkgI*9Mx6zAM_IsluNE?+wAX(mI?F49+ z2x2rfzqf2O2V=i|@X|{!zvm}E^q!x1)3cxb(T_Z}Vf(&w8#yjq{N8ixZsrZ+_uHbAI-OY=@f*?r|x{^$X8k{jId_iTr_sf$Bf5;OT6W!H#w`SY%q0in<6s8jdGNMkOyEI@Z(`sh&-EL zcXd$Gl=}F`UxD_Y{+@5=xDkOBfB~y5u{eB;jV9Utz#siT{a^mn*DA5<_B1aw4DwOY z94K=9#c%vyQFis{`ST)u%Yu7l_A*Nj72y4L&{Rc3lfQdw037vjJdy^sjZFrXPe)_I zRWV_9vQ3oti3>B|)3#F~!%j{VE701pwe(d-uCQP*ZwQfFNugvB4wlt%Mgfg`pw#wy zfR+I(lL1kH)!gPDdc)`aqHq7MzxDV3*}wSJzvLI(JbpSZH+lg+?BZ@c-Rj}r`sTm# zaQ=-C{>*z{`jk((yWP|2mHjgt*kA_G(#jhag4&yZQ^kQO8RQ(La_i(pnvKjb6EGk^ zjM@*y4^5bg-Vnl=Asa&_>t+R_PtAppa@aJtQr-suNWkb~!Hk7M+1#G}IluUOzvEj! z=jZ>5AN{_6d~tfXW5pAg%Qw1@NuKweD#M`S8Th{leo-Z+asM z!{~iZsE%c2;UgdU1aQK1JiQIkkp@Ppvz9P#3|UtzICJ=DPg*qrmk?xbbW^1UMxvr{ zasB$oK4?Z8LIlSJ?wn%~I}mSt@ZiuVYS$SMhwA2vVHv(g|A=URg9 za!vWJI=NTWX^yA0kJBX#zv(yswz_)uxd+!TKYl!O%NFjHW^>uFj##f7+styUr>_HB zH-h1Gfpu^RLpTj*;bR~A@Ob!{sFqQ!3p)}RG9HVzu2t=DO=W2qqECTXl{tpTLMq4D znx{aquQ9!$XiHXVH3l+D*;~=b;t*;KlZ}i(nJIxh&WhxMT>``|4MQ2dModgt*%+yH zayLh%I7)?qQdzHABnFG#70ANTc2%mqPeWpmZ2YlP39`UpPGwfr*?nfifB{acRr?^V~qQm^IdE0L+xD$>O`HW0*V4e#R!5TDxe*O1Ut0;JauAgM5H|+ zL5(p#52(@B#27Ugqv<3_RND9hji}v01w|B<^QoY!fTD^z?BiPNo%6ZxF|PhFp11r^ zU#iyLwfFnZ`8@YM#&!MwW}_e6#yRsip#VY}t*BN}&$UkH^En*uAofa2(9J`d`+i+o zsaAZ4)mrdQ#zxO#N^%?G^6&=zkfp5R@L`p+y0K|+3zj;}Xtd1QI>D6bZb+-OjLn8% zs?aXNK2fQy~X6W?8 za{76k{pJkY0A1%a>zO>;T!>Y*uGh6QD^+J7W;Xv_Z_Rr=H^#O!K~pVS(amT%S0{9` za`?7#g>Q3R0rJj_tvs#-)}tTNBQlfjr1rVmtwwOoj3fO=Hk(A5i>LE;yz)J=s>x&S zw$|En`fxWx3SzZJ6)HmzJffA;%o}f7CT3r>-2*VzQW$om8hS0PwXY)(qNd3?rA;zRKf- z5^9xYMC@yM@BGar8SB_Ml35vUtI9`opTwwf+HS8GN?9nvl*BO^&z|;^Zey?XM)z95 ziINtC>H{YPr?0igHo9hJZfm6(L79OZ$MYu(&=x0YzvdFiu6vX`yd)D+P}RyEUHVgX zg3QRw9;sMXp>&;lKPj4sV&Hs{=J1-QyUjt|SnqwNiydoX+<_JKejt z3YSV5D(KUsNx<15kJ>M{wXRqzbDqxIp1IkHWY+{yOtnF(x{l}Jb9O^G3*km9Ww8l^ zSnbv7p#u_T(1z%!X`f%8JULNx;6KM=o6;WDlF3^aQtgi>H3Qv|~ZVAgCx6}F$tuFpZ{eyLwthoYDYf9EWpNL@QZaNCmPfFub7G{Sif$u< zMOBKG5mb12SlC{$ADtKntueSh!Kz_eE@dw`h)1UvPzxqeN{r~se_x-(R z-t_j%eigmrINys`}7fJEf%isTa=1!!)(nA$<0tS?BYqO4sXtI*%p@uFAa5rbiS7S?zln-RWo7njSjLpmFQ{+fS$`L^y4g zhrL_9_5t(Ii73K1GRDBdg71=-pB#Iwgi@-Q0H1jJ{_!R*!Iqn=OpxrLDO6Ta+J+RX zZhKj1X6`2nw5qZ}6zl2x=P&)T|Jyr0_0v$|#=vP{?P)OD%IXq?P)%0^-GI!3 z(cnc{!A-M3vlKf!A{7$|u!n%m)jxLwmJQiuUH$%3JiYdpf9@|%J-qi|dvqxel4)4m z>3;2VoVUOGE&uQfzu1{ND-u5gql6qT{!@$?x7^Rh$bZaPg$`^DXT9qa#*@hXaqXAg!zwY@x7Ss*!FTj!F`c0WcW$Sf z$B!Qx;&gBOWuNnNKKkMZfBmof^1t!F{>AI7Kk2DgzWy>F^(HV7Zk9skiZPh0_q{Ti zuzUiXNCWPl&xB~pDn!6T$>0L(s&P8Li(i$s_ETbIJd z-}in^$CTELq?rH%d{*|6`bf$43QCQ{W=U=x8&-=`7ji7(dhO`PL3o}$jIplVYW2Gw zWPk+;veW|GQ7Cg)%8f;OFD8=M3}}8d$aI3X7L2grSke{_EF!?%$i?suGj)j@=#l$A zuZ0?`HVj4v+<>gCYo44M^{4*3zxv}p`Y)gTQ3L&eC$`W^-uLTE z+13sqo2q2Qs??I4Y|9pCuHaaJ_mEFofECbQ93$Pc5WNY6oL>9YJZuE>0D%HNS<_@IfbVU}NHE9Di1*1totz>G_tjJoD z7M2k#2Hfuc`H!BSALJBI6f_rC)gpSEl0LlFTGBY3_j$W!olc&WV4!+)qcUTO?!g2! zD+_C2voLRw2qaNVlh0hVak{w=3m$_+4BOj|3o-7V+sCFk;H zPLU%vN~>~&Pe@rt+cjfV!7MzhXiln7jSck}Xcw@01T!s$nN>GO)Wr*LLPMj3l$|O} z_ZX+sn!C|q7^jgdjYep$awaMu+hI=+eJAgjP zX8}ZU&S@|krW7kh^9Zr9;NBY*iRIRX?GlMp_%UTtmD3QW%#I)&m%No8<{pKbbB2W( zR~As)wyn8FjD1d{)p1|2Eal1=ba?V0;g*%jD9l{uZWe0VZTHU&PAm!PkBn7i8`W|A zU9B1%nCetb1go^x++wI23Df2dDyvk6Lmp3}Y5|<Fn!G!4ftg0&9 zi&=$;A!@|7&*{#Uh!HAOVjEu0$|6}>Ol6i(Cl5LW&0Qph`P|c^kD{Ks3%(dv)#jFS zHwzw8DWODI1+Wsv{^-(NRS_rR$dexnH1t!mTRc53xhn$o7pVu|)((0~j$G=PD?1S*!Wsi8K$YsfU@XqQjHsLLGypo*7lQ@`_}TiN&(wa_e)F3(M)N3Wp1e zwNF@o`Ou7o4yb}S6u!W!)j-*O=GcNras%_YtwOc$f{oaKGFhi|1OPHXM_sA_qqPoJ z?v7&ts-Tw+OcRehoe0CxB`-Vj$>{k`b@!6YmEJ~T^Q@|r-Ffbh6Xq~eA7FY|PaW-K zRW>hN2gLw5F2!~f=KFWo6T-fwpt}{FlU4KinncMy0VOhx!>Z)#;f{N+e9yo7_R!^I ze$~09=u?*nn>meyd#f&Pvuy|l#z4(z2 zz2IN=`~LI4`epy{@rU2@;5BdFSL={1GeJW!tTDwf$KlyZ?z!6*TG+MR3GrAiyUUcb zoOg=0rW4v-X`sQ_W`a7(TZOeIkf*Wjb1F7z9g#yN*h^xo5<@S1@O=;7@~$uWjlbpl z-}B!4rfcPSoNZop9$875kC^M?G>+OBh1%!3tm|e`iT!dtpSEy!Mm0eYPPbx>V6Xgn zZ{$peucX<{rRFES{@HK+OJ5J}+s%XPK2KaMg>lJ@T2-cWdZ8#U?O2X}O3)o%wHi#4 zZTN})7+Bv!K#1^u8p3id3zxu3GY49^k`zTbOf2g&h(vcKg`(5oOFPZ!%ym$vx7aG% zY15s)#f~cmB|!Bt?wFelTv}12Fg?NH;rpzDQZ6`ysttO4v&jJE1Y$MIsCL8XTYQPg zhOR?Z#Y0_@nv{?5wW{P~sY>oui%#>%1S@SCY|Od_?XmH8Rk>|u1w;iv&bl?lv9dqr&FVNf8CYieony@IX zb(>3jT5OoXP+;xl-NQrup0D{Ybo=}(-|>r9&2*sBk{qh#800L53q&!-K&5wk7wazb z$maX}~sAhW8nTq4q-f|tsGrLtlz(lX1-;k&nNo!#Aazz5=m)X-twDP$apPLKl2 zBJx^Bjjm-%=_|MuE%HzTlVrf=~L4FZ`kJ{?1pw^Rv@0O$h@qXN_SFGDUNUwGue`xz=Kb z2&^(N+ZE}k?24`oU?4NOR3`(us&->>pamn+5h&x{Dsf_#h>&0e)Dg7KI|2*eD!=hiB;VOwr~eq0A$9E zp6qm;ENadI#^wMxQ3kqICaX#qY0rK1CBPv%T|x!Aiq9T0DNAYS>ok!I$6hm1Y3`M) z7e_1rr_#h?orEfjdtIWaefbvh0~MQ~!Nz$jVtB08+GR;J@4Ydlf)gB^E%tQRk&rmf zW0KP9IEp27cd&D)OJYaMRuq%PZ2B&_2ycr8nyQOqU04L+3l*ZMqFAhkA(AD!R?$0r zHQfTRRZG-R_u#FvEVh*wG!U1bNvy&~tftedfR`Vy;edK@f1T6J1vZYHG_7O}*aCc$ z3ci-Sl&m1I!nPP6df~%g{T09M-s|5L@nGG)#I3(^{kwA^Q>IFSU>etT-2_h8cwz}b z<(iI=b2FQf?C>MZpp{&PVHUJ~t#DfQP{zy!v)fC#Lk_g+GA^J zDi&j$#_61Gf?pcLA-k^WbC*_Pg@wzT?A5dP;i0TzvAn46-&7W3=mFdF>(5=}1nFciE7_ruJ1LVDzfYHIE;TvZ{q*IkS(?`&-*6b_>QMrU9thzIsE5ll_CU;i|AnCOh zTA+>U4Ye6nm8H`-&6<4`3OlcLA#ilZj$TZfc@{bpA39Qg&2$~XgTF0QA0f;fhw2Gb zcwFbA)clS*KE@Og;hC$Yel%C*!2qDGRVXPKHd1R0zs@=0wB4MHr$d?NA z6QVTd<#Od(Kst!B;~JOfBw0${Mb7A(nC(ic%myV3zwTOd5;mD$I*n24o(U6T_%W?F zRdxp1K&)KhUMS7JXWG6`Ajfu3>K#*hf8&6Z4B)}{iC+2(r6qbN7#iJO(cm|Wm6@w) zc;zEd)#YGSH%c8S6d2ZQuTmvC&ItqdwVz@GY^~|r$O3xuegu9&Xl1&)R1RJG5@6w-2qRp=hIowTjU?6p2D#KiWLf z!wECSSbHgXuTbyPtDb0dC2{1bizg#Yh(=1jghF2wuL;@Z$=32)-(tNIT@^ZaI453mA^WHZJ zOeGtOUn-T6gMPhSoaSL2^r$mo4;bP@VNbVHbUY=;FIS92& zg--9pjYKD{s%7Vt$!b+L$Uro;kd<_XjIe+Sf{$R=5S>}859-N-!e;3FP$!VNx?$M} zVo`!42{U>@bf<>^SsM!4Eg-W1DY~k2$p{$ef+|y}Sqb&X7VRB50!lq)Ib7=%9we>H zS&&q;CJ|VnD7hiJ3q|wcxmu->4Y9AP$}|r+d)U*gJ8NGE*~B~8o#eFPc-HqtRPm0> zO?Kh|{hDedxSOK&TS|~?RhEiQcQ2KPl|jv5Z(*wXCa&IvVO64z$2tjfgR^R_G`B6h zR!OZADC^TsAv`h*(CXV;2~tr9(4Rf?5{q+;Sm74ccW}H2IvPStX3m1gMT5GRqZuhpEZav%ZB4#cDnN`-832on4;an~z{A)~F*;4L{<>-LLH`e$HwY_MRm|%F4j;eC?>eizZ^?WB(g0 zHdwCMiay*PKiZ#p^UwX?|F^&L!|(pkd9Z5UoTF%!vhd4VsP%8YPF?;76A4+`z>8)UH%( ztwpI{KsrzX9qK(yOu4e4jt|3{h5!-5?x^t4I-$;|6AhS#bSfaohOd-^my7lbHXr+C z2QI`!G*6}u@K(A@l*!$O17&alcVFu&(sUq-Jz+K)7#3(=j~P}QHVrm-$c(U3S;`%Y zKHV*RI2)E*mX+WJES5IDfXycS1qz)1U@!S z=sn&6^cKveivKqSiXn%2_j)nK4Z2Ne2N`m6Y4qNG6t4v7HX& zhv)!Sxm1_OSS4w9f#`G1Lsrz_hlH-n_se?pc&*!0#O7x=i<>jdXRdkO zK~{_QT4f7s7Cm4@tyC0&%GtmfGh?kq#_4qGh$sqX8Yd?)*TOOPl@7t_Ve(#cd2FId zrj~75BS%TMl^NbGa%Ejf_iYo6$M_R4>wHSU!lS6sxpj%;%-L;jW7SF+_We57l9(kJ zSIHXOA%he?tRrkonNu~xt+75H(XcbhlovR;RH&7l7Uz3Uk0+jxpZ9*3)moXwG-H}Y zY(Ao{59{Ge*B4*H+QS_%A6rtz^075{ycfkr=RkE`;D{1fC(PDLvO9o4$wm~r3eL)j zkD+Z_w7Dn7|n!L89t72ZlFC#DzU03(hePcoX(da z!>n)HYfa!Tje!nO_jl8MSS_vIBMlGtS{32fIs01xGguU$T%g!}8#AJ($GYyB5}HL* z*xb0Trg}7QC)^)A{opmPv-14={!!5`oC^JbLU|on=9R2xgeQs0QWf!o^z=b z;d99(Wb-~*b7D>snyb)>W~y>k(!y!idG*l&!yH7ro9cj!AvN8pLhAhAm1SZm`O7(1xjwYFeisfx?0PB^w;x z%}b-I=;kyT>3!2{o|3BTL2hAgU6wIaWp#4tfY}gg{8@KF+2HS{SE;I~794|yw$=eT z7ptFnl`Xh!jCT8?GX-U3-#DATNC1?NAl;}{>i@-PB;Blk&gPbtV)eMN^-tzzO*^B2 z9yoPvfvN5n>tn`*9?s$plx-f}<|Qb>Z4|&JF17+!C1WS>(4EYbs$dM7ACGJE{=2A1 zE{Q$z={*t?cV+F>(>*Q9)CJMCj+{&btaD{%Rz++r?P9CVC4?KAZ(L^H@g4IBbK+p` z5Da%SuO?SRD;JOYpfxaTDPh(&m^z4sDYe>JPNd-qWJ&;E~ZIzQNo z4=BIk8mA$w4m6cv?aRlu@7JoFbFQ@?}xtk^SCKEjhD_>K3HRHb03&0Ot-42g#v4p^$X2<0o(!? z1C$1t12$Khd-Zp?YOl4bN~|mtolTbMk!lgF;k(&ROi*I@C3KOGmG?&0xo+*H=U;kp z{|~?BkG%1%Z~d8{{E_=NV?mR7+4qg^z=#l7!Z6c9Im}~NR3=9SMXNp}vfgy=ZH=WwHhTq`AXHlbl( z#N9kFQ57SkI;7_~o+YYUnPwgljl2SsnbpdyKF}nx)TJPp=3F49szhe>j8`(FrIswS z%>u`(lqIe#S-XI;@odL;rD@Pd1f~cD(B3DHtj!z-ZUC3|RT>N#T=c|npyu^*CBn9i zPEu}8F$tNQhAJCa?H<*~Gg{7MM30VnVC&TZl*Pj74B$;~eQS8F>mxI>)D%Xe zzHMRKX^eB+yYaD&)6Li(VBC1wo8JCTv#4Am4^A}={X!Ova*LjZ*Z~~2xynR&nHd(U zyF$3@6k69<9Kb#=kSUXnFt{@BKk(CQKlL-;3B*ADs9pYU_;z3sDp{N3O6DQ|ft z@8AE5-~BbW(^n$}rILH1l*|78U-1Qh`p^8u{iE+5 z)KtxtxvGJ^BuG2T;)YxkIdkm|eEGl!KiaEQpsmhGWv->FH@*EWfJbmeWWj?5>oo}#Se*gUkPo=PKFJQ7#aJAYLb-S*>>YOfS z#u#g=Rv(0n-ZU7Z${Q93j0ga2ji{1LbwC-AZF6rBlM0zwqPz|0b$p4llnDruQK2$f zxQgyrJepA*J(Z(;K=dultWt9>D09CeY5kxSWnI4MZlQUL?yGmJHqVsE=DyXoohcdvIO_7PA_b#W16`R>`8LMz6U;q^+lUwxf`yueTx(sgm(JVE zy0=#iJqRzLEh0>rJMT2zdA1mSVuWvFJKY^ zn;W+w^?i`TjhMH$57)lWeUEKB#aZDXvWiA!ni&sq9kS9G9R?>^c`)+&l%2C6xyNjE zLZ+GbDFCU0B)Ow{kDBFigcdv7*s`Q5rOFMfYGndWnKF%>nR8uZc(^q()~zMOv|jO| zFGO&R-jF8{ZcTH6xoC+f^KG2&pKoFdRnECmFmq#VBY=JG^Ln{v?(+cZAy*}5C zlR|9K^|zpPi>G;!IaBTM2}@+obaz0xid}A0?)y$9%t>1-=iG(%*7Zan+D@A@*IYHP zZkYQ;IfZh1Q4BXnR>y5RPik$8Oca!Ci9OM`mA(PN;Dzu}5-9hG7zBC|+mnQ5*Ls9) zgGujxky}`ID>>IJmS%SRiX8KJAxV{CayHr(wQ3g_e!4lG#+k#F`<#0zCm{19p($;q zdHeYBi!bi`o>{()@E~irsrqEdTIp_5svz|BQ0N4f;AU|wl0fs}gWfrP0>(Z}lJ23B z*6R2AVUvW$>15U_tehoMF^0t`blz^JuWR%e@yUc}xr*E?wd zj?iGJ!NC3C?}r0vC4(2rZG^iUp;;+`bnlDJTB*u$XSq3?-7t4AQ87R>J5D`rY+2>w z%Y0Pec6!w-Uj2$!JhS;&*Xzo;iYZ&fGL@UrZ=CCLo41$C8g^jv|?<= zSeZsBELk&mvd|YsU^|@)pxWOT5UO%X+t_G6whb0Z)LMiK=HViG46&;5T;wPOF4_m=%;&1ZZ)cdv?#O6MV2Ey~gUc=s{)fYrKK5Vi}A`TS~$JhWlLEFrL=7 z-zlC5u-1e*Q)OZ)6Ov2@Lsk)H=BQlVDXrq+pj9_rbttv^(r676Y8oXEjtx4VqHelE zSv{p?BCVmF33Q{q(!;WVte*LbWD`}$l*|Yf*p6k9%aOZIlpx7}h zSuK)9xQ|jE5oYwLPsX63N@Hx<=MIW)ebFM|W~&)inSfWF#dd{RE%%Wsw9m9^@%D88>1XbbZ~g24S5?H z=bJSTu?)h9m8pVAbgIOr6w7U-+eX%*lcB_2&@cQ(FlLX&J zO`WP%j7#q4aensIZ}{kke&*iT9}kLoUiW%Igy$*_oUE#D`!n;A4}BO2LMo*FJA2h?x-n%0MHiTwxri`2RiYp? z*%qa8dH*cP>YYt2Zz(}@&l6RVd$&)rD$U$bL@mU)@qjn1NAvNMPd@Y8zT&IC{_DT~ZJ+$f&p(_# zJhK~}D9jO@v)0OS+P1h^Yl3##HUpn|?ZA~*)16mM@e{ArtA>k6cjkN zyrouI75p%Mk8R82Wukq}Fi&aii&o|VmbqtD-@ZO}uE()>(HOq(7sQFQwdNLEsn4=B zq6j0YK{P4r3i${=`;MPy%9q~v6aU?x{nLNp&;FU$zwMKM{cruPU;Ur{=6erL_ab1p zULVcJwcVgScC1L|*rAQAjaK`-J!|}~-}#%r@f-im&j9r~2 zj`Rw=l4Sz;-T&&le#PhgJXKnQD@d*^18AS|vp(Z*;V;%cRf@2c)6I~zT0m(`tu7|D z%L6fz(i#c~AC647L1bTa z4;~IpNGgCb^OdWs+m-v(^KFv35vOH0leuQpYZ;7|7d0}2hCvF%H3Sh0-IE7 zjTz{UjE}9Vc#OKbc~@(u8QjNQIct_`_!e|Qi}Dz&2rehWtY&6jRWf(DS4m7OSXgHB zr}_{Gj83Gh)6$tZ`S?%1@@u~NZ~gDDefuXreBpV&Ic=p&iC9@chZZ~yHWyE%*(mJb zc=fAa{e3_5Bjc&pTxPNjymuA!b%Dd)#g*+6Y^BAILDoaRHQh;1%47Q5fPLM_#}Q}(!3`9M`E z%_3`Ag@k2Qf{l}#pSEqTWTp<$Z5J18ty=T4u8#pjF_mURhA~Ei2@FQbfGJ>2w>S!i zqM6JrGYhrB>yUdfB2+Yn#VVAFa&2R*%zo^9mnH`tI34C&btSYu_*X%BjpipD!Y{thAt> znDy-SV}l>3lb$J(f>#sP`jV+$am;OOn%QZgTnivg02-Ikl7K3e&=~mZb+_S8FJ?=l zt6;%-U2@8}_DPxw-WGy_4O3Slq%}({dKk+rEWG-yk~Q2V&;n?*+-@G%S}tF6-{J&s z0(CO{x^kGWxeUHk9&YHMH{D6Hj;CC8p;DO<+nSSPLpzGdC38E7YHA=9b0(vFMDIG# zrVe1`GT2hG_0$LIf@aFXtO~PQ8SVfWoY#xRaOd%GFK*#8XU>_z*lzqh+U7PhF&9-9 z162SLAj|MP(*b*Xw@1IX8+WRkf-i>#3}@Vmq^rRM}cHMr2YfB*IUyYn!%u^ODwZL6Gx!cyjnEy!Nc1lZ6s(zt3;7Ump2*X;R3jL~?R z$_&ZC#$8J;^ev?NnWXyR|JA}Nty1*VRA_9b`kmUU z+vWwi9o4e~+G}Wc7hAh)YMOckdwE+h@2bdgRjVrZ{=euuryn3g14J{hZ0^%zOH>bB zys5}iPm7XtT4fnkeFrzAD-$-lI;E_lgLMp_`WbqZTZ!b|ABy47%A|GmwHo2R>h6{d z=3Tq0j;3n?2dM$D-jqpH9mDvZSSeQzp?g{6mYD*)*+|O(m60?r87PMpHRp797}u(f zH+0^;$e$rNqYIkW^`} z-OXS!xDGcw#4Mr?-I=Li=1a9I$riS92ha0*{}oR@{HgbR+qZtpXa4g4`%nKEZywmZ zt`5YdXIl-gms_J-z{B?I?hz^BI&B-Zv_;Iy)6MDjayx~vINx|lwboixuInmyqi+se zU$}j6|NPwT?T`HAhkxVO{;9w8yWjs4Kk#i&y!Nf<^F8H$J07r>Yen6PO;UhuW37UW zAiR3Dm$i-#AiIX>2BfN4-4aa+(82*80PdDEt4fZXah%a=Pn+8f(v9;baQpm=FFp5> z&-jgh=ofv-mwwmxzxQUl=h$muR=V0?wajp6XeEm*ca616Gt9 z@1M7om6S8YWkggaeC9fvJ$(6vPx!=l{flq?rumcK^VHkkn%6|cUInJhVJO?IAe4h$ zhxW$I!ZOnwIg>+U)QBV)8ebDJfh?Ll$vW=cdA9VP9f6W zvyvu*gGC37oY6AoeKyS!^GN=VYK>fh`-uLkN4}9;x z&72o3AOc7AZyn=wD^Li>BrqGjgmFGS^Xi)i53u$Fu>p6o(qs!Qxu`?A2Vt$*9pA30 zT9@>#*kXnVR+oZdE^qc~?pKxEEyS5CbWJ{Z?Wg?tuluuq;E(^Ik9+2+%LQJO8UrZ! z^>*FA@8A8M-}>Z(*WJGS{1Z>U0Z=FbEY&?2SU3Pi>SB<&Go@8%kcBa`4budntj0Nn z`C1d3Gkc1`&7!A`?omf}mr@ax-C$#5_{x0bTB1oBF^<<9`vXC545~2Pt1`(E%&HSS z$u-j+UU1r;e#0B=t>I z=-+(bkNo_1eNq?tMxlIzrWUpN=YRHRecLyG6I70xIX#I2hpmMh#6-tX+N#yckN)kI zHB`%^3K5=?N-K92$9W@Bd-5ccReyM#K&*W#ugs#09;Gt&q=M>SyHS=XHew15ZB+w6 zIcpC){owa}_lG|4!ykF!apeoh0SZ0<0s$jXKq3VTpjD(oY(JzQI6w33ldpJ1u1UJH z){=Fb#qOelsBN>gl15nXHRaw)TNcuQoGOQHBS<@)NoM6J(aO0bR_=Q)M-7sOwU8?9 zq%fDb9WzAX>_tBwCLNR4)R7%Etom!sCEWJ26Fg83+}6| zl?ho$6wFqo8&~db4x{_%j%enhfN2&XlZ72TB#R+GrSS?gj*XRY2!_ax(!+B_^2UXxT@wH(do|rJTH$hI?g&vjdQ; zDpMF7Hct0%EKU*@3JKlOg#wgUcK%4l;=zhiq<7VgFvG&yZw)5DJiO0ESo`Nu3u@GU4N(m*SfGOH}Y12k7H z&{G0r#g%#9PID=SO;lBdM~Q8uprb13ZbjdWs3g`pq+K3c+dPf%h(sB!)^hV)>5hU# ztTjt%qf=(+(^w(RqF(^*1?PbYYXlsxb05txDo4uPGH3I_JS-)xg+6{1R^}G5&zU{a zf`yq@TKJrkBib!0flhkNoK_gyR#gU*s!9_G#>)NvlMjZXt@itz>`IQAWVufnWBAq} zh5h@w&57)?H-8&|E$BZ>h!8SdA$ z8$IYH(CmCVH5!j2Kcj?@2}{E1|hC`jbYZ%QACy zDzA<{oC_r}?8w0wV&y`!li8Y@LSnNa)11u~?0*EyxypTW*Gw8cY^_Pqhtn(wR6!`1 z2eA$s70`O8YIccwYSOsCYdr@Hhqj!slszn~DU80%QZm2dt zqpH^c5uOW)dH#e)!0m1btftVOuF zua&*IB~5hHlFaC(C3XG==s}C|2wxuLN~0CgxbEit_kyDTW=AWHW&*2?Aw7qH66kNZ z!6k{U!RY15kpb-xtig`(zkte!O{iWy9+9V1rF?kh5_mA?3{uaisxwU{KkRS@rDSyU zn8}>gCy^{2uQXa!GBagmHcPS*_h0ip|DV79MZfBc-*diS7o{T%Roo}emPS8qr&O+M znv2LL$5eP#1?_shz+$fH?gTUUN*jKB1Vpc+az2?D_qLh3$NlkR{P+jgZ~aq$^DqD2 z-|+JH{@qu-{uAbQe1u32Gsv05HP@Xi(VJGKWlRJBupRo=kq1C`*lvK+ZIj9KcXzX+4H z+T6pHlEKN9a7SiZ%j`NI*cN#1uJZ>iDwMgl%^VMxY;m zNGEAE#tn#n{cqm=DQ|zX8O?ij=$3Vv`^m-^eeoCm&A;_muh&JW;X5r2Cy%&NjL5mW z4=r^S#7woy!wPBeMRbpYip)! zO|MmB8?dS+2+aU&Je8OolvKjJ3ujUi*5!O?u}s8%xil2AFOKAOpA9qZQVv(ZdlS-k*-qP8MCG#MmD0r^fDS`WHCP8h&V?lU@F%n4Ty^xP z%&=b{yz2E2pZn>zeZr?bdhUJ0Hf17QYpHx}*stsU{ri95kNt^1@&~^B`pS<3P3{0T z^Qj72tGfj>yzwYKo0<8lbg)o#bi9MD8y!T!J!;l5zUems3bd?LbJ-zenOm557tBW# zD);7vRVj&9ftUfRl}qjctR!4Yz%yk=a%mYt14>$5Z;K=BnVXw@$ESw;g-4G*{L?@7 z<-g@O{bmdUbi&f9*er=J*a`?Sw_?+<ndW_@e15z0k*RfabiSTbvX0Sz#?47HSHn4ka4eu+@05!FD`HO^62qNIQR zFaDXiv`*-~OcYX4d9>~&YSRl+q+L!%b zzvPd8&F{7ACAr+dEIO+cZOTyh-%(QSGq$ZXtI7@g%2N!9hMH^jrO`axy)|qe-c32c z;59FgOdXo@6$%EWEU2o1Vm%~U)%fRPw~bfHJ-1559T*bu<3r7!LEtT%0PsM!_PKaw&2`uYki`oj_ zUe4-EK`I5A2O(26yWGN(RaIkbxtcSH5o6W0V3h}*L~@6^G;tJms&C9@%_kjxxL??W zZ;LMannB7VCpKUxO)clP#R$?8)GBrpous>jfac|ra~BjqM0kv4^TjbJ-ZB0?da)kbJG>Ze~$R3a1hKT7ngThARUaqs-#&fARFA!A@?v!%33sr^0Oi(&YZ&rimJ@O@XeN>Eal_dM-5Wl z#;C$t35lU-p9bCOQWib0Gu&!s^N>`PwVdAg1*!IZZrfIUs-&sXdj8H@v)Gi^anKcl ztd6%CwBWRTPN>X0OJg{|tbLqLS`!7c*!O8};WirKTD5K4W#2(#(!6ss4WrDSc<%cg zQ7B`;ga!y$pV;=jN-?4&b8~o;r&lHW*KCL|fW|;+6^Nv{^%MzCuqxf7sH6(%?5Asu z2qyvRF41E&dO(#@|GEG`2n*7(X81r5Ywap_)Nd(#pei#+J>Z%UkxvClb1(2WKwT-Q9EhnBJ% z>%o-?(8K$m%8;O0gh81r&ZiE}9eZ?|YFYPI%#B1sQZ)hcsEPx%vZ^T0QfXC{gVwn) zqq=Lvjt2{7E2T=oRK=X#B0PFmEa3oL#i1;NNhu^c%ibTUvLIP786D_hNFy?;L#*9E zz#UPgDogTcCHFzTP%FuBH_S5c#&gfitUACfu)zUrlRRAxZ{3->@mP?i0g2TW`_`xC zT>w&c6l;v69O_289eE*15c2LDQ?llJtTG%+pEgZ^E|ie8s7f^r`cag7NO!QBn*(42Q5jv>@bU8wqOH{6P zcU&!yP!kEUDph^MzoQ)yWOZKmkjM)nWGEz#c~;K`)j_baMY?40Q2K!R_VnxUp&$O9 zZ~BHeeBA4=xg6V`m!2wbW1|aB=b#yF^Ee@Etpp<6y#KQ?SLMv576kNSw5w0y{p6BX z&d}f(BXQE@h36mt_=jHp4S)KtJo{N+@}c+t*na!sQ+7M*TEmu|A1ksr8W=-)RCW&3 zH&}onHlrFOmRMxTJ8S8}o$&nv<-%q{#(&Nwn z>i_1m|ASxiZ-4kb;SBB$#TazjS`dkiEK%1r*UScWz~bJ`2?e^V>T-MQK7y8Ox<#V2 z7De-zYxT;bqh!0vn1Q@bz2R+d|Iu&#hWP{EcJu6;_o+%6;jn~V=S7v(8b{f zn9-WBh$NF?wWb+qQCdKsDw~Qyq`V&;M7uL+2dJ=%F`ZV+Tydn}sH5qLW)YN9YeA(0 zmhEF$crdzqh$FlvGqXG*XatF#0$B7{33sI!kZu7)b0`b`jeqNJ01FoAk{Ypl!5ucf z;AG#fw>M}gnWoGn5ul2yyt^NLQMXG&GMa*_>?PkSu-Kpbz{kJk=Y~Vc z5lf(1E#+06cU$@R<@--RE7fjUnKI=aK*pGvv()h?_TmjSODIzZX6Z0EM7VFKc;d;Y zpL+VKC!c=e$tRzD>d6OBKJoNZ&piFaD;_-k^pj6M{nRU-clZ)$`ZwTq4j)`KBxs6BnzPT%y8D3}&C&h= zq?`9U303VzC0Dr}zxS$InXKFE6`8eOzP|i&tw*`vULHQo7hYU1y*MA<)}t3MFF(KE zK3-NHFM=3{{6r0 z6;HhWLqGf-@HlmU7isb;3by(VRDDV+WiyM8hraVD(hoBacVn%FVJ@f)8b?pMk(7>p z+x1BbG_tA>_fjU^dua?ouvA8L7y*#^FtA|5Jr)UC8S8jWMkidy$x|K{0B>>?o z^S$$HKlNw7?lXSrgSUOoPk!j5zvVyvwGZO{AOG4vlQGT_hPCEoDEAqq6I`erJ5~Sn zfBm(2eZeefUO7{+vV+fv4%uXchSk>sfN|aPfRcj@*pU&q;&waSypYg7DN#5~wlCg2- z@@*jT5B~l?5^tov=3Wqpa8_02G~-@P8tc)_aS&Nqg>rzkn(TL-`2KK}GPOK5YcDZO zT6^{_1*;aI;wno}w-rx3asSCDKJJxo{^ZxZ{++LU-8+Iezw*m|EyGx(7L^b=P-^R+ z{^$Sq{|xY{H^1}d6;FQnrRTJkoyGy=MI$j(?Fn|vmKszgYIB;jy1i0m1jhaE_~+jV z)fijmq8k55ImCL$Ti+zV|I!Q3Z!y-=9cOES{S;nus@bN!RAXdj6;ES37L|~P@%Rf+ z6o&N{9we}=uIu(T%qkNSklo~#70noN%)$wE9}omE*A-~~Y8ssh%!(?2w~t=J;}_S9 z&&`)#+#fw&j~_mK`1tY5j~+dG>CwYSk8fYRy!_I`%cJX~hcCbU;{N#2+%MNhj~-oK zI(h|AC(5C0zJ__ID#AJ{A9g_GdjP%WT)B)}xu5ReKi}MNY}H@^X$uCBEBD8jb)A(J zl)I;rSur*bkFanvqnopkC3jc6YDog6@Ntmi|IuGlDL6uo|ZSFo*&64V*y|E9yl~pSnzc9?RHEX_| zZtk7$-D5}nef982=(wQ^Tx&%{wJ);Nl$mCFdswuC#)m{f;l6Sj&4$-; z$!luSouJPQJ=&<=bCX2QzARX#EFh3@(qRTy9x?^d*=CQqFEue0g36>e2+gcUg3=Vj zDY$urg>mLANn&i_+cr)&r}K>hYpMiut0w20Z3xVHyT5dMdFlH2QLVXwrwB;Hcsh;P zMi-L|R*;#%NEMV3(YG4_GuP3mh|yI|Gp}qEDS)b43+=z5hr=Ah>Yz%j%4IREuRlnz zVJ_azPfb$Fmq^3bX|uQ2XwhDWJ#1&|%FI-$X7xf7CNs`C#~2-#Y0&NY6kYm)vGKo!g!jvwS?Oj4xmhWd zwePppQ9;tloSkeslJ-O!ciWLiBiUPyLwW_puu4JNR~OQ{dCTU3(=1R;@bqZCdG+7C ze?Xntvw~RN0$|Z-Wfgtq%A|?J>LOZZ=Wwf%=Do!yh$_0Pkvi(o7|MFw+f|C$w=TfY zNJe(l`e>98$V^(-jzu6W5*^nAta)lcL91j(Ak08l2t^9ns+g8*4hHItOP`N)g-J(w*52gqDrmRmPQq&q&olHSmy4}g3!zicWdY6VG!>pO@G2l z;0RZls&m3J^#6)%1&TpcElQA^QdWc;vi$`Gl#?5){ zJCh3)w0o|HFMsGKuQ$KpkA28(U@0IT6WNP(m&mqyOV@mDvGS6(wpBIpM?6i4AcdO4Mm55;PY`TWq+rC@?m(h!E zY|05DxbMaO=f10>_jNhvZsC2=$~p*5u948S%Aa_{xBlaQROWH-gxxCVTnM9$(7E+|JR@UZ-4eXKjU#-43(g+5=*vfK^I1RHm!EL09}sW&T^8-;2YMu)a~343G# zm4yKpU2Cn~$4NA4l{s>!yUe^Q8uGoWlcf-nHCKi?(*y;5X^ml!XYDX^GC_)!i9(Ui zeoEFVR!{AZ6enFBa&t(E2ERC<)oNBG6b_f@VUg?fai8?Ze&6r;oxlAzKl{WJE3aOr zVQXE(d}dnUJHP+i-~RD$20%XpJuWj~Lhz373(yn-xHi|j0l{ffb6_T5%$)tN9Of`o z_NLBomp}zU3c1{^|Js@v5uN(%Vso+GM%9xb071gI5^&BXR?)3$xzP+Kk2JZ`YOGyG zB5U7wI_jDuJm>ABd8u8eCvKkn^iR*nk6-@qhyKui@iqU|pZMDEdGCAQ`l=^1=PLI> z5=+Z9f(h0y`mCP=o^Kz$9H(tnv-N52%4z5{i$lw4Ypn;*zUtxo-g}*SZ^VARj`J`> z$-?mH(Th(%`PA?K{lEA3f7S2W;@)1j$i;JUV%Vsfm6gp`?h&mBV4S>Gk)jYjju@CY zhFvO8G%^a*|e&x*Yqx#(=GzZEm zEV7}KYmaSEthvwCJW>}?H6u>FhUpg$-B9XA_R?~*J9-}GnsmmvH*U7vtHkz}-CYk9 zZn<(^Zui?;2Nf_lMUPmy%mS5e&WN?D56y=?s$r?Q!bjsm2Q9nPV0TPHSzj?r9AR_L zVZ*}RZO+xu!^#yjvWW=HDp4SF&M_i^uq|_e3xu16dCm;?>X1m6t%)j`yH$VP)bIN+ z&)knH%uoqyUdI>>141v^vM2_W1ve9+l?;#3rMh$hBv@^gGBYQZ1Zk+rCftSn0+aBYH zh^jOYTKk+HPAh}860J%Wn;CPJg;xoN@KFUqm6L9ji$)S+bPTN*doYD!W_h?3!&zA~ zYmhkHGzvPmE!Xm}<5cQ&IELF=S*e0SN6*)7WexXkVD0;K>vhP{p_7w{rRrMla4)B6 z8Lay<5djJPKr@cm3Tf^@=32d@z3wY|MsL>bkWw1^NY2cHth;ah8x=PXto`^qK!qvi zF-F+7?Q*&1T2AZVNzjzp$BkW!aq{{gUVBcuk8Z@% zO3FF6?If*XW1sW1oinrh6=qJ9pe`;~=R9)4e1s(`BCuGMU1yH)26A^J0Z0gS5QO4D z>^7q-TQ~;yDAb4zthv^R5Z#?wWyaxgz3xrcG-K7Of|Zk~EZfGu@2aW@%bfcfV>_1J z2Z7r%6D#2{fM5P#9LJ>T2e*Dwlj4hJZ1+7*!e0LWa-~ zJ!@763Z(_o-A9C4#SCOtNGcv_NqkIKLP1P5O<5>{N6N^};n_T2hlv!++C6wotcu2R z^lz)TtG)8?IvgnFom=YI1b|$*+?%(hN-e@=heM#@Gdk)Yt7`KBRQAlYF+U{Da+dRW z@fVK@y-20Rh2$|vsdl6mc*hG(!caxG#yA0YH%Mjmhb}7#(_!L50pV=WSk`J08&Pek zPn4NyRmX1F@K2bk%v|W2UWqb#m{lz~Swx|jMMgw>76uGDp0(bjfK+ico7&yk-)ow& zDS&`QuGJMku;FuMW|hg|O8P!NX@C0f)v|F#(OItzHB7v=(>Rgzcm1_r_VJ6JBT^LoNd z$6h&%S`P8Nv7w7*3%OZH``VN4aLemV;okXtd%Xq`V|)DY(fPc^IIY`jS;g3LR+!u7 zIwBErA6S)0+HjMK*T=VSfBW12>HqPq*Z2S6z1O{qt2{P%_Ux{@*9F;TI3`}I%0bGH z(q%T8+B~!9%nrgFG(l7?GMv3}Kuaw$JMCf&S0-3lMH7V{?aQsFN(FvN3)tN>}0C#>1SU2iSN1W>%5(&P0AwK z+rw2mPWS$&|Nbw3(XaT0wm=R!yA_<3Y~#;}zHkxdVW!NLMVJjhrPZhPr5@V&hd=OB z@c8QA@tXjYCdY6v*UF-g0pwr&y8i(Rgl8_?+iWFBx2;MwXHW1=nZR5tPGivkxKU+= z3~URMQe3R_hd=azKk!xmPmKGhLJNh!!yVL5L^(oO2@J$j=U2bw!IMuRD8_zy=%@(a zGaVvbg|L9op@a2B>8f4J&i=(HwFiI;>fQc^QeM zEF^3sxG_~y*vKvykOHsk@oQi8`u9HnkxzW*XMgB@-)nx(OwW$U+sYE`6W;iyU;Ar* z)7Ss?zqW*ds|FdVWdNxERckY>f0niu9cl6FA|V-yc8}J8Sw7n zL#5b4rPkt*CNr;vo}gM&x7>o6xebfh;)!5#MDMtQ2yrgjx?Px$E<$C}I6O=?Yihs5 z7y;GUd42Tg)+BrKb#Hv~wIBb%ANtpCd-bb6^xTJE^@>;c!`nK!RJ2%?wgTXJi|wh` zJomw$eDz!2Vk>8RawmjJz{=6#W!2i}{imOP_&)r@fBKKV`13y>jWK~cWz_i;Q2m}S z{~f>ocYWp0{Pa&e@$56Yl`SlocRz_h%VDj}L@2Zd9;endRC5Uh)i4i6WpO?FWB=uU zhRJGWAo3m$LweMjz#(A&oNN?A> z%(|Wox5&eJ+1Uv3fLEqsYuE*3-5{@;J-cnJ#&ti!A7&1d9{?b^pE6fVM{ELEVOC{^ z1G-VvfTeY%!q!|cQ>N2Fq9;%S$OKG0-MbNNBI!PrrZP9>oco1|svMhDDGb-l&Alim zQYj}3s5G*J`ECE;SXHvt)4B;2;i)9yZjdUIX5dkg3r8Ncsm|I@&=bJQ5e`I{&wW~$ zdRPx@8F5%sg^KiCW%Tf-n$Z5yv;VJQ~rKIXnh1Z-rYHN@xblxwZB z2(MgdEQZ@Qwzi*@%3w6rzWW&MnW2gT9bQp=)u6Ba%8fu7j)lEII$3>QtJVthj>3_( zj6|@Hthu_kJZ&>d}MIXq8pMtZ|CD>WH$#+>pJnrqIn0C}>So*;fK( zHr)Mm|7_f<`8*=flt@4hXU-it=k?MH#W2yv5=Qg{O-&=3tz;MMNL&IyU(*UT#sDQ9 zMZc_S)>JLI82}^{Y|OljxfbbRoRw{wYu0V&m{GM-+cwrdV~Z+6d0lIZ6CfY1MF301 z2?=4ga^Fs8Ftqk$nK9gRPPq4uSjxI4-3gCg#F!eE9fqtV9VFc#Nc{gZ^{3&styftt z{5-9-w~sOBTx;zryG|WK2q{4b5Gnx`(4#0S#U}zsiX*jxC?4UQPbuOj3JQvVARvf{ zB?=cJ5K03fB!tu?J9V;??Cg52HRl-pZN>Ma^_6qTAFf>4$y#%c(fj+h_B{6;QKFbf zN6UcJN*Uo9po$7Te2itzwU~{)ETN@%q%LC~XH#EWJ8P;!u0E^M7ITj+!=mUmO!(|3 za(JlNjCBz+wXBXhYUEMJGN+@E2q}2DQYtW!3Yr-*l04a;$S{$yHlzn4fL~U%3K8waCaN%fZrSjmnWbtu=W#vk z_d8XM2vIABj!`}r+o@>yB$zWf#AjwX#a3Sz8)%s>AO@j&MkBO_4n$C8v)Zer4i=nY zhKllZp{b4LlzB{54Q~`6AQ%dv5X?85OkIB-nN_49r6`7Hq?AlcC z{GlDB7NYHj#S#%9qsU01#GK8bxIq>p98!v2z%tPe`A)x}!Y55dG(57vf>5#~k!nH# zS=$gBXc$AJcY~wqTfXW`PGPeers6be(#)xEUON6t8TI?`2 zMf<6`Rf*f83iQXNjXaI%Zg*6JE`;C~wJ4}at2aB;RqTjswssFFPw%WQ!J%pmwVAUD zH=g5AlWi#`C`o~d^cOh064yar0AbSt<|ILXcIS zfl4J*B|DBp0J(_vXPOj(i`?*WpnA(5Xw(!dK~YGdlWG)EV0-#&RmHki`vE&8Mo`2N z*sknSmE}&bMB1LBU6Ss%ry}|N7?M?`w34LtIyPriWPjv9 zH7WsQkv2*?yj?0e#%@0Hj?euIpAX`Eoyqc?6`5paHr4RQe)uQtyH6BG7xE|KdA8^2K*P@5N7i-Y4Gs!cV#T1uwqq zxgUS;^FHaWXTSJ~FZiT;pYthqKkt+7c+QJ%|L|v>-F(F(*7J)xUP!@InIhB#JvtRE zBu!fF*^m)LCo_>+spy$Gz&?$|I9!+8q~}J3^33rOH;(0 zCJlrN2&qu55woJSJFBIPVh0S!0?P~06uHj7R7zo}p;DlrNUluW2u2DkMT$qc>9~*_4_Y<=O6sf`(E*DZ~Oh1zU}vZ@vXo23-5U4 zufF$HFT4NEuYBmy#}>87rj#Np)pU%JK!_ILHkQ5Ymr;j{Sg$_$IUkMv9Z!7PGXTih z;uW=-VYDp#xN6z6p7$ceg{is7V1Z?$)OIW*tJ@(VQYx|-bpL(-c1R|w_2pJ^SzzZhvJDSnB8%ve6)71zGI+wetdQzUAJ!c7QFk$F5KJl139Y|t`PcEKc>41mxbNltyG^O2>~z;^q0Z+QvpPfRkpYFMjYUjE zBE6giN{@J!)1Bza$;s(%IXOLBmMgBO*VZ|S8ReUGsTK8FDCK5PE2SBV3Dg%8fie4vDmSqeZ zEl(3_uC>9*5`<86`lN_7^Ey2=e%bVW9Ap*B`}2uW=MP(OFG!JwHL86}(%$kfWr5K4NoLNtq_qN^XH!J9p==~fz; zEZH9S(*02zie;W(7><>Q$lASdol`Kz)W((PZq@W6t!b@+{fyPtLBK zoSp4YPnq;N2@nBRO4U##+~?uyRlm5N?$RT*Hr9!%%B&gTi%6??I>1S$s+L%(q=2F& z$ljy(JXH~qDyl@cNg*_m6uNsAV@|XHhXU1z9BOP>sfT9?Rm55=r(>+^nlZCrHVOgZ zTxZ3M=|&ZmVTvl#;nVpc$|^erY{a&?DO3X*`-78+M35SNR_qs3)sQXtMFIt}M)XLP zXCyg#x!yRY7Jeg3P$E>dtfaMUu!xORmQgB*%4I*O;t`^x8X}M}kH?B_CXg{z#Ah_5 zJYw!_$=J-*k=4w$uTR&rAgH62aZQ5;rAm5rSY(Pd=Dvh3#S6oE8+Es>C6nK>hU9ua{As+xjQ zMfYHP(^R1?^*E?gR)i8#?Sbqof5D zRavZ}XnMM@MM_bWGrTGY72$rjr>f7RE|0JzWL7c z_q_gBe)6Y3`76KnmB07K6Pt=Em9ZN~pTo;4*T_K=(c?OWTvy-iPTGl387Y?ud*>Z@-0@Za;QLiEVxOc?c}s#l{!kP4%%Xgs-?@_?O>Gj3zjT#9AMZoT|RiI ze9v2Z7b>!0`qUwQq?6JPqK`*?ml5!vAoGgl8AW5AL+j|WtY{Sc1hdhiTF`tNl- ztgIrr*l^E|-}c&L`U)jg`;{q5$COer1q2zDvF!ZfARqSZr~T@`ehIF<`SQIVb}@Yj zGm3x?Q%XiqtWkahve1?|&ya+O_1>GjK@6cwZ6Td-kY&OwsSJW5i0leuN^hOjZY;hK z$>z2TlnnuF`9+}!Qvn#h1)-HPGpwm)73opjtfiZ@xWB8L?b0F(;S}ldQAw$Bh65Z! zj$ZCrCwnY6edo7-$CrHWXAUaG(pM0~&VhNnIN6V1`1xP>^iOzU)>GB?b6po>&Q-^V z46Q zQFvTMr3&uH9hk}#j_qZ+A%@dSARFGUpWyup6sam5#)QahC)w8X>J(DMY6@Q zo7FeLLabmiCJ1YNk@UKewc5~zHNdHqVoWOOlV1!$k=+y1#%FP39>xhWMKQD zB#DwddIW>(&zl?<9S><*&mOGWsDi? zUPp=?*28}6zULo*-~agKU;4Ta`?7+%rx+F5h=xRGN^>$bveFZkq-uv}6JTU+&cBRe zd1cEYJE>o7v}2bhW=DK1#VY_1Qt3vEj2dPvh(={q_(cXWmff7kr#<88-}DXt_}%Y% zyDnpOA7JJ<+WLZLzVM&^&=0=hWxsX2`HI@8@)N}&L6T_yGYXE7EV5=6NV|5i-ut|d zdG9O!`!D|LZ+-S>d@^IIjY({RjTT)HKt1^!{ZT*p-{J#JA?|<;(10NhWpQK2oqi*=x79+(bxdJ%^Qe)6aOQxO-}A07KkDB(a*=xZ^7{Y$>%AH!~PPo+e4 zH9<1KQc;P{IuB)zK$YpP2=xaaeCX_ncX>2ljV8IVUghp zX1Q{B0!VsBDlu8QO~D!SFy-{hX+He!d!PLruc^sQ*Az+?L}4g-?|UBra?OZJ(*z0`ENtBo1+BcFEX|Mq!b_VYjcQ@6kHGY-c`)dm`1Rpn7EF2l0J%2{HX zH_n)eR8d9(c`^pD|L*Vk?!Wf=f3`!={j;h{Py((ZKl`74@>BoV^Ccu@Sp;UWt_P8^ zRi#KK0j-)_0=_E4%1~ZZtaaR)DcjY7Z0pno+m=MEOe&5yEopR;Y<;qP}WunLg z+L~Naz!orVpK-fVQX~{4H;NeB0V8p4Xq|EbkDvD zfR&{L(BgOzD-c<;5*6T}E<02YI@`U}LyWAfaG&KqCq)-EQ-RftTt>^E6M><2Bi4_x zSj?Wl1C_^vi>F?K!OntPpSdpu@VBfnbA6zNwv}Er0P4s28fqr3Lp>>nLdSM zh(v+pAdjWb1p-w%4}3dnMC^bvlYn*Rmn&o#fGSA)SSNTm+%avwo9QTBg|UVQ-{Nv zg`J& zsEK=0l#$XE$>ypClnTNlh+=XqBf^zhL{%-zGFPW)MY=$R5aFh;uF+NsQq>wIWoi`3 z*e-%MV3Goms_LcsWytim8;8rp$~*Z}fGN%QAX$mEqDZl!6%7>AT$y2(PBhN@Wy@sP4WLXk&-2 zEfc6pin7$uyM3h{*I6hQ#7aT*W(=sFicy#S{_^Q189F0ovSO+X-wFrPBm^k?>QmUvzkLO$ zWX5i{TjvoTG{p@VWq68mMri+0$ZT0&X(RNgN)=S82`k{ew`OKpF-b%wA!MOg)pF#W zj;84grCSl{-6b?st~piA#K4?05HU5X~YSS)6!PNGk zvx_mwm_af%h1ycXtOQc2SqUe!W8{r&s)l?ZBBh^2tW4EjJSF;cnFWP)b6Szv-yMP_ zZ2z=uLr?%x=%P!pS(1@xFhmP-drH*{XJm@1gQAG(1H;RaZYr4#&!R%Jnjl)Ok?ych zAf-^~3x2~k5LISyuOhAcXx1_Aj{XA5m`O;{g;GT*Dgs_*g6aTc6zCB{Nl5o$`iNN_ z;Vy(1$t`t3K#&5-7E@6 zpplE1``R#R=^1LbN2F!AsJ8z0IDQ7H<*gnsuokswpHF0E*{~?2!}q7RT-yJ^fBm74 z`rN;G&(oiD^}Y9rny1b~t2QO)lwm_OK~lJ-u;1jxQ^3%?)~(? z_6cA96?fnDl()b6oe#X{wWq3!wYttqU5QMtag?Fmay?!g)KVyk09&sBAw1^Ea(Xe3 zyJcjFiXk(#vL=fnmX*z4j7+8{av5}TvHkUn`ILK~^v?U<@Y;X>!*||&%ehZetpEly zQfQHGvUH8Mz?rMcP^EhqltzzKbQBmKE~+f84Lm^60vHp;37W94;njssXbGit=o_O) z64@_HZM{TQhKH$E_OSOuWB5vxne_UxvP4D9a?bFhm=&8#MUa~}P((JnXY0kas+0q$ z@Q|dS=5gKK@wB(R`nL~j>`zaR*UyzBqzcXn+nvng{G^Y0&htL*Q(p6`-@WJQAOE;5 zA*;x!Tt%$?B+QQfcXlv0+|BlgTLS}--JXv<@JHY9H@|sV_J?_{RwB!24F2l29|ir} zfBXLn%DC;)@v-aEYFAnwpzOp#LSY5*2)U8pgY;ULB38(hl3@L&v3L=j{Q%_|2aWPY6 zMryMz*|Vdb*aIrP{!)V2OdQ#9NI~o%Hq*jVbMCeBO*2bh$8Ob1oZP_!^*O>`5=83-o~v z`D<2@)E=xB%h#krtv_{*0*Fcw6*==|A;H7F+St^l`o_a_yl|G$Ac;hhF z&Yp5yUk{h={fIZc;$?6jKvb$&W{X`kix%^fU-+C){LIh$?O*wYdtdO$*Uqo)yoT!( zWNj}{7ON#Bod}iWIt2_^B`+;!58VHrIz0LZuY1GwN3Xi%wewV18LwS^@I@c{F~9ih zFZ-&$_7ykZbI--Kb4b-JfJqOZ zvr1(3QYg2+3|R>idVt!yN$*iUO1J=(o+KS2jNRFO7F3r=&whZ|LL}$vQL7&*s-|OT zhJ$&S#jIt~mW8`xC|SAAb(oc)GUbLoPfSUz%AlAEl1Ze;cFt5ogR{47Vz&!)v$KFX zJ%OA7q^S8C#gvWqErk%M_6L+H#fEt)DJVwfkZPrB^?!9I`&ByX8PS*Jh^zus#_44n zV?(UnaGs1#&S#bT#bH82iZr0;F-a+5I<#+^!i+Gp?qpSMohebtmOT_mvLs?kq2I~d zn1IEsj`?`Fs`U!CPeY#Gp!T59Oo#$$8UaxYcM+|u&EYIMbDQ#FdKD;|=}J{Y%oLHR z1X#@JQyae50c{cZhO*NVC;?Q3SE4GS3}ItLw#J&7VK#s+;Lvu0tn#30R7Mu0R1i^- z6X3Exr7ct;839CA*PJpbQkIfY9;>gY!kq4|W6@>A@hDX>D*;&@!bJ=ssPssqgBlD8 zigfj>RF+Lmg$TVNHWrlY(DK*}b3-*5?z0FXf>7!VFG96NJSmjby-Qk3%c`s#wvfoE z@}x>_bh7fO=FJ+!vqVCKRheFe9AiXzB~!I3$I?!1u+LP|nGr;gWFi|0tj5Y1X6u|H zLSdv2)j2&fhsh}Oe#W(22Uu*d8B$pwSMOPN3XOtvkIenaDRTAWL6)VXea%N7CNm>F zRZS$P=aB7w+gPh;a&D#cXQ3M)KP25q-rPGngWOy*o?3kRW+nZlb z#+W{ZtO#3nxmFDxV+tv1g}71p?juSI)s#x3PISgyCD#=1p%)`~_hmak|P><|V0xBUGR8jNr&TNVriA)C#C{OHE6O~9Xi=t-kYcr;i z0n!s=(VFG%wp$7rbLv=7p_J^u8h}EBc(+rP6e$=xt)60brV!|n9)J>LIf_*62|{I< z=|+$T)Eezs=rD{@r7u(!iR=@eic%w;BuNu7b}xFvZ34O-=OKy?9CA}XG;|x=P^y&D z*?^45uHF`;B1)ts=*j-cHg%kAcnJEHgR&w~$_|xb!%xUYE)%dykXc!xnhY}&GLyt+ zSlO`9ED8nMnzgE?z4ZT}^bw^pO_0%-f_@u_R_|!x>5goAL`Jk9M1hQ!98MAym|D!Iark~CdO7XmTgj`9)&DbQSIE4NYl$2XT+-Pe>mDv(j6kntZ*1{ zjJo9sSRei$-~SJvc=O)n^xBjZDdrIIDco5BvCZ{?0=v0qO97F-+byOh1y;?j$%;hP zVZ9KMOlh7LNu~CY8o*T5u@rqtXSoc#^{wxF{kx7&{EW~4+8_U!&;FKwa`~wr^U%ZB z-u=$^Jb3?uF=bhn{mIFx<&Nv3Fhs@qh{yMF?IbUDu^QH)wZriyt+T=X$vz9$uIBsS z`qqcu{k}T8{RMyZ>%a0}|JT3tP2YAdxBvDZzT>e&+_}?Jb7K|k7!^ekJ>3t{;n8j1 zA-ZroW@LJaaC0Fm5z`TE2S^(W#XKto0Y>G{22^{ zftO%+MqW;pR$yocA>2E4+)T(|s2O@#EJ&g}tWz8Xny6Vfwz6?z)e}o30t8Sw^FtR7 z)h)cPm0KCQYnAC#DM@B&p`*Zweym0B9oT&B?1wn2!puZ8juQYx*rQZxMhZAgRU0@^ z(k2a5K_V-2wimOIrd+RI+6sygiaH%T z1b*hnf6%TxB@bQ|Hd%z&5Vb`4j0*JOmr+bcBU*w$u9*Y}d#Tolp8=$_(UARA2}K&H z3L}(26g}ZbsVrthk+2C#Mr`&3lMS0sNsr(Lb}tC4dbAy)#v)=>u$siLR=q;%x+qW| z8a;tzstpJz0~jh&(Ol_jYTag5rUFPrpjfO(VNt7B`E4*^$3y`Y>o=xknY3U|Ob4}H zTA5N10W%^HSbaheaI%<|g$zh0fXG0L1**VQk?dA61PW4A_}JCQ?|RzD{@O46)UW;S zYt=@kI4W8viIs^pkIQ1L{>WA)A|s^$jz0H5p;{F+n@GWRu8}PiFR*TqOl z;i9utJ?B+Tl*%Ba*`Z1Ul>rCfS(Vj?Ma| z@kbtw$dCVH9}dd#J&)JW&Z7t*EtPD1RtW$TWYMc(IK3qlk1EiVw1PxQMkQq!mq#AH zzf_nmL_{LWy5NS<$dZhel}3v4n3Cg;|KrQPW~khB93< zuPC$?lbH~v$WRj{-|~hxV_cb@VwT0tLF6vTb4d7I5;9*?SpbQJ}KV;5e={F(popV#-l zRth3CtDWtLEY-a!}GW3lZ5|#)!!C0BzC$GImP%2j2AE-~HV$eD;yK(Pw|^$NuI2?X#YI=j|p5e@K@T_wXvyQCLg8cU}b0zvPUz z1R%Sz4DF+&_fL^KO#;IfKo{gP213OFU7E7V$>1IHJyow zi0afxf#vQQB`SSjcJ~>e>9RlDUAn~OWR092sI2hb9#r~zI6uFBbzP5(iZmji%=`8P z^h*{cN{L3FWU>k>ky!;1i|C0~g?q7R=;6-T4WEvLnPjGt+dam#AXSmwwo6E=s`XmB z01vMSM9jHngj%nHIYj$<#7q$oNuiDo-d8dGnAvWf{>p9tM^j5w(*lbuV2Jj*Tp$t2 zDxoer%c8qCwYZHdpnAB^$*Kwx*aU6eArKsAP-J&HyF~2PrH=NmOKHbVa86yHTvD zj9B)&zMZO#IinwRU{gT5QduJG2qucl$%)Z=ny0421~Ron05;e_a;6%YXjv$PRB@kO zl&L}+%>~WYNC8wdB1Q3`>f()RpG2jZf|%>kTcMSS;>P&ON)NCyJhNqeL{)ft)N#&p z4?8*C?M}v}E4n`^;fxF~piCE{l)|iG+9xb#o}XVmzj}49M*|n#4v|7Lv4}!RKj+Of zg|!ijscL{`q>aUjCWOe&Mio0->M;dY5bEeeMY~dkG#gnp*Hz6rq!}gd$Mj61Kk?f% zxF4;>A`R;4wXHj3zZ+7O5$*|ruO1O1W@8w8XkHPS8P%UdRUtEz)ct-*pPt@9BtrY{ zo?v>X8ykY@?jdRc@8zp!$`+wyHJz9+<5))9)`v*W*@kyy7HWTT25Migvp))bP2&ww zRS(D&5?{z^Qo#ZuqE8;y66>vM&}qz4>ET)*5`++fHip!OK@#0?dmPQCLS}j;N;=`( zl)?U3Q~KV^MuKFxphTKFEs!P?L8)7}f(2@~Y?2M(*+y*Ac7xVlp|(YcAQAmA-B!vo zTXvYaF)Xpk>G}-OC&(`34N^cEMap{BFI~R#p8J38-@fh_fA$&AeEQ>At`JNSr!{l1 zUGgPVX|`9T2$o?K4Ug_=L0hi?h|S~ibXm+)g>df-1ywv|Rds|Q(_i|7Kl?>L@@vof!f(ax&pChO`UmfO$AkC1;j#C<`{J>4Ie%>U zh0b{f-4QBjaErOD*N=}p^vL_(^T0dqd+;rP^w@hIn9FTFjwc#G{jLkRcUWp9v$tbs1zi>M^Dp{fy#pVRK&qN0!+icPU z`AX1K1tQdmj0pDlm1sS3modF#QQRc&nc*`)il~V-eG`@a?DH%HKe97=3Ci(!B=F{UzYBi-{qMNXZhk_=SdSA!wi!H9 zSfU;DO(CJ?D3+;U$ms+3y-rR}-}SaXBye#!TB~Frs#FAwAiwMTegyEl?|t$k*Uz~f zM|VV_!hM=jttYG^gC*rytMP%5oKZmQX)+Q;slXnu%sLYIt-ihS)=U^2gyE{9J1!ee38CjA=r4@~$vT@-u%flxc5L#72@3$hFqufBe zN)!>+|4hL{Q7*6+(qx5@)#=p^y@W1mbEk6h#LxQFPdjAoP8K3nl8`D121?3fX7n0L zsb-BRDL{MefkG50(%~^NS!72@QBa-yXip7VoaYhcQ*G%Dct$N|%xl4q`Add)Q8$Qxwx4B z_22)P-ul#Q*B?GRy+wzJjYUT(3n_wtXE;i=Cn{t3@sNJdn{WH=U;Tv)EX!#}lF8J{ z9XXE^Rlo6@zXZm+U;DfJo1TyW*X*#m`vg)79w|LCoCPe)*`*RafB&n#EXi+q%-?Wx!twV_aGLKaYUga07T9<8v>xB z5Qpi9ER=cWA}T8D;o{OQSH^PJi$3AgV)$+uUXZEus!GW@vkLr+f98|!dg^l?e9J4A zlamPdibP@_k1V2ESRqO8{nF-efdFFYIcQ;*WaAj3xwh-DDE_6qQiO6ySQS}V^$>s6h*S`A0U-)U?^fg}! z;_-{~s}DbR?fl~6>h*^ne)QsaAn^D9?{A0Qv0gjhDF;!KX}X0zdJ)N9(@A7Dy)udb zyt>lYw>r$0rl7zQ8$(7AiHPv>KqfpZnv@f4UqRpZPzkiihqNrykSeE*-RX(g(6Nw0 zNX%e{iNI&g3qPD!MplTb3Ko${Dq8^zWR0=())mBJBP(nHq~Gxsxo%n7{_93&dis_h z2a?)|6ZUI>9YjGzgcQ=f``61D4P-5pP^)2rMjJ*|YPZ;;IeMOgY&RaVLWH7p&l^|v zDq$rSHD#qwFg*z!wm;dQoY`)ljw%;{jzNk*qK>()$BXNkX-ZQ~aesxl(ea|?*BZXyM)?z=I_50%zsj76F%nxPck@X6?gBRsQmG1D<9 z9Al_SM0jNN+5pvy;$fq`l|Dl#;mF)l|E4n6b*>ZWb}`d)W_10}d#)FyR)0P>`7fCJZ4vevNENND#-N1#rf64 z`L$RtSZS)Qgpe^rB|N}THQBIJB^w{r-CfmUmU~pBE?Sull=H}D0~Zi;%}97s;5jo> zv0X)#sHiojDAi1qof7tRAT!fr?Q@F?Oif6sDqzmF(tB@NRgo~!jvlb*eVql4G$V=u z7vpq~7DrZArLY>eTR>*m7#UUWm3{4^i1@mCq>2d{bDi!wR8_at7b=gldLt#RNI~aN zR5aXy8bgPvN|(yJ4VCEO1Z0?z65a*qtnkXbVL&p|9lShSfC1GGgh(dU76EM-Vpc{v zOn3XUn=W0tb+0YOR&@Mw()(CteO#U zs4hK{Cnc&stJ{;u=Zx?fp6&%U?FiY=8y!O{W=0lpoMBYY@VQc`WM(E(&DaDGkXa@@ zMeOT`boq-})7KubOQ~9ehlRu#6tmraA%(>1aX20`0$wVjrfmkys5vJD)8}!n)TR6T znVA_M+JPn-qug^5W>w5sWa$E|fJyHfY1c(fEqf%BbdRX2(yX59qar+}jBqfk05tL-|adIP7>K62^Cd{=zg0jJIkvvI}|=!sW?W{m{uGFd+=H`jVW zrKmztg>Y$%yCa$XWM>qp^`(dc9c69+ooHpAjPugv1@~HG*QvpgpIh<4YdkDgxf8wswyBoS{KjOu~8wBV0R6B z{l2xalt>o(7uxb8X&loH!yAy1UX(1)+$vk;(U%;hW==Lmt~LmCdICg7eJImRR+ieZ zvFKKXD-c5!H$w^!z=Y0>nk!+zw=`;a_dG92yfJk+U`4nGJA?i3{wMKk8~ z=@Vd=t5G%7`Y=e*@LcC4)Rd7?-q3V<1UrgZkfIVax^PW@{BZ5gyKj2n{qKDBfBJ!2 zpKx;~Ryh%++EOY-Y22WR`kasy43Q?EZCWg#id6LDrJGh;2AY(Z-k*9PMYW%H4%ZE4 zjxJzqt=7t9^=Hh~JbFpv0_l!nH3LxCkDAQD4c%B)LbT7BqRdvy_Tx|cl3tmS3IIbD z8T}3w5h&ZAg$yB%9x|90>upcI2jo}(t#2F4QZuT;SC=Y^4mB!f#53=@^7i+j5X+iC*rKSMtuBxo>$q%?WJ?pQ z5-B<%-AhOTX@N?iOFtySqrK=ZgnnoUzoG28p|-JMr>kHlBGz5u8^E<@Tj-796v!$V zMKxWZ6%K~U0P125)N#$|_dbyUQI(wT~DciREDNrQfks0BYh4uh#b-g~&fI7fx z6N0MD3Xk*(QI17~5|O=S%?ftLmX*Tn6d5zT5OMRJPr7*Qy`EJApbT3O2V-XFb)QJQ z>}9`(xb~hudiCX#%QKGaIt3||PW&MwJu)UdsWUZizI4+E?tA&=lP7%Ei$4ksRwX5; zOHmSPr21nIecLaF-3Nlj1Rs2_b(oO%P;)O zufO;?&!~cG43o%mu0&3c^us`Y>0ke*wA~%|KDoG9LR2Ml`gC_+!*k8K_O4r*M9Q2p zcE0+RJD+mx>h-I~gF>RWUP@Gm!eqHVV?XkD{^0k4hu`c zqiQuQXBd2oZ4IO+rMc+;i3@AdH2-PbiMln_yA znm2$>4Ff66cFAnY^=V;~!vNd-TDFb$=;lfntlHDm^NqqM*fy@X0I@VZy6Qy5XM_ zyyNN5oRvTP6aPg;oDR5KZ`#&~HB&3r4|~#`|K%5ds~&#K!*74n>E*MbQW-#;$C|MU zX=4$ZEQV33b#n9RZR6}culbF;pZ1hLeECa(jL6f|z3xvJld2jhc?|k1Q?|sv2 zZhgu}#GFv;U}{8BwO@(V2S=oAM%V;$;~BIcRTgOb_>CmCu^J7apf4W@FCeFf_5IlSIXfYu7K17deB3B8OQq9TiobcpswK zBofhr0#vhOw2)r1AR<%|Q5%+3kyD6hoeQ8gr~(RNt3&nvISZMADpAQQ8&*JM&ioMT zDI>kHvJ?Wfx<}-3Jpu)4X0%`-A|PO7B9*eyGpic()?N6E<2tjT-ND27FETji0R{Sdst-H zKvkRJbf}sX88K(2Kt00Udk9Dhhh^TlUly}K3bW;Y0rGIT0MHj#Rn5%s5Kx3OoQ@<^ z#H&oGV?aR220s=(#u^o!)Ry9+dZQMQLg~m=p%LF1V7XU1Dpgd5MwO|JF;Zx%qBe#p z#MGp8&QKdCr)Q^^F6+rMtAY|;rDu^4D`g>aJskbGUR=MX=>`lNJqwM}q7`22 zaRoWU1?r&cvf)oz+7XpZW`P+o+fr93AyWteRa%18zso4NX9Wl$In**M(?O|{E$6s} z+50$KTX^C|30xKv%7;b(g@}yaGyMIP6qr~>o|Xn*zS>4d2D6rL!IWr(Uru%t3GQ%qH9YLqJZkgBhS zSydOftRr~sDOkg|nBg!WD_Sa7G=i7~pW#uUoLoLTxpdQRe@0V}2K#pX&$UXqE&DU) zI*-R|S1%rWWIexXZ~@gs)x5&YXcko-kv_Aii;bb8+80x!sz?LByrXn1RUOMv6&s^6 zNKxy)FcU~1D*Li5Dp{c-{oHe8Mj|t!#unNhsP{{V9laNgB0T!y*d9B&7FOWzkYnyKsksc+A>fT~!N5Ktq0I9ek=LQAH zzCD&?Ljer^Pj2s7^nIe!tZaE!MWMv3^Igi$+kmPY$${u~E7-7sM$+phzRsTYSD)d! zH!UI+DPp4N6b(^@(pD*zX4S^!1{zjfOvxV7_Cq5@aD%Z;Lqk`YQGAs#@wXi6CehbLeH|TK?#R z4?ODYVBUQB?CwwatdIPR&&}}T48-~Q6tl z=tGaa_FeZscD|ktEONR(8IY2cIIfGCmyOX)Qth$2=wZn5m6*FoYb5_jV+AQ!j1^(aAXv_9F7u>$S_gIWZihA zcpEubHT!@=&jHCSKs@c|Li5-c5>zH{NmbJ&JdB)Q&6HBaqxP|y|>TnSMR?2 zX%D{nrMoA5*sb?IWj)TI&eg4HonQe9IoY33@`3lgCmwkBmAmeG^nLFr$2>l|=)NDE z$&%8XZW?8~Z~A*LLHKQVKlM>RS6jSXh3P5E>Qbd-R3e~M8*fGm?_Mv0`h01!-8 z&Qz2Bp9~aWCM;yaMV6!sB$7-Ac>C>lLG1~*-mZDDZCf9hX+*GvBP)9<xG7m6P#Hzxtb>`KLbRJ#RXH($ha;#Ytqw zIwLX@vO(EZ_bR)SIQO@`{8xbUKYHi^pe|NFHJy=BIb?K1@E!L*OstnK-<**!Ye?B~ zrj^o^8bmvQ5D=9dYU{gKvNN_x!V;{Kjwi-)G3sq;OWxIU}&E_57AAC)bbH zp7xYyz4z6>xVz<Zp4rj;n4u&0cKM-)uK(=6`IqCKXVpCDy2he0`wWrFN@?sLSPIKZge0t^czOBk z7I1v+H+=I?{_ywj2D36bv?7x>D4rJ=`SBn55$}5EJD>5S=e+9;zk21a=iPG8opV{| zTyv91m`I(TU6P6i-t+G3_rLy*Cq3`}x4a5~ix_K#YcYvtA0Y70zW+yo*qtuxbfvWR zE~2&%OOe_EaiXdiKmg3*zBA*!kqQTgbeJ(Jq0I;O!c5OxP1R>jpS#nu@;G1D-JLJ^ z=CA&WuluquJ~=zNI3AW|Bmxea&;-+O-H)&O#&7&t>QtrEelYQ@(6>HBGQZMfEps>I2Bcd&lp4J8oEe&3%Ljw5=x>ZndBxU>ZCZ> zjsH}Ugy_(WgfJ>iG`37xD|NMs%5wK2hp3cqJ{^(fm+q<2T8d0jW>hLwHM~f8g5jjd z*e`ok8>*aZtUg85D~#EP{`KM_XC!hAZLEt&j?8WjN5!UY5+WD@G`Tc=h-D?@o%dwTxxDi&&>!eZzD#PE)gV`W&VJ zP^2Job~R8`BK!i`Yo}$uU$k$uU1kk6$>|uX))9t6cxL(GB6Et`Vu}(<1%tB0jA5Gn z5s4W4vGwFDlzN=UVHSj{rU!3~Yml4#p~2cv>DHBkqKoIW=Jg7TYD!d&q3+RGCB%pP zH^nRtZ5p!LlDTH12J*&rr&?7MnK{OAcTggxiU1l}%A#AXArprgs}C zH$d%1Z{K3!l|2cyWn`q1YlcUlU}LO4hb>iE;8=#Kt*ehA>x};CHVmOssLZHBIb%=~ zpvYV&fngTFX0;L)hng|GIp!jYgfoXoM0RC!olcPs@l9WuWnyKvTNYgmrCw3Xt^Rqf(ssaZs%gQLk#Jya+W&2^d>ySyfb zOkaa4qR1>nbO>Xyah%hJ4(kP8EiDD}6w{LCBvVu)V?94CJF~&?6k95@l)8-z*ok&& zX)PrqWKdUea-MT7J`DxXb3T>i_8kamIol=Emkx2dDQj`3aen%_xg&6MJ!P~x#xM?S7xK- zb!?-VOFsRJ-IAl?0^)36xByiX|O^_WA%hLrg@_XV;2^Y!kZeIMFPuqI95>0MVt> zhTq9n1!O0~L^!8srAY^tQz(s>2D;9rk)di;p(PD}VSl%(;Xa5cqQo>jRat?O26DHC zQ0Dah(TVh@j9W#JR^ehj;L1QLSdvjPKt=?_bWqkg*Q@V--^YH__kY4?e(tN@^fuek z4p)`JagsSbQ&M!lNCt&515AN*M3_2quDwm7*jno_Ws=oUxw=@_ov1D1N9V9(iB>RH zgXXY^C|Zgdg?ZSgFZ9Q_=(5Z-=l?GL>2*xp<;X2!A7l=iZUn1ZddDd_=TR`cJ*K{e9qH;{U`p(>wf&(uYANu)q1R% z19`!cVM{qn9NHf)f+eW(ZeO-SuPRL};nkgTVSi{dqY4o*tdk%)hE-v%Q>+sdU6C!& zhKfhzcF`h1k5r*Rl37_jQ7xeQ^V{jaUQiU!I4w%YPn3=NZUG?UMxwO?3bsf@Q3Qp# z&ShBkHVh(ULL(i7vLd5uT)A@P{@4G`(?0wo-};8%%{a~}6lFzU(`VEI9QS!9Ck1@% zH-GC7{NwKg&h(C_?=N3I+3hG)vo&VH>Np>L?|r!b9_Xe2`+L9lTfgqhE#l~hA!p8G z1S>-T7AF1Vlt$UGcP~k$#S>~%eC7dLakJ@?I4slf+&p#^^{@jdc6Mb z*BpIan5$3O@VA`nJh`-gDgJM`R6(vJUcyo z?kD`I*T4J~cfR07e$lt7Drf;iVpd7gl&fo6V&>V|+56x8`%8gm*%yEH-~7oR`d4>8|C5dvN0kcqMG&1$O^Ft9k7jt4 z=s=ZM$a1#6_dVAh`J?me7bmC7^^3#FVv(6sI536+F)!wFvM=x(|IfewPhav6fdei* z_4Ka0PnJ{LFXf@+VZ9)ihaY%19)3Uau|NBTU-sXA`bU7dt{F(vfpraC3Uh$#EIXAY zcbD$I^Wve4Cw#=mAR}2U%sz}DQK*0ll4Vc`rl%RR7>+RPb*$H~KKAz4Tw5PIGdUhp zg=Gq_s>x7DrP^-f5%yQU_^W>I-~E((@XDR1x8A-#y@F+NL|%X7>U-XWiwA-6*Z#)e z`qA(Gb^y7xaF1i0W*&&$nyXNUs*am5ZocQkpMCvsA-zcB)=Z7aF-Ald0@U;{Gt{v# zvY@3O{G(rc*9RVa(i3ib?6JppyPYYL@Oj+tPQ!G+T)K4k^X1ZMtQW#G?n6q(h=e6} z`?Ck$^1Gk>ai91rzw)0wWN8NUI&$W}wcii)|>+2-sL~D(;56Tf` z!V<{@rD8&?vcyEvFK8ok43h`m@LQku>3{yEzw|Q~(=~%THy6y+WR_CYx zxi9%&|MMpid%gW>Pq^ov{ps1nJiT)3@lc0HAARWUugk~p-|x=8_s4$xuYbXx2iJ_E z>@s4`qcNao$BV1`OJ}cp+k0R5%%`6|{bNpcr!EGc+CE+goRA0>i^?LE@MFrAD_7qA zd%yVkU-o4`^CLfa?fm*)7XXloDg|v>p7qh6`p(z>=F#qe2P(-~%_1nLSQTN)%syoU z*vg`fHbVl5AauwRp8k}lJ?Y};5mQ;~dXR_|6;0MqQTJ6$Jp$ygCBi)#R+|9E*p)}J z%}|OA2aL!>cJ8r6Xjy*4WJ#o(jz~Av>a}H|RqCt^z#vuhie~JQeW^svzBx#w z4;w%gO18O%W=0dgQRs90hf?zyPSL*cbZ{*Z+T_D76sh=h*+2*&I5Vupd>Mis3<>)n zL}hLMQ?KX|1Sz7dEx#)iblQ5W3U~f0!XuGYsvLH*?5K+uN!sQfQ3nM04kqQOSb$?@y9B z#0se*9yxto#y(|61+j&CtG08+QATA7Zl$}Cms*$e~L|UsCrJ*F;`a` zf~3+jYwHT39hWmgt7KW`@n~b@27w{Th#00pRFpI;p*x>s%q+#QT~2SELMBvc!sEq3 zL~L1fx98Yrai$|;0Hs0NZyv3NRB6;x%B;Xan-2Aix*SS8s4MnFU}(?p6jV_Uu180GDFp=kBBEs#U)1|i`_ zC5a65&%d8M9ggp|p+rSHe*{I5%2I2Qr_6PV7?2&ghz#2;)tKr+Ple`sTz31_dygn4 z;yH^%70>Q{E}FL6S?$V9h)HFks&i%O&K6E|>8vxWl&rM2bY-<-$;^@n?+0ZGHLJCx ziE0{0wOFp7e?+p2AuZ|xh_4=LL{mNx`%5*gByK?n`$6+U$t=q)qo zCub-o>gZgx5*J(WFSKcG=H!sd^i3$RjBk7ZB%Q&jQWqQJq&9cwnztk zs>yAedc7ygEh&i9p{R`HRv^n#MYOS{{p%>D%$OpI7EVMb8)Azsqw6*Z4>eXo#nzmx zQWchB`|H*+wx2Z0#U;S`; zvda`tSFHjSy2i|?G4{!(Z3QVw?QccLm=70+v(vN4P?2JVyV+Qe$984!lru_gS?7Um zdG|!ju{)U=5uphk8YL2Li^hx)2#14Jv13))lb`ir_x;At{rb0m+09RSN{!u`hQ4vB zWD!xz5Ras?I-<3qq>xBNb*)=evr1JwvORUE*k){`s)hHKwK4Oof@sAG6)7bfPE#9N z#>A4Fq<}_+cup2cs@aB^%J;Ubu92hQh^q{F-n0 zmY@2Oe?9@pOb&2CUWX8gTb}UbZ~Er1`#XR0Yd8i&)-}jT`pCs4=8QAl9n(+F#-a3N zcQa78KK;4jvB_#S5YHBp%q(yVS@tHZd6a49him?x*R8n%d47F09l{8)tP6r@Z(Tzw+}}uU}iVQw1P3!cQ+>{{2_|!5_Zvt#?29 zUYQ3FUWhdzNf9kg$sQa#Mdl2I_1rKl$|L9Tu}Vz#qNx!(RB@KYGP)UtE1mcPDI^9B}l!eCh1@ANT36d*v(ddG5zt zzkZPFxJ!$rB#WvNH47Ff0W4$L?;m*GZ~mQs^h4kI&0l`~(Z`pwp(zo$B5brCqY2h_ zalC%hm0Mo(_IJME8PB-=IiH&AnpHiq%%lLS^q%zedp3|rC9;Y(kTo;M(hgo}k5fi2 zsvh3J!3v=b2`9%QDx4m{wruSW!EJ z80VC4{l8xF1KzWa`&B2|M&m#CqL;EK90p)*N95NL<$8%W1W}x zCjfMJnOB~C$K7|$c`S^|*|}Wp_6Py7OmFliizS#9$g$Ji1Mm9%JD+gx``_^z_2 z`^6T*N<1^E8ONNyzj7)mN1tE+x4!L1fAk0A{Mg6vYyn_JA@?Vzf9@}Q;lKES|KDv_ zu2k^)VUA(aH*a`R)vc_e)|1`tYrgqAe&Bn){Rz+hw1`<$l~k&)$E`nJ)mQQs)x{=r zk)oo)bE?^*m)`%zmw&;ReDS~g(SJH4O~WTq4ns{s#b+?FKiQ$`kohnE*$;o$OJ4HG z!yg2Xs1x7K1XUAw=ncQ|t_L4{(rvdr^2oJIr$(00&gVQm zHHn2Mmo7c|qxYx#gI`tHo?0RqZEjPN#qr4Nf9+L&^p@v;_*2&PP@$v_ofUovVb#f{ z)8Bm6AAaf|`=}>8{g3-zJ=RlXBw^NXg|5~R%?(b41(E?_k$S9D!NB~$8-MTL{MTRn ztDo~HuRnI}?9#p}y%pjC7&A&mh8l=Jddu7X@)v&DYhU&2{nurB0f2$H`SvG%<2Qff zw|>*tfl0`K+ydSjgJGSeD*h zqcqj>gsQNu4%s;WKBuWjRYj&LGgD<$&l^xA8%|M3p+=>EKoHgwi^!@<)6xIouC-<) zv?6jhmV#7zFbzsD%6qe08LASM>9wcEMMI}TfefH?b zD~wCRGi%r&nW&5g4gx)6U`0mLl*vjj4l!``qyk`i$mskW6G5`WXtm)@rCTf@3TbMH zNVF-$9iK)FNy4yPr6HMa*JZ(bE3H0FYCqBLFw%#M1+~Sv0Sp} zDWDXYwKjc6vzTgjx-7O=h0lN}GgzRo)jFgN#hgcr)!nB%d&GcDs0}4MMk1A2l_XUq zlbN#;YL?+qwT#hr@v0chzQVKmON3s-P)cBJ2U$hm1+vfl8#RItb?d z14|c5<&FAOB_&zXuqRVSRYs}xy(G|V0fBbhWbBY$TZCKtDcJFhmmybY12(2Wm>&mDtQBok7$j%W6HQW5db|q#e+ZfhqAfRvqqX~8% z;09DCH`+wE$1Ad(=`4-PL7Cb7Fbdf2l8&@_rLuZ6098~JXkx_nq>XZEU|#!)K%i74 z+k*vR1F*oY14hXxRVg^3P1MN@l?^zDEqImK7Nfz^s)YDM_vNlkBTPqDB5z#xhA`>jD%$U*CVuyd zjGgI1iC8Bo*}=#ni1aYE?0QsJ&l;$DqXickZG#tT-`E=)#;(R>gXXI?j0XxSP&Im> zGF6xmB0GE*oAw***|bVa)I5Wf42N1DJ#nLqmRUXKQ)PE9wV07KsR%L$@z{eO$V(so z6+ikjA9yexe(d2Z3o_@Vks{%X*$kF=r3_^yk3M(9G6TsOId&t%GjrLEi;Lsl%(IrA z`RuIrMxWUp7OE_m>WnF+2>@-|gosMHhy-u_?W3z4N9^QOv#N;2A=G8(|txZnlbuE7yTP@)m>)M5FJ+0 zF%K&i5=6vq>@sH9^7xuhzWvVq`8$8&8^3U&T)Op=r*@PrH~*|Ks|4(2JU}FsTWW{3 zjcifdR8v?PD(c|^h*%<(>J{8FeIV)Ks@o0Lbm;>jwq8n5gl(xu^&2WHOw21Q+iwlg z8)8W5uOyVx+PgmaHSwgkH+_g{#BQhJvZ8U3J$cV8WZBMgy2vI|7f6q?`UOdq$ ztT~(w+7ne)LmNbZ1RObJe>`6E_q_g)7X+>!SA&QoiHqaBd~)`|N3Y&_+s$`>nO)R<9~gqA=en?ji+9K3w# z%KKmc`yc%&AOEsn`NhNat9xtsx3pSD#!y>6L_=mHQqW=0Mv`nL!EHQ^EnE1Ze=`aL zoW#Oqx%(q8U%s{KLQ1^?vNPeC~7p=+!SfUb~9j>8J+n z@tAq((%JJ~^e5itee|K@{jYxbQNQJ~ z9x-|0MHfh#W|k2_i16b2;ij8ze&c=b`p9QK?XKs4#yp&Rm2`tZ*qE}66iP6)B&rgr zjT(`G;?S0|W_W1Yy$YP|MjR@b?8kF8HbchT(a6EE<>A^Su&c}Z2i+}HB zzkKwABt$IW61`NnS)PcK-5G$yJU`^`zTyww@P;=&@Zf`|`%5?7eB~2g{PE9!)-#}C z(A8H21}ma`KthvPgtKy|_P>AqxBmDK{llA|@oA#rhl395G9js1Kt&0p1R`0hltI`p zwo1B;{a!x!nqU6HFZrsU`q%%0RdEp|PO*ZB%8Y|S*I11lW+gjGJQni}uY2P=-u|}t zKls5*moD9N=RKeNu`jxEWtSq7I38Cjb3Jky%}#?2uzLS}db0cR|M2r)_W6JQ(o;Wr zoZWwxGXyp!7*wc{h`Mmef0XZXWae7(~}_rpfcb-kwq4?0paD@CG?Bka`xzX-F|7& zC%xeE+2sRdU^1mDM@L+RO3A892(w4HLd%*%Bq+js;Pt=t-VZ!_&mC8;J^uJ|vTwWW zMdYQkOGxPcY~1sL%eP$e^+HMn>OKW9(K1x!82iT`dT2iQ_Vwc7bU(!0g@o!_z9XmB zz6#^ybN=#|{rrFa={r8^GcK+^E=+@=k01z1rc{;~P|VC!5s*G}49n`(nmzj92j>Ug z^6+C1-Ew8Qe*N5R*_paKQ!uK)sLJw17Bwpri|>5@!!LW~@4WG~Z&;R-kNd=r|HMD` zF(YWSxf{RrkAZ{J;Lu_kP#kz4GkOIPHpjrU=W6(&=d_De01j zGCevWfBEdvyI%RrU-ac)@o#?k`wxf15VCLYDUdAaP=-im?@76>%(s(Q|GEC3|EISY zg}(fwUmv_vzBz0Nc$~)}BQhE<0nr(Gx<4sW%rY{?D3#G&m@0vhr1 z0koK9vC?lKT&hZnP+=C@)NuomK_qlox@VS{ipX4DSf+OT|5Nqn@w%tiRUf$4-p})U z-*fM+xm22}Bw3#1L6$KXV`I!bx`BkIV*>PtPJj>^LWe-W5bRHwY0}W4p`k-F27(DD zU=k7LX&AIYc$1R7KI}$cT`( zc6rRPBByn)Q?+Aj_*P0btsiK5QAT_1t1`&Z=dxj*&@f+(WHL*YVAHxbi=8yeRRB63 z*o46Cw9V54G=0CBYcg+GN0S+Qm?c!1>l*6{*l=S7In3?udYwKkUbu7dPRybaSV%S`NN5%jcY6?fuh`p zXGTJU!yJ)KY!PUJY1yYb~K!8Lp}f zjb@g$8+5q9J$8uOHc)D=)3mX#nA6wVo0%(!9GSaWQ$B`>BSy=kLFb(w$!na$?9 z>HvorttXf|#Bidqb1)!GRA&|2pJ#TouaK>iH3^TP=o82F*i>dJ;Rod>&6pCihkRyr zh&B2TBUq407~Vg9cW=~Vq1!QuIV!3Y5?L^_%5*mwQBVR-8c0_bs=5(LEjYnpRCTZO zA)v6i?kp!$)$e=*U@jKAREZ6wPLn0?jdV@)JpfE)M_8jJp#ES%`SGC{kS<7aDBOFT z?kW`>uT+kf0T0lI)Rbj|xlNf2Ow^!N2gjS@PBCT8$F?SkIT@wxw)o9| z9l!Bs{q8^U+CRhMW4C3n6>)aIrbg{o8^dhhV@#WK2%?R#G43uBsx*zc;&k(1IP>lf zVj@3f*QCs7X=ExD1sUi*rXwQ9c3S&2_RE|@<_@hr+>r$nMmt-^ER`>jRA_FlSW-pi zoP+c^EGtbS03R8PfE z&`Sz9npcWEE~2WOEG)`2^=6QGbN~OY#isXSkX0qMw3ZW z-;xDpCWWV;dGqCs{WIS2@(=#dCti5&{N%ca(zO{Bs0x`+o=no~j~|aQ9-L0k-E2SN zeV_Bg-}gDa@q`am1uZVS=|a%P6qGA{>)R!i`-5km0`Sv+-Y@;OfACE&eA<`pv6poQ z2*a(is})iGa%`_9+I6_xyf78lnj{pG1OqH-jwm-Kn@FYv&}D8aE9NMx=EI{7vRRgo zEi<~prK)u;xH)M~Muw_4uJ<*lZ7VQV9*dbCX1yJr))+dW+r5AdbzvnOG9mkei9PP_ zuA%;5y92Ud?%njKLb=Qi^m13QOS(V6abR87qoc%U?WPQ8l)KO29ydk`04bccvEQl6qEhcPJ-?++KL)i@)xV|Dkuj%_VM?B>vNy=dDqu|$TrhaS6u+B^DinHNy{wb zfDm~BH&!P6P49TehhP2pi_g9C`t=7NJbV=U?JiKTF@RuDj)9Sxigg+Ofb-?IJoi;! z`IYuFetImK(?+K3?(*csIk(NSVVF^x$(o39b0Y9R{jIv`R?)!B`HzoAR+2n;}qe!}+wU;HmyCge& zm05#+y*_#7*@v?m#0(DVCDWqYCRb1U^WnIFp zqV;7~JxEZcrSbtrEhiO4lE#STW0F+!XN;*bGxea4t|=-Q+{v=aq>N*LFeJf5=IZrr zv1s0IHC7~Sn`YPs%nKzUD(5^=X{O43U9SXC3vf4wfIb0<{I?M@;M2SUY^KmlE_+NMu5Y;&}Vvq%18=X z80ZAT%$0JS<_2g91Z@oZ_VC<7;X&dZrJw}OIVCVIm9?(>ihWF zN|-8H6>ft7j3@JzJyv)9Gb9Zgi73h3OBJewrb4i+JYJ4dh+fYjtH9ztJ`xo$KY~%P zuDkLvT8$ru1P)0NffPEUpp<#*={|-8K#dcEzf$pq~q&bXh?ZYR~1`MpVZ{x&Tp`11{8lPZrxLl~g(P@nH*;RW*98qv+Wx5}L>tU7^`^wGjn#mSMZcdNR4=x>q$biFPWlf3q-s#yO zVy)|K?006UVnJqxklX~tT1KOF{WVG|6oc*p8JPt!ORP}chgO!2M&w|dvv-=!ElFyO zVN!s(hq*$DjjID(#A!(^y4CQR%*6cvj*dF$m;oY>}BNBk0&;-^RJRTUS!$7^5Y> zs6dzKR5cWMx>qxT`6-%8nwgoqQCYiU;3Ub1MJzLO4mD3fGpgX3%eW~q_3>buXU4s|CB+2Gg;LpLcnMd z`Kj7G5HM8pemj|0?Qro1bR8wT*^w(4k3M+`s5G-wGeKdrhQC8)hGF9XbNsvO6cR4Pf)&awOCqoE8q$`n*RdI=f%{u@#x77Qe^bJ)>#`>*Eck7w`<`DC5;d$Z$TrXAarBicHr*i!;1hp z-J8^nR8<;TS=D@eNRDBqVSxmTBpsGHIAN#G5Iy^jcYNTR|I*+5BfsZ!KI4V(?a3M- zHYl<%JjS@Ot`ss-gSH|KxLg)!&f3N%Af(E;yIkam!n6&QscbKHuGLGe)9F0iorv5o zm%EgdZN;=G=Bj-!HUyV6clsudT&qe+iwaoA3Xx{RV7Uarm_}umZ&NFd3p$88%ygn8 z%RPqAs#GnraiW<+nUF#eDN$w`oQX15WR&Vqy$vGwSftT>n1gZ2-6f-J+hT5?v}Yc@ z_`+wr?ZKbh z#eVJSM;S2eYtcBzq=Ph4QFT1qfRdc_UQq%^8{)x~?|_p`aB9%+_VwILFUy~L@lDTu z@^L*p-8>j0b5}oQ%~j=vOq|Z!X=Cj1`0kB2UjO9d*Iv7Q57&eEKo>|IpZ}t*d z>2zkSkPrz2S=Kzr)*Icd_ZXNa>wv9@(FeQ|tnr8vGCDWeimzEW+eoO&N`iDVx8crY z_l5$9>>7yCZ5a@x$|%r8(X;vb1@DfpS#-eMkzL6LAM<9~&F0&%ZSx1G^VxmdwwvvA z-fp(@>AcOG({`GtZL^d6@Oj$i@a=ROCqK>Yw9V0w%TNlXG}&hEXoqQn#$Lc2@{KW5 zpb{#B8)@ZUC`w^0xQwGSx-{>G7lDK7++OZ(pFDo@`1RKxzrF{tnWCx`A+iRsSy7kMjiur}pYeH`FFf<6 z7c#D`VipI;j6@M(DnDGk1s_LYiUUfxYq-UFVoyKXUiq@$_1k{)ul=pRb8aVX8<|>y z0&}!c0-1B(JUDNvdgICKj~~B&`{eO!uYK~9pLq4P+s98{eeJTISjo*i3hQVjQshjn zxQx@B^TA*H#=rgZf9}8KFTd}_x4o^dZ&VcnfSd%I?oD)iE+Atu4;K(^nA;dSx>Xdw z<;mk`KI1d5D?j}m?@3~uZrpeGHYC=;PmxW^<`grpdH49qlgDpdUc0?Kxl`<_8g6Yu zi4A*dPU_ zu&Pk%Y@w{2=4CqQ@7=cQE@4S~nWMA>#L5h1iL!^o*Lr;OX+P|@{<{C*n^d55u4SQ(sqiAF=(qJ$PVXe|RUKba%FYVQ3Y=xt*ex&tZ0g%54q^m)GC? zdG9HYm)`Q8eZQM?dJ1k0XiCD$Y`_QMK33gbZl64Uyq?@We*N)nUSGd^{qF8Iu9p+7 zEVu$X5T2-Tl?epD{X0MSl|Syw#tWbG=((rv;trU7hU%8qZmDnWrg<_1STc~nLLm!< zgaj`^hJZvz)Sa6X;JoWr&`&Zli`ww+GfoZH#X!?)2-w{bp?(-_nJwE0FmZEgeS z^9ej<1b}M~@TpF(8PTX$$$B5AI8L5smhF}hyql=phFMp9c15-BIRaJ3dX{DqD{A;K z8`F-2W&v3tnRB?G2wbmM_SDw^eU%8K+<;*umB^K?S7${JFH#X0qO*$>X;TI7bHdzC zbKAy)6Xk6V7C3!CVVT#vySVNqInrn+_v}MOe=5hE0`EFp;Xu1oxY1}8X~u|vnUBs@ zxJ@rqi=mMPu_{Wr;u@){q>-`|sv>)J%yW6|F%9!5UM;PIB)#}kZDghcLXI=}? zY#1}?V5sP0x*=0l8As2hcWqr&$0P{CN59jI4nqYZj^%paY`u)3TFvSGKV!cdtWn2f zZ0=S~s_b6zYSG#h*(Yco9&@zgepRL-SKk5hV@K9K;zN)*2|=kS_Te8;W*^B{M4=I= zec$+gy=2OU0m_VRoO(#4d3$+upvsY%?PqUJ&=D7FKS;-a3N)zM@3BWD&FG#1m?-8- z2$y})Fh~^6)4iWpsB5eh=|0lu`SjrY;Ni`~XHTb_=#`7H%+&VV8fJ4djtb=U^2Qr? zZ#<66-RQ$8?L0RJ=jJVswlTu#T{1~v%&{VR7bwW-jq7ZM!rjKUsjBJPnaz$c7>tgR zvZ7cJoo3@u`YKya?Q&BSDgsndDIEeBEh0$SFdL&&LXD=$SQX{&BBMf)ghejgx8!CO z%?nb%-F=SDdpRwT)eBN(~I-qfukRC0Q+t$JU}E*31r9_GWzF-DKU)f5FI zD%G@j+89%ik*O}a@_>wH^f|Ul?fYJlghytZ#6erBu0|=e-K?En1^~kxY^B5qI9Qd{ zUQboGEp&vezt&bgacT_e<* z*8PQ2_a%@zdVY$=BdKiPQy1H{f6f5`+lcF?0W~1#x|XPS$8zuoNwq3 z!Uv5YycZ6!LbS%}yUaNNN);Kg76^JvdKS{~iilFoaq7Y;GiD`J@F{7IQAnpzSkWdp z$T{4t+x3JhUDws&fWhSS{Tf;2Gy~@8wC{Trl**z&%d44I>5bS<=Letv@|*v{Z~wnt zzWx9A)Vn_Y4imC_`nyyTk_Ds8EUVm(%}ldqoMugKhu9Yl)P`OG?00Zyl&odIY9kxH z$$02`Lw4MYwC*A%`emVVrNyQz%sS zY9I8Cu3QO;R^Udir&Zmdw(|p4ibS`MPxx~^i2N?28?l(_8EY%nPxPR-<{Lw%7 z)XSf5$l84=QTj@sVzo?rU!|DUf{ z%=3dnijUH25jYF~F0 z;nV5cc{`m>+vz;E?R-AZ)6LCk4wHyEoe;O10!kUS&gX~5`RSkjqo2I~(Kmm_7d`pJ zYgsXntW=id!%fy*y6qB3SXIi|pi!eqv{lOTeP7Q$x_S8aFZ{i~`D=gKulZV1=hIn! zR6b*Hy1O~J+y~8W#<)43&gX}xo0~^ZKYHrMADka-cH%^@WX71yHdnEHoNvx>{*gcV zbwBMV|G4q+EziIBme?<>a-by2qS&mnP)c>Q$f1zzJWfl~0*?Jt(S+f=?(2om{t-X) zq3`~J_x%_FHphZB)2nkoy`T2C-&gbnk=;lO4xEskaJ-yo;76RwfrofN< zabNWZ_Wi(W3LSe;15Ai)He#urdqeC)OH|Xo+&BeB?GaQ-Ne-ARk$x0) zrIi&DWR>-%6O;`%Cuk`|5`tJpGn8UJKt&KF7+& zpO4bM$`z2AjXB14dT{3Xv^}~xjq%|8X!v>C&h&{Q%rckJ_7zPc!JPm2AAH*veEw(8 z=iYturZ-=&PrO@J4-$TLYWDu1-;FFsO$Ui=usHz9L}gjiZE0|)S%ODP>~WF%$8;YX2h>f;VsFu+EUpe z3837kyD74V0;r)w0xKhWI_(@Bqyym6wQ|6m1Coznv?fkCSecdTtHsR6m{Ci>oSsot zdEjy>nJcT(N>=1JKd|kF^8{M128D8%c^AW7_jP+avxl$lJ;xpi7>slCd-NwDMCDp( z)NGt8*yr0ZCqHG$fc8ufiX>s?qKtI+ZWA6IcYs`q6$0jVvL;EpvnV1|P+zPxx9Z$b zD69I`V~IksGEyj+t+lG)H1vuRSy?DmDk6bWbV_4T$hAj_GB>BVu6wUtRtX$^PtY{neT*jeRAzL^MJiFltOQWz-f(M} zwlOm@s$@oER5gp|7*v2lb%3s_QYjXjB2$O5S#@Y^)}T$uI;3VSCCJUqeJjKsF?KAZ;Sv;n1v^Z6txSCRd4@4*_W9HTX-W*ny5xa?S-}fs@NHopF#{h@Zva+O%sN+!CSzB5M;kF6YzOJZ7 zX_~o3?gkEbpQ9wAN~+8vVg+!h0cg3{Y}@9TvyCzd6J$Q*tkN7Ob@e&P9`&0ulvS)b zCs_t`?NVk|))?k=_t_`Zqcfl*8F}D;b!g44I(o}DUP_8IhmUq=G=-h*_vk@Ql+nEV zo6345w!`37tjz3nKvWqCx1Lk%zE!;Eyp^S1PU;{rBU3HxH9`l~!?v6E>eafZy*kcx z;9OP9=OHoSKm<@J8cRwgj#sd3comyUH+&2?O6_A2%D`cy8C}-E?m7S$=7Su7Bt=9u zAE(h~_ccQXz;VbnZF*96$ELC*xDkhp)%%kua`@-~n$z1=(a;T{vf5QG9R0lqHiyFj ztV|ft?$@H-_qrWEWD>B*vSCtnN}k55WG}JHl*Q4%wWH(A?ZI_sZ^I=6D^doU2{nex zTH6DGuDS(5VGJwObZ=gu4mG}Gfat6aPkMr;m z5s)$#$t5Vtr_VuiuUZqf%>koVIvEit?inirnbovdA~SoQ*kh?`8*^Io1x8~r4wtXe z8b#iKB|A)SJGN`t!_)cm-t*?K{{z46gWve4pMKlR+s(Y%WKQU=k+sAN(Q@gk>)eL4GECjMjjUNU`Zva`R zKF64lGLuJY6UX;EoUJ7_Z4NSL?|ejLKT$&FmdB80KK-5wZ`G_sxfvCOY{!e=-?&OB zY>$jruTP$R_ZM>9eCEra_M3j&?@69c49>!e6jWSEnVq$G{r!F6o0KL#6f zqLI@;!3sx>k_C0tM8VpGPE&a`|GuyQs8WSSs0l@B`0)|BxrB(MuvQ!848V1DKVbFa z14mptTe@w_SSh`!>KRSkAf%LWLP9M&5umzL!!dfqAxs_jGv9#rR$EWgO?fb*8F~e3 zgoA{$adLeX=-3+tTGBueNtJvNW|WVuhk$$bJAC#Qu|fgB5(qPynTmxhxEIB7TJQ{r zEz?5))T093eNv*bDCK#`Dl_@QTi=C&Fa7c_M_P^3R1FoBmspYMc_2rlW%W!^9VV+r zXi_%Z27Qc@)^%O?t7>OeI}Y4k<^YBd(wpAlQdIP*Q6-Ef6F{XoypDE}Duqn_Nm*wB zl2fY7{?_;Wh-Lff^!&$u@YOlz>A}NmJh2L>SOLoH7$D30p;4$rm7&^!ZzV+-Q*pgs zc1Uwn4K z*Y*7L_V69=`~UvF-}%l@d+#N9EQWlC# zdgZ!Qtk<8s;bTiHz<%z({qug=FaAYOz4eDb|MEL-FLzGKAZ4>B(P)hJg*BZJLR(6E zkJ1*Q<2}i&U}~7pL{+`?p09ZSKl}U7y!h51e8bQ5ZTi~x(A5ce1(I|tHyeP3qF5`n zlKavCBlls(qF*n2+|6;GH`|jp9>4VRXMgiI{lypG^J5LB(>#qqYwwGdG{>w4Z4i+X zsT8vI*8h>DdK=$nwUcjVFdMN#3FdaaR$wR#3{cy~Hy%Hs;XA+m+Yzt6@rjS0Y*s4>f~ne;(x(G+lbMY^ z7|L7#xt7%=^3}U1ul%r|P~-WhpL^4P|G)k-7Eh;}w2E~#4y+Z5US^q*S+znTs2q}% zxiYIQ0W!q86LZ^ce2m}shyT=<{HXWMhoAQR%kP|)(s(q@yzw+V`j`ocXvVfFk1CXQ zLvy%8(dSVkOR*ik@_-J;nMm1Dm(#&gIAtbh86k(Pt?Ip@rLl-pvY32RO#((hYDj3x>YvNRAbm$87oq4aYtoDX5?x%P@|e7DpjDbT-GOc z!i1k$B4e%9r&9w|RY(x?w({WgUoDI`vx#Lds8>&CZUhhl>wu~rWnFNXl!mr zS6DfzRJQ%Wt=sBV2Ol#k_Q)zmB@Td2ne_&OqRlbfN3K2hm_DSc%9O09A(exL9Akn; zRb;eOu=em_bIvLy)YC|*{SSu?vv~%pvN1^lX+CJ^{Z>mdPUMj{q3%ay8VB2QLU*oK zsRT%w^5JuHC`m?X_^1fOy-Z`IdsP|WbHJ?q_ANscBovLAacH%qRjYmmDfVbCwjeaX zmqg`?U7;vXVB9>M+k^9ir{?+GEWk=db!q{THI37^0VwOb?)KZ;Cy(FI@hD67B|pbP zt*VuaRu4~Sn%CY3D=+p|0q&!n&J>Xnies>pYYiVd%rSCftmQ|;Y$HV6%;wkt^XXY3 zf;JS@Plm=nctI!SNFZf|VjW7lg)Q8WZcDXm`q3OrfnblG%l;v*j=3|x)r%q!|ZP*|j zg`z=@>Z+#%&o6IRT=cJ40UbA zDQh~~p+0myB|uvA_-tJ=-H+g|glIjZ8x5)-E&v+pQ&oaUb8m@&v<{#gtqR`6ykjI2 zi4H?SbiXg&BHRbs?nsb*=YwoPLtWLnLX#N5^kuqM4~Z zEIhsv^QJ6z=ulEh)?QgdMXm}IU@9fa#s{hKZYhd|YPnt2PO09+WaDXtgJR#ox^@SS zZDuT>hM5&jfFB>8csQF_Ia!VyKKmAX`27F!pa04a{++-4*`N8DIZwmR^K1|Tu#*>H ztbU{U7((TWD(!2hjO(}>QWO2q?u<1DDyE-bJ|u} zNJ5C@n8U~Hj;(9~G%Bd!Q*99y*1G!eVVv7Z`*J(k9C5kM^Ru7+?sxu;KlFe9-mm|E zo?d#_xOwXO#_M)nLJHnL=y`;GXwCyKW$hMIxfOIg0}R7#jtL{P!-Cy&rM4&$R5s%Z zL^ead2j!|Vc4dcX+U8JXM@LiTW6+1$VX3Qxn@^5Ts?yEIAliwGJr)j7vj|pO(hRXy zTg{L4iucx`F^#U?c^?W83sjZ)ky@pL605u9Q31EH%2O6$cek&<_|Eq{dg~Yd_OJQ1 zZ~gSo{lE|WAjW***=JAlyyt$s-ep9tl9&O5`5ZtECe5s@9a0sDz{>r>!WP9gul z{+i$PdGCDXy5BzcSziVLOdv3A(BQtx1XM;;W(E$+9OoD?G=vm@3s$Ifso;l}Zp;;^ z{d(PFUwdg;tJK<8*JoF=3nAie((7vLi~IkR1)L1_OL{wbja{J`6M_kw4^?G@7`}p?m$>nnU#_f~aCr=( z{N(P9yW88_Cr|EfZy!H-^2X!Gw|7r&Z*Sjte0g$vy}i9$E_c_-BnFYgHs5C{hvaJqC`$qI8h1%nY(D z7|aFHJLTn7`{nlecYX1~!bC*!#HOpzvetqOU@+Ar5@ zgeISP<|*H9{@UOBXU{))%ZGpPBX9bGFZ;;dWAvscD&|a(sPe&@SDErpKyEl4S(qy9)9MR%%^Vl+vSm&1pz+WY|IjJA(J>D z6qz_okgDMp*|y~SVplVH?YTRUrfXcDdEZZX7U=cml{=l{ZAdGySiKK_YUU-;aw*y|QFkGNDA zW%TyIM=YqI?y@r~ee*69wuIAS}0C)c|-fA(i?Z~C;K{bgVJC)c~%%kAym-IKfP>rd|9xO@Eg_U?Lj-LIF+-Q~&Udb!-*-R+O} z>l1YS1~x);61hrRMVK4iz2QS5R862)o9-M`p`z5@abue>+Ns@@$dGkPLNZku+oqc! z)NRo8sZK#DvBViP~{aQXuw2TxXcc16&^kB>rw>eK|aaiec zjpIknF??iRbKm3c;>0kS+1*+xD%0mgOK9!Nax`;@9rfwGl;p$QY#3w}RW!JdF=k{{ zl?{L}#~8CB%)FVskx|tVcof)srOvTNh0~={h9acY63xsBB3Do(f@;1SFln84^YpB(al0YSLe1(FU!3)>H+@9K#V&nM_nA z=NLB+9zOM~&l>_O11d{H2P%BbIjFkazV_tRSGC7*`51GY?B+&h9NkbpdV}Qd#|qy# ze7G6KIp}ltR$b)byYYckKw~&nbIj{?&nThjZ4Yb9Usn3Df`v*n>#wR)ex;<_aGzt0VXD>ykWDcZa!;cvJE@VnZykZMdLyo` zBb1RV*TKL=OLB=??$eDv#~8EQFzP;3;&eBxwYLP}MgY;D=I|9+nf=SBjqP-ra}ovm z7~bH;F`QtiD$C)Le2$(e+nZBat$GoTIZsbL8t13y&7*O?5gF^6RX#?oXzyW9Pyn~Td zpbaB&tSD``6E=M`ovK0R5-3AeMv~0RZcxmEB6_XTmX}_I2sGo?okEk_X+)II>5ehS zep#92=n}o;qgUQ{ub6ki@`0%_^U4BYWaff7!K@}2StW*BRy9Cpm{%RjDqs?TqFE;_ zU@a=Q@?YaVQdEMJeykItP*GgG@g^(g_OgAL_uLG)g0qN$n_Aebl0`X7#9Sa~O9 zdW>mpBuWle6Zns5u>W+*N+Hn9XzGroVOlG?I1I#!?k4k&oVXpy6gL)u%r+ck(L^DQ zu0x|?TX?Hv*0XWBdv*zRGpQU^{TV=2?xQN%c-n%a(e#2yx#vhrTfTZ4MO;RTvzhXexeZy@rp>Y>%3eZU;V{M5EfI^f7zp z4yAYKCXcsJN#g+5>-a;_D&87nM#LCfW%8(}pukc&`sVR${Gr*bT9DFdbq02DCr(?g zkAC#_@#Sa!?yrCGhyCd9d;j;2+-;kcWrHNDR)m~tmqa7BHhQR$HRfajWn!fJlvQR` zv{>Gg0m%RP{R+qJtM;>q+l(Cxj zYo5A3I-TG7wzvHCum2O@{>Q%N*;n3P{#@9}*Y)Nm?v_X77>(d&0albb;+`YY@s|F- zsW!i5uIaN`l>9R#LwG_t+}hd{U7xm#un6|9tbHxfqsic~Q3(lR>9$mqa3h3+FK z%!fyXo260JvskE;KU?4%-}8@<*Ps4#{@p+NU;Tl%JogkE|FEx>wcqXXav<4HK*ZL{eHOV#Z`@r!{H>`)R2AI%DN%wEc>E-udi3xu@B8xW?WH8JOm>9pD6FE02)OPBB{WVmvugKGe)K!>`0qy z7l*lItUxycgK5ghIUe3U`S|4n??1or{D1f7{=(1r318Z@!^+6DKfc~=KAhYu+&6*N z05|P|`|z7>gP9PYc*d*ApM##3*3^SeI#$>sF~4QaMju3_gsWkp5z7>IC~ zK2=pw=oU~EY3-2KeeM`hS8{UBlg6tb`N00ke|dW5GrsOm{J;JWU-?t!l;G=f&9!h~ z^HA3BYeWXhVMgV{^Mi3dH6i_<{_p?dXZ?)-)AxVipZPQIdhwZeJULy~9ZnO|yhs~U zC2Pl%jgs6gBk5F1M5h5&;xGUeqF|esdbx9ipK{9hhlE)TbPtkfkF z&^aJ8-=2N?`S(0{^E3PYdSb#H5Hj4RGC55d?Ep>0(+{8j;J5tcul?Hp$Jc)CuZGK^ zLjQnJ2COtVCf@y?FZ-Skf9$1qf5!EC>w=@?j-nAOmb)pNUc)8|z>H%mVL(NgS)Mng z^ZNLQzT=xg{KsGY)xYa&|I^bpfy~s3r9$+llH^gh=KuyZw$tPW0@M!uy07^izwdYa z78}nz^U7zBXP(yGZrGOx0Ah1^<}$a;>~Ra$^{?zY62O79vc2lT(@%ZqoBzr${N=yq zPyNB)E#Sz5^#y*!@zEr=hPkjU2w($5%zz}=c1j()mE&(DA``OAT#~Efe9Wt02Q(Y<=bCr+jrnp@8SXLm4J{+i$ zIfFtLt?w`+Skxq&W@V$d%Y$yY7Et%fP>Ajvs-&Tt#l62BXDg>hRHaB{jWM&EA|eSC zatwN)(0wsXy#+vHuu?1tDdx^peC85nRD%XTrUJv z;YJk$3DKJ3Ot>*BjBezrG@5zup#YMfR9D6`6(W~;(l15h>aC9_P>aAbjU z8xgw*2>mm!TqM0G!zON&#+c}UQ$Z{TGd0JQDb{uPtUhIshku-1@J)1(t7O0m4L2!{ zK4p@$T0w&iuSCW=pf^-i50bFyeMvXwC`*JoVjr32tgJzkn^LK@ZRfS;pkydjt{T=y z9XGNsFasnRt!Z$%cDE6gr}JrFA>|kws)IoeQ$`q^!zrJW~T=aY)-nX z6lTg&WS>w3>+#kcnWc8S#V*xwc8XX94mUOXe;oikhgS)bjjdw&usvd)M($aa zfQ{)WnE8sF!&*8ysPwcx=W}>Qs5s4h*md7e=S?ypRoHVm-PzsZy>5gm$C$A$?Y+=Z zZ9yPyjBMa;byCYyiR=bCRmp7#%8WS&aAZVk58p;rq5H3b+qR)p-uI4Yq#4~TB`BpT zI9YC^Tgz!ynd(Yt8k~yEEOS5XVg1Oju7|IKQ9xIhGrG0rWAwQh(cOF^K=;b*ahql> z$B!}ckZx>60XcjCothUR^HC_Ekm7@v->bZz#f_mFa6y$~XBkyScegs4bx?JH%@4B* z2BGG07#lrtkUOfv(40GU?|}KJ>h@Z>TdCYUBdr(9P-L;u#G)Bj$y6j0avsB*vF$>g zDikn_b(8`3gT@&BLW0rkQ{zBECKn+dyy}iW6;&O&?uRk#z#11a%ZCY6m6OrGCz(-j zm<}~h$Hs}{Qz{&Y?m`lM9CXzd$k^||g1dDxtz*gk1C{8otPmh+kTB1RMrUP774D;P zRyq_OxlN&@G>$d}m^a&KwiU>lfBeFaPMBECW_I-b$*6Q# z^`~s4D$!BB>P9N1Y#7aR#Ubc+W1ySCp~~ZgVr@h=x~xAkz<>4jO%rGit`lvt=j~rTVAf$IYuWJ zIcyfCS_CLpizcvPOvu_8NE_xPA{Wez)|xN}kRA2sq4o6fj?Liedl*gIY1n$}l`Ywn za;+Sr{|yG1jZmleY2z?vcXwcy-w9RKMw0{7(O9ozR%Gk?)($kV*one2dc@A-{S8&R zkG;wSnyI^lGaFsZrb4Cwpo;^HEA~l~jf~~ql z#E_&iINgL&*5Q97fJEZ_@ad0y?{~lVvp?%^{oVimlOOw-rQyMusA*eNSY_->WDuJW zY_3H&gE7azX#?$e`(E0Q3FTSO@x61oVX zNSAW$aeDaZ6Ce1_FZle={kwnnfByJ~zTb^LA8co@T<%_c^fQ0nFZf6Q>o-6D_IFV|KZEeJpFH8=|FW6(!cg^00DpLfBb7-{ab(U_x_W=a}B)hyx`0 z9@bsUw2@h`%4>F^vva78%2kqRUe)htv8clguVEXQoiAUZxLc=(6En`W1J#AGY(0 zFTLw?aK6dA>x%F(Dz%wb)g+^#C^Q38RaMiyQcduow^7c`B>EVe8_yHp{jJ~p9pCnk zUwYxWANttGu32}n-)!^Yg9kT{9!%MbZ~MZh-};vA;SCfh&)R7-D>ff1V{TqcZNb}> z^R(T4{1bOS@WJo=zHff+nHS2oxZKJI!EM_vcbC|2-}=_KeBEFAYyaLa`o+(^{8_A} zu9<1ZHd}sDXCcOEv(8?dm01Q()0>z$P87II)T%yBI4jg^`<3r4RZ;-d24_K z90p_r-C~uyfmBbq=Ey2yxTPuL}2541owpBNkYN_NtAWIenbN0|>#;kIVQVHesP`G(zxsO8cG^^BA z7;s}nnqyB9*iKt#+}tf9P~C-SB=7dC!^_OZ*tQdgXC;$~1)By64og*yLhRRM<-WGD zQ7O=!5ov~^RRfHglfjleBvqe@3#iBj`I5M<-Q7DIe$02oFc%e(B@92}v{~5|;DlAB z50A*o>Mo#8of|y%HP4%nNSTdQ*=8T9d<;XaDDy_YHhw$zSnktkka`?+=Zcy>#FiS^ z1v~DuSJyr)GcwAZ=;lxWW+?S$Mbxl?BWNd}3?m^`s&v}6P(j^E4WnnQMy6EO{YL*- zAi-?7XRP64&tBykq%pAXH5^fBqh9Y!4Ms!8sy+gy*&9-gZPUfSa0f-i> zdz4TKvvT+5HX*OI>u$eLDWG8pV|o)}TlX~|RaL5OPD7O#xrTQxv`p3*ZZpf(vBWZ) z5mz_*+`8{flr_$|j~=w@#-dD)Ndv0sn+ElT;Zbrz2b-c)8q-x|l{v2~<`~eCk2#`y zeGd|}(Z_~}^x+ldb0D&e6*ad}2YyQus=^vF(86kW-kUi|a^(Vg*y!GyS}7;SoGSvV zF+59d-U547boNJ(D!UB=3IUPX$L8*LuT?&+j}X13H8%Y;1XpEWY%9WPV{B!X`_+e6 z5llBj$|ftA3LmaWgNukd8UXp|<A?31Ld5B?Cft_TH4$? zrsX~Iz#9MCKdnPGD8f_;QmSEAy+sGC4JIWH-dBgKQ0{gVP^b(hYjk!e&j?e6#^?pU zwJ@QS4+vJ>Ptoh#Y{fvpL9|6jE(tG{(dkuXrp|9QUxAR(DofsXA_oys=tzGvYTEa} zQkf4%$@;9@6ImbYfRs!}n7R*WG_*gW@yDIq!{Hw5#kGm4QfIdN)oElz&|FFtd%tC7 z)fK4Cw1%}~imK`^Dj3`j4TVH^8$%UoZPRN73Ef+Z!=d}BxErbp!$+zVMFZV+s9C*| z0-H6~sA}4MHCP+5=gUe z-A>!-jVF(9=2k_F0)Vut-E5{}j?;>6g5at)T+me!YS6L`yJjMCo`$jmNrIW88@JKk z;zGKg)I({jA<^%rGBZ^ehYYElJ}Q$wO}g&a)9DN-D%I4!>S@^J&A8 znc6dX_94@bv|_;oorYicAj`|RG0JpVvoWr-u1?sRQ_fUGIM7ZErfAZ=Qa5bItVwAO3-leC*YK@U7qaNB;2t=VSlkTR{Sbhi`r9 z(?2&aw=G8wGI|zs%S;1;G;7<(5nPRxbeIoyBTI*}+8UD-mXECxD7*c{hvN1lsO3O$ zbnuJL$_1Rqv+q1T`y5Sx0{vhix93r<+*u`Uk%Q*VloB6NlD@dj{&i`B!gGkH7a%b=afZ4`Fq9f$I3x zzA3N3X?yY0o__whipJm*Ok;oO*1gtAISrzeqFpoZKKcPXc@?;P>P!!Tfb8LX>iP4F zZymOk*05341Zd0VJJ_fU+EHUzWcSij80L#H{pPwqdHn)m_=WF% z+w*UIa5GO2=fm;vhd%lGM?d_rZ~wse{*7<^Ti^IU{KebXJ^};go1cFBE6+T9`n9{q z=EM7{XeOsXdP5e?$xr1BZRm)2^Kc%PKsFMRuwoHp!OUc)3JPTwt4`+u+pP47kA65` z{VwBv^V~as;!pa?KlUrW;&VRdGv4;5H^1ej=d*GeKXQBb{onPWzxj{;(ck{-fBhf- zoxgc~@(CEv&wu9AFT8baBQF;zhmlpK+{Ss&oO4uF@BalIsYx6j-9(ukD_k8-roGp7 znzArRWxzLgbF(F8rqSG%a-L4}a(VoT@BJ6J{17c4zVOOd{lZ`P)-vY!}gdDzWm31 zHOabf3uU-KXR~+#70#dB~x4{7V`XIBH(bHg2{zz5V8y=Ku{F%A^c5 zVXcq9R<)e7D!avDfB*~XabTQ=R#I%UU8zz!f`LZoC`lD=EE)2KWFY-Z-xsB8Lyo%L*vQ>f3sDS1uN-M6{-1j*rq?Ivf z*@gvioF;`MsAYD%`GqKM+ss@zkUw4(=t3>s*Mv)w+`Y@KLp5n7WW{W32rVPVn58J# zF+){Lj^tpMS&)uOv5a0>x=-G;kJ!vgz0uB!Xh0;%iu8Gio*kCn#@H*&OdUOf3UC=s zMPol4#j?fEzdQ~Y^&@dM6Ke4JR%{i)2 z89fV~=UkOM=I^#y(WXtzORnKofhOhp7)u2utClpz*=Juer(~vBk+ZGu*4}3gI$4=j ziM3yp3(RS=8l21;HY!zwxtqBvk%&rn^I_|Am{R9+nRN#5L2q>gd=^SM>d>lcs(zcBZbys*~ zxQ~7zuKh~3KkcydthG-!k$m*F_qL2yU26t2b^uvGroRHX@dlv5ZANbk3v5B}pbwdd zTrr%@*I~o#x|Fa@)raQa4xa91?=;Y{4Uo!h!s;M>nD@p$Glx%7Swbb7pd=n_nf5GI zad>5)1#6D6auJyBD?2+-4&KMjs>Ak1gHb7?>R$fON*lwZLK zAN$%zp)^^bC#&`h2g!DnWjADYKDDr*ZjG#CM#ABwFM)?6DWjSBWw1~g;IM3LW69hP zFZ+=)Q-#Qa`yuHaF~XxvM=FzbdrrT>BID@BGae0P2c#xR5{+K6ql2W+qU@3&bbefo zqNd1+45N{e#qOt)@$u`g=c^z4DgVK*f6FiU&p!J8?|J?9@w1lBDnIROAKNGq6|NzN zV(&d{Yn?u}we}uwSLr;4oNe=Ky2o^{N}8|K&1u|SuIARuEr^jp_!!J)<%N8DyOi6z zvH9q?Rn=O>&4)^|iVQPvft<2J4GtJr#25}0VXHD&q8x5#)tb_f-O+=1>7_THAD+JP*Zr&yz5ky-eB0aHM`{poE3zVbm4W6rQ8JF! zLmJoJRI-M}(_EG29_!kHTad+KnwZW}jp9e!)ekkZ0HGqZ4bLpFhRrziwQBJtRnxrt zx{okIOHzE4XiGv+2TVyL;oc*M8tbxW0zE{nrJIdljMo z@o7Bs^xNP0Ss`8aYwj89bJte43I{mz878RpnNbyaaOX9EH%BL#3rIL@Q*{r}`nL8tyC7)E?RcBC9;NXSxI+NvC`QL*`fi}N!~)QzER%BVLw#P9w*I*5AOrF z53khPuVWxX73rth0kis4-u#$kIS00Je&ZU~Pkd;9@*3_w3F46CFwuxLH$-83u-!cO z@TIq5duXb>-q{#YF*!xKDYL36gsKjGlZebYM%_CN%vmWwt7?vc>f>qKc6~Uq2Q(A! zDc%ck45JsSXxp6FFCYK#2ee+t`s6W0AL^kwj+zkIBR+Wc*;hX8!L!fAZCoxFA`8Vx zw;?9FS=NTosCTcbVV=m2L{*l5>bEn{;WawSt;{yBt6FT8jjd12?O;h%USp05o*cE^ zJlr1Ky#DH|Pd@a$`x_qxuE^%QJCx9z!~!rL*)uOZc2Rxs=LEKB!f@3LIuU6B^PLcwo@5j179Su9XsI<$`xL zU%$l5jcqEg0+n-)ETvp1F>kh~Bc4QHJ9{RgVrs&wOKI=+wVg)>oN5N(7{iM24$}-D zMj#qyWpb!8bA?dXJ?C(@Sz5hl>Bl8c<|*FJXl@sD7C%`&PnM%Xy0h(k{~ zz4+8y-u&>zw+dEwmmOh_DMLX{^|#@(IkDDad9@1DO&>>zEX_*EuBFUfb2D=W#%8jU zNr^BUX1ZqF_&MN}S2MZG)n&h)JJ=thEVtU|QN^X0js!q4LTLc7WUx5JekmKMK#Aix zoE^b|1J+EqwB$ZQ;V>K&=l-eYG&@cy=7f|b9~m*6G#8YSWAVj!oD6|!mO0|xgEy&!^th^66f6clS;f)uH$aT>VaCS|W=Xqg2& zFbsWL9rtuEMvnd?2}zm{%Wh{W$))n?%If!TkpKo8W22hekeC%FnvFs<#l_4eB{Xcd zGrAqfV~l;JcR-Q^S(!q)%~Ba*W2(=1v4$C(YhUi8v)RU8kXfu=`-l7J_l%jXec?D= zOI3uK`&!E=;{-u#577~QcjKy#NzvxqPB((gsStscnA_|TrXOP3bFEt~jWLUL5FOoG znlG@R&N58e%A~fJ%&MB(L`v<}mW<}ZAw_#; zvwC4xs>*6(cZ;#+ofEH4-&eIAIB95vc%QRZrsz>R-)!Z+jZ;5*Y9&dzR~Ea!&h9y! zQOsCtsYIx#F{dgB5?uT8IXm_-e6F>e)>~n7yXQQ5RJJ+>z|60g%berzBSFY&2B@25 zrTf&q?V^jvhx^eyj+{OOi?w=C?x#^jgVpb0DG+UR8_q#&bYvt1vjL=;qld=Ij&{1u z%ss)=+*T~3WreDSkBFj`yLXDk%$>H7vB#VfgrL}SPL~q!IZRMywT9f2bt@ZlY@O0< zftZqD)wT2vD|WSe7CdY;KCd#%8`ks7=xlMz%uEa=`|D8AAi7Bj zuwa7`aWH60%{q#RVWah(_Hnes#lh+z6q>?#SbcQ(cvzLj0Ve9+KGAZ*@vDi%5hJRi z9o&k}B)bE$Lbg;dbS#0YfZ_7P*1(5WNTnt+*GlW|E()y^ZKlwGXZoS(M4 zwoKk0rGyT;@1zwZFfxqh#47o4q;OQm8wsTZjZRbn9hhndN>RtzWte1$G#j+aq7XZV zlMhe0{p4%)vG0ELbH3&m{PJJ@13&QU$6o!o!$baHz-(oi02}Piw5oKrU%#rb%?aba z!rL&MDQTXk3K`*Ml|?7rGqO_K@FG==mbYa7d=71cJe)o0Q*8X z^g`NTtToI4U$N%&D#gBUb0%!gxz>`hYdj%OT>HUWpreM(+qGtAFO8sN9$IdvDh>Lr z^zL`PW&ilc|IBav4W|$N#rcl+xo@k)g4-$(a$*?DHp@^U2qFlBjE6%@NELhCt!m3x zr`p{t**fPqmi9ts!H?Kr8=*@e(Qe#U&O0$X=Mef7e}HKYJUsmv&_q?34X7hy_w8~- zHSHFb6?5C9R7W|L{U|HJCo6dv=gM2eL9 z>=@!8oEa;5I=QHcyjVjfJrw7JYceg8Siy9F{B1%z;z^!rUqoQ0ztH z9G!_7LS?3mvg9(i0gAG6wyU_n0TX3rwL&V)(@<6w%)vqoS%FMy%7Kg(V{XM%q)~wN zs<67A$=C%e0I1wo3eERThf7T5aHnAM;!fbII^Wwf?Z{@!=VVrt%-Mx_G%o-uWsNb` zezk%A)2ryGS(TEe52z{^=@A&VyKf0bF7tsbl{AK<_C4llpf{r(&NjMRPkQ4VQgimpj(B@^;$>%_VsWrls!kDRUF8D$FOPRCWBUudyME21$%rs){ty zhWBv@U>1CiTx$-i(AuxX(`hIX2HAEKxwd(ley-Zb+*p>WJwrx6!EzF7J9%6q#<)Iy z!r^({yBRf+$2(o{=Bl!aXe2*TbY{qg9ZA@ZYNM4>E6M5E{ZLWzMt0KNqYqChtAuf_ zFdr<RP|7iHc4@%M%>%2#=e>Kn(TVh|*xWRXtD@cAbf61l z+ZR>G>!Vnt6Dli9Vw=!41Cr6^@PJTdv`{(eQe=&>$v@?#5`6-4vz6&xPO-0QMIEeD$DI1Y6tue+5FS7xrr;7!T2pHsPqQh9Vpvv5MrWH`+ zsQtE&ye4}ho1Q9T0gj=BGXog#-ZQEc8cvziu6$VO7#N_Wc?+kYQfOAgu`D^dY5H{! zm3)khwBc1X+*;ty(A-?r5({@_6Ey{kx|odtW-jv-G}=)xewClSgQ&$ zlyg*jD=yd2VwMCLwy|X;ja4#8Fb5M+l)}7o+=RKcL9$RV87H8^r_K)zgfJs3vnzh8 z($KW@1Bu=o;C)=(C&25JNavaMSF057=-}X z8w8?(8>Gq2Lo0J%myuoMIa8h*u%y!B9u&U457jNZj}WN+A844 zmn7Q1B^D3gc*L4x9&OH&1OuzmhY4mx_x9RBwl3OiA5S-&D63z;z4&ZnK&`F&YRP_t@59L#&=)$Mm(YVT{x;7qW`Q%n16t zxp_$6)L*`snLONTK|%022s6dnSHyl*B{S&5&9XF%RSMSN=uHY)k`s;dMrE2i-Idv^ zee^u+Gjp$Ms_$I;g>Ddib9Q@R!Nom7#Obu5b0RH2M32o4>!K4dQ>Kp%-R4$ZpY83o zHXr6}J{P(Q(XApQW1AzD=9`o*PlfwvojRiqfb}&>)A^K*BBC|<6eJ(M{k`qjX#D^Hvbw3X zAN{1&$|iu`-xS9V*nGCKQ&nxZ7oEm?yH}aFk?^2-RToFlva;2T_Cy_}wg6$N;&AJO zIND#+>0OQC?G#Ow$@^6_-1|1mBT;!D1`&e&i;iZXs5FqR*_2Z8sbaoDwIYIco@6y1 zzYoXv;#uz?aJUTE=ZSlU#lb^TMA{ez$fT&@U3hIoR;KwNO^B9IjK_D>>B>r(JCz4W zsb8r5xsXOh0!L^nyLV0obTGSpW=1!!Qd2+sq0$!0ZabRp4O0n~Tlc3nSxN0ruYx=K zrJ|xt?Hubh;NiY^t!>UrS z(`@n)@6ZRleC*{G{9Z4cktBBuWNP7L54s@ z1r&wJN%-}eu{=`VlHe~fYa%-i3E zsD%XlG>`=~7O!_{&7Ab1Dne2}zpOgeZe1301ll0U5K(RxS;HH@SP;h?72#t`6{_ta z1sb3^JoY&7&oD6~YD}_olkVz%7aUoic7cuI83p2qG-e%@ZDd6ZADMvzxyF`n%$pts zGee=>%2YdvnCfZSx?7>8U6o{wz5qMv&Q9r5N^?JiS}_$Y$u?kbl_VwajsGw&t;#XR z-Stui6wl@b6dZnH-41e8rZLz3K3u$G+f!O>0yHfKwbu{12Brd22%r!rAEUic`<#_*`@%8SankNTR_ zaDg=MWNb=h9Fjn}c_l=ds768ZctG^qP6-{$Qc^5)RivetnFzR;E8tj$k^Lfc+xIox zTgpDXF(Ct&)0LGRv$M5ZF$WwDM5(DMruI)+F*4z}-%Peir*Rc(Zjn02GoYl=dv614 zNJP?T**@xiP`O)Qo$v#f*SUc9X?53F4&Rh%*0SQE(oT86&7k zFq^2xF4AoT^fp9b?re9_0%*!7R;UXen7CvQ5@D^0pD0l>R9|b!y0trD9(Q+`8?wb# zKh~O$X;_%hguDpQn2U3lO^ zC0%6h-8>tAgaklFCck9crp=bEgd$u7b9cc`Y@q^#C-*8xus~Ah}vaC^z%g^Rj#%G z;UyScYFCXR$D1EqZFyuQPbo$NwSZRH z(Ohdjm{J=Sv=450hG&EX1$hQg-1i;pgR0tLv7)ljES_x@(3Dw_-V~uh%y8zm-H__O zTLq}A*4x9xaqAlVMn~<*xscEFhShXHB^7*mYGYmx4Df!eV<47Avns8vX*eN_9_GIG z-qV-Pi4$|<5PR>4fEzj|;HkSUF3Evg?XkQ7w&HrLEqaF8T~8u%w^^G37WJMsw|bAq zT9bS2;7r#H+Ol=5+TCgfk?@iAs+W({Kz3qRcm(FNTB)W}1v5tYojc6BXJabTt1CQ4 zSlV6cvdcMTJ&zLp1u~o>-^63ua4tBj5->A2OEt5qX$#6ho6r!;BZ@!{;D=2G18jC> z?)`jH<`GqUO?K^U&OtTcWiT|%t*S@S>tvTe4nb1rgObrPWLnVZxl?0Zs1hc07@0}Z zW6cHHK+tAES(UNE&2y(Dnwxvx&sZ@Oyzo_-bUJ;S1$EN|y0S6d$M`@64%oCrvXy2R zq*7gRb?>Ymh;pHrz@iFc_RJ3j$%g@+39WG~iq(}mkzmM70-(3r2CNI~ zE;B}~_vd|uH)ae=b7pQk<6SrBUA4?V6(j;+U0cTa_tsFA_~B=MVVomQ(~MNdqG(>( zJc24VF!2)@YkMC&%!Cn5^7>5mMudG-KW2ccwZiL|T94s#T&-@@h#Se*qcD@a$>Ak~ zRlVpF6h9BPAfIr;8Hd?nB%q)*EM2U6@+&894sM_&&@Co-*=L;b`ap5#W2ix zb08M5Gj;`AGB=cJLMY`_myvS_cEe{W!BHEJ{cN_A2v=9Yv-j*s#yi%)<*POEbt8=& z?^U6VL`ojyqazgG8U;C9UNF|SoIzLsNQ3u zqPgaHN75( zl}XwGQqA>FaXJ$-G{$CC2DWBvH(H7FFdHYpn*zr=F+Ybp=5}gHZSHFE6*V)$>;dj| z6~+hAo%@c6lOo-8v+in>O;V3p=54+f=R`r5UI@48>l{Ya@f-|X472G)8I5O6Rxdo~ zEjil~aLCfSwpr(vC2FQS902Lu6Q9?%vhn{QejdhoTt1V-%9Zcb<2 z8$p&B3ze;;FM%^*wQE%-TjGM+x_rf5X%=9rts5TaZzmF+gptgeh=I08&aO=TdJr z5f}0vhRQ76XeSMQ>Wa9N{hV-RkF zx*Hzu0;yeansVFaJvYUqRx;EzkGTlW^vd0_vkKw8Cs~*<^P-q2YPE`m3L0s9CxVNs zt$H`v64v#|OuoPr>YkyS#me186+|>6!mqBjFtYEvjObF>T$wY)=gA!EnO-!^RzQW8 zRkhjRw>r(E(v4l+bYuG@C}`p`LCP9g*%ma7SeP4f8L(i_EWiA8tz-eS{k(kb>!u& zyjyV;yRZp)F-Zos)1mFKYI#JD#}yWiz4r?W5@(K}9*yM4zPo`Hm#X0YH`d-^t8Mzo{y=&C)i#RV{%mkrUN4RmA9=x*2{vrVRr0Nd%66QbJiv7GVl zIu98oUp{@mF|*z0u$o|1b*7Ou;P?U@ncWudMXH_!H#4*4l%YCR&Sfas5wLev%S>`! zLe65mq^=Pp8c+k}2xE^31emQLy2srkDa=#tBcGSf!kF^5WCeXB|fUZrZSA+NC31Pg`O37;UMUmBAWNdzggEtWMP4RS&vGe$%6;=>MO!ZXi|z z#FfQZBpUEmtyo9qbD)<4AD~nN7}n%5OvxOE-LvMxNCYZrF<285OZtQ^98bH{T@`V0 zqyc8j*6zJLGHdo6ndx-US_PGdw~mykr4=hBr}7AyRb3N6Hd?u`Yv(=Af&r z?3yEJ@@y!SFw!@5x52>zoD8!GB+7#vasto$8D{J41H`PYN;A(&KxS+_{!_P4tSU?OrRoT7WyB@6QMyjOG~mT}YI36hd^1 z>{OPo81)J@D?rJPE91;lbn-_BSFDElS$AhPjp6f`np?OO-aFl$RM^^?$G$&~er-qe zaTd7oR_*6i+c?{Jrf>N5p+8>2eaFn*dJs9I-v54zjF+n1{3?gIpM zi=O(ga^$hYpySlot$pt+u8n@gnr}+1nXGZ-WFXM46ByZbn?I^W|)y+X2E?8@hNx{RX)tno8OalPIy$8WDsIyVRjZ0OdK%ROOL91%b zQW78t6JRA7%rJb6X9mrgYkH|qRe?w@}9^40vfkuNNjlaagG3z-U85GPys@V!Jiyo<+aqlEx%N(tcl?w8((m~Lf9Mzg>c{W? z>aQ)`{&zKls&&?76w)OswN=Ki_?MwIujOD-9cb z=WR5$wbgV=z1zY^FVppI9>8#gWEQPkv;8L36)U<`o!5FCnfB-{rJWfbXWz{>un23C zXo|q%WAnXtnYpjG@BhY^@#cT)Z~r-d|GWR*zw$49^=JP0kN(teiOY7Y;tII4yK3$M zt9fhIolo}%k&_2GJ`Zq$jkCqkta&g?h9>z63OwQh40g-VyFIKwRbTU_=u>(l*r;6$ zn>-yg3R*_Y-1Cfks|k0@l)Bax-DXtxG+6_O!$FGysBW4&=P?Sm8BIZL;o0Tz>5Uth zWb@Q^#&k$6L@cSY(=^^%1KFKq=oD^jrim#8X|RoUBZwlgw^^9HB)6_n*caSfO1e9( z>lUpPL7-EvW?b|_OA=+JgwP6lb@__pAY_wXRUCN`Ug&Kz84L{bJJZ=}$c=Lju}}1D zr$w|lXmvwpbr>n$nL)S9Q?i${4n{x$&mln3=IB-R7`6puXV7V$wF#Iz>UhD#13(?s z0C=3KLp>1HLM*4)NENE{;kIRv%;5AHAD)r_9G!xQoq`G`%FhWYMcAh}4H}DiaTU?K z>4vTYzsIm7We3DS%zNMlVE(f+4UvKpqtqu3A~mDlK^%H>+$fHNCvda5F-EI?%u6$( zEvIDJZ;24>dZXv9oI#uQ^ocv z9A}ewY{N3ojRGa=bRaZtQs1K2C!&bnguwAB?~l~HADd&gX_px z#e!o>3{F}Nsj3=hP(#qvHV$e0QkWdi-gm4u1P#p{onN_yK8#RxpTC`|u zwpo}s<2LX2qP6JS$z|07(q{b&OQkn5UM5hQN{T_>Rmn7#8H}p~K~xniMpmJLEOny+ zXIDiyIH?*l&vV!a#Lhw0U1+FxkNz4~QMj5Hgw4QZg;F6-7yu>kYxUc{`32ei7?DYTg#iM8XB4f zXUx&)&e}#t^Cbi6p6mq*HMAoED$!YOUJa`4)Dk?{0a{sc3lVAv>2t0w7G>{jYj6>x z!8+P*W7Kg@P6P4Af zFh6Op!qHlla0IYDdIw1EK2E&}uB~nls#*XRl-RkWqfvsPR|viBZZP~A^nYhr=Krn$0UuHNoT0FVsijewvPucXD;jys8>{#I-v;Tsx=tHZt#|@p^mI?&>@-YU689$rxr6 zX2!e%oP9bd|Ds!#XyV`jUy`fo!Phzd3MGwa`yqRUO zjLfXVB$(-^MP>m_!fn;Q8J@Y_7NBKzXK|S|0Bhywjz)u7l>wxNC9lyTW+hr{UD-W? zrKX(6!se4gMO1aHD{IGEdna1sN3Ncaboj&G0+DFN@{;)3&;0yY7H51rQ@U}ijyGK0 z=0u84jm-(&-ITe9*v)ng6(1N0A;;g1IXFriI7@yTC7aY#m}RxkG6ZM-Gq7Y~RHL&7 zD7afmMxlL{Vq>Wtp-oIS+WanMhs-namW9Ub+)8b*R+_KsnktQq;mM!VT%b}{-g`r3LH3g9!k}<@VX8(nml>s)Kw}WIpA5@RG zdFG}OnVXEMu#Jupl4?5heoe`cRpv$u<$jrHMk*?r0#@LRtY-49G3n8&Pku856c__V zY0m7Jgod=i>NL>9GrPyn+;tFpl$!Agk6mqKv5hvleV9=B#&}YuU~I~1-A%#Fc9#3> zpWV!>Z_H0IWAJWz151z-JNpV3CZ)j|2$ZYY{e$?;pV#|m_VMe#_TBIQ;Evz*`+ncQ z{BOkmMDEBS|Se*4=$`%{1BPyH`{@?ZOBuV4EMKlW4K z1u%vdk-1F2STQ*{5At4jo zjUzR$wwSkoFYv?Ac#Ig}>&S&*Q{II`Y?L3+7|p1uiNUd$O-oyqBQ=_xj5)H}%z|E% z#91x2`DztqPOp=l+!IC7lEV(mX+XIupOG?XzV7`rcedz59d>1zqmAep15+q-9uh`x zW4QQ4oBDDa=nv@V+uVUDm0r-jc?OClx3)-2K_KV5P!XyVe!WCY-cV_ul49tdsiJ zG-FApz&%5!m{{L2Lcuhgj{|msTIy`Ng@HksK>6*(+$|%1N2sgEf|n3pBJ>Eqi9w4 z=v~iBh?BKw=((PNDM!iK8upf`Bh@r==p!(qAT}V;gK!FFjh0xg1s7Aw)@MF}h_n0_ zKzl7-pwa4?dOmX%0t1wqZ`s{U z-A1OijIM&Na-XNnN-r<_f=hY7$%RMw`fX=36WZ0XH* znp{YbGBBkAqpJ|+JypTjZ=7`lroec>=$vd55oooC0}BpmAO)yOR}T_$y3KCmOHvM- zGFF|1ZiTfC=2Z(cizl_J$L8`p4!7H3bng={nriErxKaUwxO=O3J;DU}0zpJgjnXpU zzP~Q@gxLFJ1`!yD>FjUFZkl6jG6*%^zph5FcDc>p7{)drJ7gn3?lG0Q#ZWm1WN$CY zwKGQ2>9EXNZtbnRvf8g$^o-SPA7_T#c5W1MJEUXTm?zDLP_o>M>dF`8rVSy%XvIdC zojc5wqDhUO)&7a9R98p1j=(c*Vxk-7ytP+by9quDkmZz2*lgP<#)U@hbP9{+;WE2I zg_7yeDrvYs-nYR3c4=H#!;tOQqGUC0w!;}NHL72pCe849(2be%bipjxE%aOP{noKd zn;nOVx*<1HGnL_MGSuS~+GwMyF>)FWFXdvshY|F^uuf^yB!9oXpQnV#4_lC0M!&m@4Ob8>~Y?6-EH4SigWe+7+ z1BvY#EJ$D11#`K>!>(1;U2VhUKs$^Un9rkBee?OuPIov%6wU9QVQ#ctX=i&d1xN=& z?5bMs7{b1ootH1;Kurfs%Fgr^xp(-YqpIAZrAZ~G#E97j%et!qo~5|#r2`o8%jk)< z!dpY9Xinyg+HLk(We!?YRyD40QB`d;cc`sjnnoJkxO6ABUpw6m9!GnYYEwnb2V zy3cWh5l&?Hkp)?dU~}9PIPuv?C91-VZU=`!n=Xv*QW;q4?q0FFRbAIw)wQ2@tYsW1 z?pClekfR$NIpx#dx?~lV10%vIBB!!c-j=Mfr8@%zA&{^)V*7Qec}s zVppjIzhpSUuaz)#%3QVUx*jl>df+bw8QZwj!-Jhcj+@)`X5iR;49ZwntB4^N^SN`B z@}tjKS9A^_mU-v(SkQ#$fK*mK)??OGT}Q4q#uPI?_m1Vnq(%9sOgOjItwyuS02*B~ zhh~^KtK10mbY>&9!welH#9Em-SykPNSo`_z9va@Ntz9W7+>mMOnwB}%g~q+_2p@Q& znHP5WLz6~nvxtC9YEc-8S*y%^kTTsUH6a`K&SVX>rr&Y*v0vuS`F|5Nd5foUwn6L> zs*ihr_V!ly?brJF^~W&tSXF6*q^!EG)zu*Q;ak5j<|}jN9u*vD*4dg63!qen5X%^u zY3@)B0Jw(qHkn^DE|n%E7-)_i$yp^g9^r4DIjPWN`wHW0fM?nTbh%M70t~7v%TF92 zXr7fkVk|Qi;38zKJx7&|6@2t3Ggv8=xv7U|<3Kme37o~;P&3QTs^q`{n;SH9B0z#M zXzD7OjRNzf3>&>cyL;|pgtIHvLiphI&#v$MHk_R|aj53joitMB0muedG(sj$rtAn) zK|}9@FiA#(Q(5zSOm8M(y;7LR{WhfD z!Bd-AWrA=Iy+9s&r!5{xskVW6 zchSStN0=uYhg}Oj1_B3qi!@yBxFw|V&3S+Q{+Iv4qw#nC)BnoP{R98_|8wJ)f8{s6 zxWE5dV>KkFDEN9?Bnz6wLS!S z@4Ln8;Z;zl*~JBB(JoSr&br@h-T8ESGd$w`xy=<8X!Yftw*$Mhu7|SJx0T#YPRP<+ zw8ERZKi^+&-&d>n;k$jkefHV!_^m&6eeW;+cmMi7|L6b2fBD7dKefK~v+vIiXN2wd zg7tYZMOdhB0|~>Zfq>lGJjNaA9+-4V_vgLWV-1S1_BJQUI%%mq`T|v|Bcij0bTu#t zh|Ov1yIVB#U}yED_Kw387*6*z_zeQx&?CZa zqiOE3!(|l>HuLVWX}hB}5e9x>$*oqz68c2eQ}fZ#kh|usrBXvpnTMKyrdXX7%K$*q z1PoBg09b&Nv>=;m6*QntUBiqM_^KlT)g-nkJ01%}?>b|+E}NWy!NeUI-fTIn8&L7^ z;0Zf~b$8Q=M;{XsR3|CLU}m~2&7CEqZS5d|j!;oks&P#JZi+C7uL2b9Sq9Oj$`T_wErUl|dov@nr#S zS8Kb4h9yX{HY9K5SUd)HrlCNO-fR3*_DVPAKq-nzh4Itt(=;l(MN;9c!m$5IE132> zW5FkK;H*KWMX^kV}YDbpmSnO+Vm8c`#ZCWnC(hIXh6z32m$ zY?J|A2{$2RjP;SV~yGTni$f*Xx?=QcYpe9hoB zrD$Tb#-Oox!Cl991-IB$^m&rq-DL;?t*Y#t;T9&)!QA)rUe{tD>=C+47b66kiU`r%1XsO( zM8RlVwHVpyaX~MI*dTA#s;Xo5A*y;h^$}kT_W>%1^9;b8u8U`AY#-X4wi1GE3>PhG+U)I3^L}05uk}x)mKDT zt7~0X3v6cR3eOrHY(cW+(10WRMSp8-*^tmZW&C#5IvOU2PHSV-_IH zfGW1ewu2rq;9S-{Ne06Ok}6BO)*@LTx+YzI;QON|9x2CAeg+*ni47(*$DQeLcdHji zeXK@Ki?I9Ng8?=VHM&bEiwB9Wd(i~$eHV;tEq^e~e3^QqE*T7kL~(HRG&&t!`@U;G z4YF`FcbB_!j8jdyse473_496?@?s_$vJtI}6S=lIoitzf^EtKpwc^eq1gYJaqdFjN_cGUUqYYp~zK+{^HdABq7z*ss!1EKGPgQMB zgKI*S)#htg+PPiMZ+z%t>`B*lfoYk(-EH5k*L_1GWI z-@MIPQw_}gr4k;x&v+RUvENo%~5**WyD+!^8BQYU0G!JMrd?bK(B z@4x=_SKt2)`*3d3cf|4&MM_0vRaUO`#@e7*wJ3xk{kfLn@zwW#{R@wu`PrX%d>()P zkNwyG{U7}|@#Qal@y&19=O3=r`$)wqjge?K@0vXs3|5`)4z!zRb#-2`G_{*7aZf<^kkj zj1cGbW(#2)EuVzJNdjHjqvfr#D>Rw)163HFC2B(M!fiSnkXd!yh=QA!R9$O%<KD{ndwv-9y?HUKo?4(2V-D;W02}9fVYN=!Crw#%F`GtN;?)yMuBu~~gxWk-Tz5V*3)OM?q;HH{y&$z# zoG!Ggz~kVeIJpXQ6_HLu?ha=s`5;GL5v&PC60%cucG*y?%PnXeT3KbC=uOT{WUjFR zTns&CK8b=Hs>v4MWIk}xGGyi&XAx<1xT~vM-8n-+0HrH!8?8LOlAFsx(;FewkAbV@-gCWy%c(+j+-&3{S*tKo6Q5 z5id6x1k6}@p4WzjqjuAlN6)JP7U)2B!6Qh}CZ|HJ##qeL3Nv7J4|R>X4}fbjf;hMh z9b$nQSyk?{=<~TjE9D`Gs46vm+1#n1!$t+{MoL>vv0C8)4|gxM8GAgOnY|m3J11Y} z6dI!$5nCOjGC2NS4wk}vEDfi{JwKQP!JT^ukLSoe_?SURIK=R#IvYXLSj>l)S$nrn zz#r-1Q$(qShXtO)@?RRK+N7JYGY z<=t#&E|2rhv%BG(P?V9E`eYxB?4{KV?=0Y`*x%OmzMpC%+8&pHNy4RZ3>?e+u5?uI zeL{6-oJe%md|1sk%HVnx2N1?xMhlE>(tLi%vosUJtRQ96ZDtG>6j*!H-NpmEMv*87 zF?-0f0dWneSZXNDGj~Kx4hfyTdv?rOZT`bR1Q-q6yXj+^ZW37;bm(QEX)v(Ndj&zp zRaH>gS@DsCIsvP^$8p@54#%?7E9m6uX6M7MJ*hovNEVA^XAaXv!i37lgq@#byMb8Y zTg3)Gh0d`}A$1Sh#BBaj5th?2bkmtx5k4?lbMKuN0dfu&H)~a@Y&2EbjCftZqB%0n z{jPL(%_EOP`PpN3Q~Gg64;{q_^p7~7=X6Awk>CO_AG)yMuhow89lSy*PR<6 zOp-1b!$FwpdGEawUFdcv%{|z=Wj0)=yLNccpgcitoip%i_fR88%z&0??z4$$Atrhf zK2438s$gbL?mB#QoY8__Lf|=Udqv!NkIZ3M|B3byeY$lGx6cMQHwlBP9(ULZFUi2n zB4y#-vO(-%ac1?<%03SnK-otB>ni z;n7u%HZq?(9t$#INJgATaZ-~$)zx z!Xi35vn}kd3X92$o8{9i{-M6#@7nJGYCx60<702lCj$~>!xq$&Bj9$NG@Y76#Q`V# zE0ti>0z$b*rQ8V(2&-*)2N#C6d7!Mb1L-u6ZmlaaZ_>uHVg?Gkd#%V!wZ`kyUDvfF z6G}pLFK||PVLp?AT~g#g57k6jFNx^+(?P^_aErwZX0H7Dh z>clLmPRhcR^`_CObJ9VqvaYr6y1TR<(Iux({@`gvVNxB>#9V(sRV|O~RB5fH(E@{- zg)HEVMpdPmtDCXvzWoZPRrVOZ&^7$r>v5f;@XXes8pEBs6%(XAoEvc5NCJ&kN~6`T z$KykFj@_sMe*Ue$1$M5GE`e~ex&S%MmSyV9OwpBPYqYYn&1G{Il{|xMnR@%RR4p*f zYMyH7WjMB%kwaClMZMXvVa>^inZ6EV6>1DyiWp_dv`rdtX5NLvFSgOlassqw zI6|_!NWuJ=m=A<$X!*0Sh9Ji&bxZAJ9i%*>1xEp*9k&f|f+O><8H^R99rFrb7&8AB>`nMEHd)+op|P7-&UEQtaR zt<~gWjpBCZQYIuUxHCB%ZVCL<(@vp3$Id*%v%r}yg!4ZJ86hw@_w0Z=wPIx_(W z#=0?H?h83I-|AG7G`@_1-DQ(>{N0`}WWN_;2~<<2!%qfBJ9!oqzqS zKli`JH-6@eZ~XZCzTI~CqXl&yO`6H%Zp_(K7;7he#Ic~*Y>U7MFh^Z|rWjFOHb}Yw zGtV@$t@8$85fmDlP2E{I&bKH|2#LcQvrd=_Q|?yPF+n!$1@J0ykBN(fxl~1soXgmXGVXDyycYtiReza+~&CJx9Ssos=X}$mh zULpr+j<@P|vk8wdcU4ZzV^u#^>@I_osw1H&qe+CSX-4*I&^4{NG@mUAxJ{2h&ZxqR|gR!bkmX&91K#44io8 zb{-+8U>Z1LCESfZdEb$!pBlCW&M|MtBg3Z=B zT5>a^M~{)8ZBwaLlh`|L^g3Mz-)aK$aC)o}6in9OG@3`a1F73ab_6GoVAo#DMQFDS z1Pn+~lE>)mW^u+@MjZ(|V6;)uOyVl2?slGCV^?qK@%AtuYY*01Dubg-%1u-50@Gzf zl5<+)m^a;)pu(eXXoX5J!-y9+Ak-^0nj^zRWyv zqwFvqk6ctv?dQjP%P{2TH1{mI2-EI*_yWgHe#nF3gh&oiHTJGpc8>iVl_=e3CAmP$ zz1J0NR9ALg%ex?n%coHIgoSoDv~6ubZszoRKiz{y3U_7rQl{q5K*M8rsq;MzRa@#u z_`Ol8>zdd->X`Xt@+P`+n(eWlqjWT$;jG-%5k7lwfkM+P1fkK^Y>>I1SP|>9Zu{^E zTHN;&Vl3Y(KV3h}Bcw#VfAx`FKGaq>^QcT3DrF{EEVJsWmRq2U!F|{Al`3~s)(Pwc z!9nQABh;{n=l$`rMU1k?O9IVDFVUi5RBTnHS1?FSRGcs3MW^FLkSnMrI?}Kcnt<}2kYDsmsGR;8huvfRyTaS^J%_RXCMM9 zyC3Vyot!?=y>`=e3JA4@-&xC8H3tGn8|+$j`{i{fNQ}A@-IUv^&M9iU(n!eST8&co zKs4U7uE%E#x3wPOYIUPk-F5l8bwZhz85tf`_wK5Fe^t*eXBZq;Gsio5t?Rhqstn$g zM|9>)SlwKxEUhpZ*)|_hcQvsXzAUqB@U?l?Q2>FWyLMH}mlN#VGQZrjs{tzv*kPnn zLWvCX?l!jxI>^0atVvmL4#p^)fCJk5xvp#9y+Y5ujlN@2;x#l#3Zau|6J8$A$sjo*W=u*$<4g0CeEn+Y18)Lcok z5~d8?yUaOcS+$y@yF|ob8O6`O{qyM86oxGvUSnn&DcZ@cJ;Nl71k2q;9sv&NnCK)z zC+^nW?%Yn}*(y$C7)u(rJ8XQLJQMnPjMS%*KJ?g$+A*4U-Z%@b>Pbd`x^!$8PL<4k z41|*=Kn&+!Euq_vlJg{boc*4e)9T!RJ#!P<%czARbD5yd8U!cla8u=|0d&N+Go6|w zg=wDX=2Epdc;;@&6z~?zSeno5sO)Dz^O}zv(SszJt@7+8YV}#Y=c0IRr{}>p98^1G=DhEF7Fy(B;XsU5O~Z1sQ}j1zKCB`RSQ1CHG2PghD9y$t z)Rpd*m1f=&S~m8&a5ft?l-e;}@|g98j5LD*jCW(sR?wWN?)hY<5}Ol~K%Kc1>8wsn zyw0dvfUF(kPMzUaESzZylUn`O~15UXk{ysN@4qCsTtShnOMvywIv5wALInQ+hCpw+$`T93E7 z(@#@jl&*-~MQ7g$cLN*fGb{syq>!Z3rQUZ?n2`}8RMB24)HX30*q8Wp=se2=XH1jIOwOXB7HX6`@w@_hY5;;5E z8FsV?z-GrTLugReg`Cj65&j*(^Ep;V5mSVX_jO<~rXP;OXR2pmo$V1>_t6s^Jv^!= zwUmNflfg9e=&~`n2&D-QnDBE>D-K{}fDkB)Fi{60FtR`W@Z{ClX`9{U;Xjl}K%h@i zb`Ay{enz4$D3SdTmq^}D?E3Z zPbVY-KJz%Rpb;QMtg51o<5P#eBptj_&jf8o?l{s#vHPe+Y`Hp1GFdl#xzKDB6=HV5 zK>57FlxTK>xViYMz1`W z^VaB_HsAmatg4Yab#?e8)04Ef>qBPK0W;Kzr|Qlhx~t@cJIwO{IAOFA9T_=_wmBn) zC_8<%UN8I9?`pZPsXp6;YKpedTP2wz3k0sW2adP{Go0-zRdprJ)#WR+b7Z@t#+XC} z9mN-oRw&IJAtHB^Tvyc2`4v4=Yx8+9x=Z7_I+fi~S)a%@9_(n2e%D7mWZfNHh|?9c zIc0@r7Dgjqqd5h#cVWpZc4YWB|jk(h%9by)QVoT1r`)MsRw>90bbq)1=?qWdg z5e1nBk2t!^(UMO#C+CSW2VvD|v@A)35`smbO)=hITRt&6NqW~-R@GjQM^%PIk5qMW z1+!X$P3Wo`XoyZL&WxZPmfimHrkTNHV#QmKtA%cw353bpnwhb# z`~Et2+gK@$=3zX=Kk0X+byxO!EI?UF+0dprBgwH#z>Su@9nsou-mt3eGizaF9WY;G z(o{4sUbNYA%{D9VqX`n+{LURlcQ^OFbCS{YNsKVF!r2ndVuz?%nL5p^Q-TJpDfL7k zp{uFcPv9k%BW&KW`&locC(eqT?Pj(6b?CL)v+tJJxUM%_7VAM;s;XpW8dE!Rwn}TQ z?%uh3XYXyWMy(ZM_a3+k%(!cl7IX>SH8aw#F)?Vx12tiEHC{OoV?=iMojH&Vnpahj zO>(FeO;I$fds~=W%xKK$gGRMk40zNo4B8RxzEmn=neV+{b0DZ^Y|x-BSgGhIFxlwy z{gCunnH!SFG9mMpS-^x&DBMj)YS-g#0_-g6=u-iKodAn~$C|Pc-EgYPj5N#CTnaQ8 zoNoJm&f0DIwaemJ+m7Nu&(5ID(HgOg_PpO8>rL~65aBlKBx{x-?d6#Zc6nG8QRKs2^-k;p9f6B=G4`RNLaotq`PS0_miLs?M{8)wOM zg4u0zF-PqCc|9KY^W)p~wzG^fUlShPDH~~Fcl88Og3wHeNblT9Tt0oYLj%>c9wkiX za7`wUcs5U^R#sd~0>HiZy4IYI4NdM-XmhM|!F@&v_9vok!z+1-w}wFQu# zJ8gymUwr%LN7XA8!0E!L>6)>Sx{P+$_JM|iC+@aKbzbGPbp^WAAD=B3ZP1F+GLs10r=nhkT)yyzd|WFn0p&ZE*Q5ex+3CPwP;TNdVhSZM;lmU ze_-yr!L=UMTk^F$OW7SprT7-wYTu?c7DaYn;N^O+Dk62g^N}ll>YLyA>EHZ?zVmk`e}&w?>03X2eg4J$eshq>=YX3@UkE~`%q^&_83mTqbpmlj**w-{b&@uz zc50HtUr!o{v-L8gLDgmfsrQ}Nb1x8vYD_=PjB zP6^eqPKqZD#1AK=0)ofmIW>s8SG9+$%D@Io1;K5G{>m=r=rtJb*_t@5!JRfqqWd+W zq~(5I>!AS#88iqL6J=+cN6w`C<>RoK`d7(p#PU{Eobi;svWmo>CwE{i<1uR?%!K2b zne%W4I0T@|hMnX*xE}`=G)xdcVM|>y8T_PFZ~|xAVhu0DgnTKoIIppDj59-44tId9 zW0>lh-V533uzp#)+0<<7DT`G*R~XFLR;bGC)^d|uX1m&KHHySUc+AbJ5|Jec**z@$Nz|TBawKTkwT9+#%(?BuZmy? z)22m+0INGWn^_2;xl?@Bj<^UrLXt}p^8JFGj^pvT-h-Q}F= zJLo{k?2@*bXKs1~kfVWp$)Y4IUm{@UMCCzPpwrxG*!RBH+L>-K>IuQzC+uLxhS-@A zt9wuD1+q&BKy<3In{WUVEI$!BYN=XS>rEcYu}Dj~C-P~c-3&8LBsdu|CKKxvD&|zr z4r#I~=l?b_Y?0pGD;&e9bOJaFH~}uI9Vqw+7CL3&xR%jRoM=7?Q$KgfL4sl2RRF?c zt4A+|aUc%(^QHI;8+BgOUUtkb7)h(0a7_C#pz+e^W(x-@A|i-^sd6L-B(hp6&#~$k zEM^qzE_63$U~$SM^vK^qiRMDNFI6?@ug+C3HhZhlu<**n3+&@G&3cG1_bCyjinu84 z+5j$#J)PKNskvfpl`*EMAzHQ1Fwj0t@r9o78gz>>KPsgnr#l)<)*Kp!fk+sKKCG+) zmS2rLSHnbbgl8rW{%m-|qaW(C?3(zKnT^nF?nIoFN{tF4tjNF;PXrrg4JqvXQR1$= z)-~GY0f#kVTC!p_$ZB2JQg>H3xt4YISq{Ef%QO;p@Ap`b%Ji8sx4L^qjgPkvIk+91 zWJ8Q)ezL+^1gb>`g>G5c#n_qiF*g!(ovGDYW;OH%a+0>kRRIzSdvonHhLBYlU}LM? zFTXA~YiZ<}HNUL1T-8-s-NoZ7%CSIFpBTSf9uuaH0x3J1okEE#U^6j5*X}WNhK*Y# zVnKrQe!nMlct%>&>Z99iRp(&%M*2wrpOEwOFg%~;6D}b$n!6h6jEJp9&%VdO;}o4+ z-aJrB)$)~fhpifX7ET8I8kM>TpRFkfFud>WZh}$-Ir;Svs6q)2gH=__iu&;RkH7$g z6C35~+AwpOL|fs?9O_v(K``iEU-Dl zmtVzVu{zyZf*UETE)SQ~DT@)5_2rSfU?RMFI~UlQ?L%ys%iV*hLEx@Q)G`B*RleM0 z4dgC!I5C5#suCe}tgEYM2sQN+!F@l?;PhUXOnb~stpYC4;s4b>>oe_ zR>aqNFUItK)zz6E3shH6n1qB0AfDO0lcn~xYNu4R=qiF!>=~JvY-`7{z5B}Nwq*vQ zl~Y89M?4~y%!0~2>y{Fk#byV?Y`&^n-TA!tzG*J&CCh4C4r#h(D%#gjSt`(CbW=4tC)!j}fQC&0Gz{_D{=Oa-S+yPo2DREx$21D&# z;tI<;T+mqsFLRog>e#%y!lQt$3DhRtq%tD+q~M)FCtU_sZh`KRdxMO}0+2i1tTXMp zhB5Q0|#c;5qlPB1q@1Aq6|)AXNOPN)+}3!d?k(#99T7{_b_oLcg|KQKOqh3 zWMIvDUdO0Kv!nPLf%btN70!flI1$GJ4bzcWs|gJ5Z`cnU6I20ik`4$c#)~mPN}^Gf zL-3G0>AmmK**d4ln*Z2_m_Yn62zPJ`M(=*Qt(vfxhD{k|)+*=1Oz-Mx;l10!2<&}F zT$()Kv$$y@gto#l@k&Fhm~Lujco9*xM@!GCMb6&wq|=Pfb42)ns^`nq%m${$@|nIL z6;RhW%GJKszMsApO7syozzwP~s&WR4#SYruo1-lq{~2cbHqr7nZJmT=tJ%|gSD&+C zPBCEo^PK1zk=-3;-q>R&YFUuQ(j9Bb9$UM!zHo5=;N$mx@a30Z;+wzq7yi+I;qUl+ z{w{rZ{N-Qy{#W1oi0FO8L+E@2J&A4xH>$Um#d9HAF0U?_rOMjkis}ZH&wH&m8g{nD zkdcIz)663CHuD|_h zyTAO)|HFU$AN}fo`$ro0kNm_>esMj%l;1CA0r$-HJbVsyy+Yz(X{~pqnsQA=jd{M z{vlyi_x$OjL}*Q>Fec)h@Yeh)8H{eZ_Z;i0?4vV-k(x#HVE{;Kn2#!Rxz9l&&RD}c z6E^HSD;^-A$ApGK~+-FN)zT);U-yijUQJ6 zExNXw9U9tXv(Y%y9}a8DW@4(5S#k|Z2(7rP3mED5kr*7!FH96m$?c=Xx|?k^rnTp^dKl%=?zR^Z zV~{)MuGGj};D@%u00961Nkl&kHCDoudL#V`2mb$6G(|oGZZizt05?|MbLs- z8ja>OkRyKOX+qQk<&OC^u95flSwyF$fZmo^dganO#B>T{0 zPJ|{*N_Q{JJiP7jZdwB=xp_<%B zuwRPNs(}klYKA%V`km-a#Ch$e>gp|dk0HpTC3ANIlfDjRwsod@GI>CW-m0JhmYJer zGBGD1+^4x`capOYw+UAmh!vy=-?ur&(KdW=@cv zxpy|jVg&;>w`AI&QWW5^7Sx)2!8txPMX+xE22+q!CBNn|v| z-?<;_t$R!8UGheXNYV%GQINYiCT?|4k20X|S#uW5%`&$!W{W%2QgzX(wnnAD}ji$l(jWRR90r#DmxR{nWfJQZe}XQ@*#RUWF^^( zfWhp7lqOEzd4Ue?&VDkR#Bh1gtnrb-Wy48e&H{!eRKyy1#So}DSi6SBXnw5rZsCe) zo`qs{t?NSf45~rvDi1rLNwKTq?NRs55lCthOAK@=0q2Cb47#||-P~5z6Qt2H%fqJK zMTyoP(W&mCo{kQJGXZj6@$iO^Qv1I5XCJQI8yGHEJ->d^M#<6SgkcG1wFon-$^R9* zZu6L-RaMy|>fSLK*s8F|>_G?)^m1Z-CV&-W_7-r(b>G{=DVbaCZqrM-aLV57G!SMe z(V+rQG#JcAz^`ec$M`#Q)ft2Bu7`z)tWDT_tpv?YrE!AOy!JahjHuR}TeXuXO-|JX z&=4|V^vo(ZIlR?(rkSnl13ZjuzDi@-jfz${B@Ec z7F?87H(kyJs_rzW`)Vkk_uFS5s@vSpUox7wCDFU)sb#IVtAWRdjWz_Ka;Dx+= z)o3*6&}`%<7q*v&W@k^2KyHO8Q?q0`zHkG@tOT@dVL)pGyqShBoIsZ>EGuznb#!+b zy_Kzr(ga=Vs$9Oh1(x6f!Z<53Fy0=QuZwFDmYFc?Dzg)*#(^!H%oqC3tdC!R6)>W* zaV_Ls5e|B`2Ht@l;%zEhCgYMdWnJ6dOHyOGfoKd$U;D9o zG=zw&I;AqWd8ljOcdW38of*gUeS0{K$|~a6)SbO^h)9rp@bFL-R#@wd%DZF+UcuJ$ zx!w8FolN*Pj*bsd?~*w^Vr2LNylPjsEeiz6o%ev%hLX1TZt{wiwVgH$R-E!vnqv5* zHKxqFwt587>28o`?)C6|=Jod0)%(8vy4WScY~V9i_jA3yskQItdc5s@PkNwAh3=i} z3V!x8zc5ZHn+=pESY8@0(4Fbr&d88##GHF zZ_MEu8~Lb>2lqKT?XFo%jy7)$-cu}|K2>bAkA*}q_v68D!40Qzz#vf3lC<1r@`1{J z;p+%m%!a`VIeQlK&?H8a)n&HM6~z(%wEK%#A*pacK$u}5KIx}MTPvwmep~}{J%g}O z2cXp|^M%n)3 zDprG(o4mCVVk~tEjPQZd3(8J3+$OcTCwc8CHIDaoj$v=*!y}K!nln4Aoz7Q8sz)*8Tkt zh7au@-k?V9N&)Uq%gf&SzT1qV*xgDRp^I>!I4%!Ctle1c9s%tcMGPb-qV8_x6)^Iy zI|RjB7^zgL+pnd%wVhAly_aA96W{p8U;kro&-Y*ZmH+Ec{mK9IKls%@{l5YE`A>iQ z@%H)0{gvrzl;AOx-7{fL=W;Tu0He#=s$X3wty+GZvF&COGzeSKFu^wC+(T=!-aFjK zf>_;t66wd`XJ?L~a(6UrSsy++p*8?)@yfho%x*K&gCKSF%mh^p^B~1D6%pF(q?5FS zF3^Gm*++~tRE2~3YL!P!-97WDo{C7+j6BS$d%#O)O><;P)C&#*U>@^nPidpKA*yKf zSh>fJZQTj;bF66yBY;gb&xAG7+^QNAdj?jOPkVv6=|z*9Punv%Z8KJu3}LP;h7Yvg zeKmTV2#^k=8sKCjR?UvFvfL*+Pwr8@M_17kq>2d}!_4Lerf@ctb0bcLR7F|0*0Os~ zebAgYt{UhSkE)$5Lsvma_e+B%l8)UA-5`qNy`D+gu-vO^%(tM<88r{f3_vG~Fnc!q z^qKO^pvrBScinQRDm`$M0;#6SM|Mn4v^~_Vg1a(li%RHB zY*eyXRppQ1S)mZ!Qs&;vV=IsRuf-FaO*4R~oF?IAd7H-DnOSGPX@_Ns5+?IaHinIX z)6531ti)KOW1>vx+UjadUx0={ge^_|ZqZ~$fq$6zEYD`XaqJ^rRdp>$7-Oz{`e95h9lhh$5ALcG6i0wqBaxO8R zYH$)gZRZYmu&d|%LFYke&)Gz`0j-%Y4*1OGH}6S$?wz2o>*`8#Lv>@eGtEg>pV2FN zsKW<3BNz`Df}Ddb2EKIypIflN>hq*CHtcVLg+thP%(IZ?x*MLWSy0ceM;w8osr^jA=o$gUvSZh%ltq zgh1g$`NTvSn6n$1+wEodEX}!%$yVfIkaU%tR%oAtLVHZFQn>}$z0>SM9P|9tiIYO$ z^y+jQiLM42zCJ}h86&*=*y~1s1f6@uja9uOcJKKXk8AW5F20tv(7P?dot|!#N2xGBD7CSvh+d4KF;^gecdL-U^H#4Fk6TTw>1xz8t~2? z*HSg1s)3ubyJH2UYE|Cm0U@q1kNxr8)@0ZAeW!aYw|Xh)4Tn3fo`vPPKB~qW=iRp* ziG6!`mpU`nLo80Zn-o_NrtV>2yT?$AyX6)s##$cBLTZP`q;MqK=T0=#odbBLIs$v| z;7UNMM?_YQ90NW*muIE9b;&S^)J56uTo!tn#wW~&=j=mx>}n?=mh#NnAT~9&Vs~}A zIk;45h7!6*XD13CQ5ug9yDNO9@?eQ@LU}%R^x`;4ysIvr3 zBJ+TE!8QazNALNneXXi83$Rf=#Z`4fWyWK`cSBCNDF|7NPW*7)hSsw8Ug6K&*IFY# zsBSYkgTcDnDALO&0(-J{x^}r4{F0JISce(ZyGt}Tr@1{I;fv6$W2Nd6UOn}!xqWu> zwco$~>gBmIb(^~d>pk1$40dsunw_!;oSAw`h={vtAcn!!OoL^$QEq-`R%clF8QHs; zc2#x1Js$7RXT%~v>%AMoiZGsUIXp($+fd&5;lqb#=0tUjR~j1fI>D~2>+Nxv(@uUUF*x{bL1)BEIb)+oH*03nOyWo5-3}`aH*~1yaI@3+wIYH<=I|ZQ zvJ;bB%r=fp0I%y~z(bDCf$On{z)l{y@l4~|8KrU~Y00+11q5}TYH)&}fIhne4anLK z9xtkO5cp$0o`vwNj5*Q*o^V^^Few4iVr*18KN!p-pLc}OT!LDDD4{8%Sx9A5mruO= zF=zG>b~jJh6Ad^Ze;S7A%R-yb<3x9dwVDJQGIkGp1rrN0%J3tN#!=V?eT<7vJLCov z`{kfG4gxouDCM~(N4SR>8f3S_s*^;xoB50-yFtS^=0F?rRKG0wMyR2xGF-7blYWAP z`O+?hIn1+joggY>r{L&FvurKaoA+n;SKs^i{?+$?4eQ6h@wfl|f7?Iw2Y>E&{=#GN z|NU#v?|%P#zwy=AUo^`7afM0Z9dLCwf`Oq|09sCK7jf@2I;?yK`M!3QI|T-{@26W( zR;KVb4ZX9qM+R+c!G*7~J-5K#;N|wsAN}lGKlY6u{n5uS|I&B<^q=@2|I~l-AL7@3 zk@n?}|MX8hKKqd`fABRv{K&0RDm*YZwP4K*EK^reL>T2nlF?me%F&#ae0gPqx;%zT zZnoxdpc|{3P5OLa-96sN$*di~+6)wDe$w4UkATk1bm9<1S$4W{yfNL)0Va*9UL!}+ zOV6Q`uLKgRV@{x(A!nwdnR>>$keN!8>#Q`BqoK#^g_|iV$Z)*QogoJeDXb^(b#fxQ z{AlIz!t3iaJg?36>05jLAxFSC1?cEvW<93rp$;6LJs9S@c1wN+-y$cXk3HD#C$YFK)ja4)$KMK{h{ZUo7J%}!6c=@Cev;3Up5?QgrPJHX{Tkj1z#SD z9(l%HI~Y32M6TBfX0CiT4D3oN7<4F$&e1qR9ERFV)!ibyNDP&2Tn&>uH9Yun90)+S zyN{1HXI+$%#PBnk8S_!g-7_1g2??Bbk?xgai$kN$+=v8FeTCPq4x8i2%;u;&t`#;K zM%*g1z--`&&TbAl+Gw<9yj@kIs`n_-i*vWT5hLY4UKQHZwxR@gRogsZ9^EZvFh;s~ z4A^sMz|M7PMl}q5FFHon;<4R5`KjwRtPL zvqlavNQOcoR*07O?bo%!1tU$B**W4q@Q3@4BUBqp)#OHZEeqIWQh*2$tzxxbYy6e& z6fw2gij{kFtb&GFCW~$Ufz$fBckR)8qKZ=WrVT{MD%-DBnKrlJcpSP$1SrYjHNHxX zYpLz1h(P#I9_r{JSd}#6$o{%H0zqT=vh|p06;!j1r&xOnX~){-tt5sXd{V${pok5U zJ=wL5NpKsR>;${a`8HVZX}`?YU0(;+Yz&NS)hMS1wAfhY=hUJkQ&*!ppYLvFVb+vW zeFo^zj1Xo@$1^UQ6WpOL0&a2CnvxCb8VU~@Uv4jrFTS%iwDUg7yt)3zNyKVfk=-V^ ztc_Ul^2sI@?oel^P|r-+3P7d4;@Wr8#u0*g(UFX-hIMnfs(pFwg4^LJyHVOZ&Eupl zHV(ANY#7O-PY1YGF3~u13<|RC|voXzKok`Yyj*HJ(Sy ztmUqnPlV8D7Xs*NMa0hA$ACP5A@hcCnhk5p$f|U>>{B9I83D38jWIs8$Mx2jDa#G+BidT(u9k%>+X76;8SeL;bWzqh`RklL-^32KuwrpARYb#H zFFw^(H8Y4l)p$3se!EJvP0OzBd@*s2T5c31;@nX_+a&&`u_=1R}zH z-`m~8JS*w!T{2s11e>Q9UFMnF-Lo6rW|5hXSjnD#ibuK2)L!mg$j)^w>Vf6vOUSN5 zmn5Nw+lsT7Od#51xVG4S;;#4x=cnt>wI_La3;080oqmLHdY36&Ev8&5q zajlkeXRJ#obq|no*85Ob^;$j&N?GY1Sv!1H*4Q=7U~O<_z4FNCk4yPF=@MDz05=~F zRA!Pm+ zw^)1UsVuu&efcWNTXq>5S$#j>>*EvbW#$8)fN9p4>sHxCJl>-wy<9WFK*-KmyG z-22@vNV>bk);cB! z&ck-Ly_7pg`*EhVIIf8~iMmPauHY-?*-lO*0i0Xzl}mZjSar^EGiX-0Ns6cUI3VYl z`Ey)m$DP5(fKF$@X6p1&?~l@Gmhw0xxvre4|HQPS?xMXt=Z&{S`2hE7<(suq?nV(RP&$@NOJF7hpO{3{QLB=A_WZwdEOii{JX1h ztP0*kn6dz>vnfwQVz5LF)sQ+LyV3-~a04{pI)Ze&d_p{#*Xu zfAHsi_uu_D{Pw>&Km5pde?5QW%dfxx^~Zj`#|riK-o9iV4{v0_QoXvG;g#uTUGHv- zMA0r<*DjE-tovHV32!Z9L>u34@xvG=+SamRTg;2`}s8{GlaD2p{^7Rksly-r3_?hA`P!Akl+NJV9D4`6DVzQjl96W|BB} z4Z{UkIU+lcZvt&@xfO2X(idUmQ9(_n1*bCQs1coz)ZGJ>%RM-Jxs75DWA6^P7NjGl zk|1>iNw2}NaY9d(ov|W!2Ss43AO9a!|N67rmL>T?5o64`-hEDHce~q-Emd_(xMgG+ zsIs^S!3X|%i*HCsAS5noENq~#-D+Cps?4+BHOCmihnUYPNU4;SsXTkXmuJm2W{ikm zDeeF1lY;db@Ed#&fCjt(z~eTkaLJg*7S}wFe3chqG(Wgz2|=HwZ)0pJ5<^fOnNKU1aEv7eN=An1ZaXV9NESmhc#^bE3!h_DBn32;5$aZ&3CUlWf)*-GA1chK&mEB!H zV4BYcEd5t9yMOk9*F!s=nLg9@!t{9&Yd=}X1TOd!;PnrswX>@uSC9KE*fWY)K}t1E zzfWRSy#&J0X-E?at_2~1IyE5IS{WIulT?fy6|M+)e-1|_?;34p%~(@MK<=E@ zj0>XiJXuwmfrE@0Q)i^L7Qs{R#foF)KEi3+_nbf`<_PQSVUK34P(dLGY${{rJ4G-h#Gdn(CR}o-h#zb34XJvraRJEK ztltJHRrmD!MiNA7H9LlusJxBAUD4k)kz8|o?J0!2lvRaF^VI$%tR3luVQfazMX z&-q^K83XYt&0r-*H{>O+VEr4LX|0trennDP({IE=7+nd?M7nG=B^zv)&xZ{EgJiCi ztke71-PJv=o5}SAyZoB?cAZaKOdv z=)el}dydXq^#<4a;D=Y{Tb0Xi0iIJNW3BqG{j9DU_0C5`Pp!RFsHuoBQYCVodcXD- zIMP%_&{&TV6|ISNW7p=m^x8}JVMbLO;x0*0=F{qA*3^pd0AQdJ)pZ3sU8$Jqt63js z%saV28muA6T{rz|Kig@qSnR@8nP)P2TDcdbX$`bZAkI~NZVw4fO?0ZkbzplaodG7+ z%0UCZn~umqF22=Jugr+&oEOmE+lXTKegFt$&7qq(0%OedLQFOekr*-2XYf3^79;an ziPUsZ8nt2q8Eb&*ev-MC=FEFey+8l_8-Zu{mPVXMxGNN+E(40KD(xhE-sax-(8@-u!d!SFuEaU2=|z=-;;{k1hSm>sJ| zUG?LaXWlvJ0F3ET;K^O>D$F9aVl~X3@Ac%g8Jb2#G%v-XO^SQI_H+plV(035BNL3S zcU)*d#)|j*R;Q*n%B+{L=K^JX7 zcCF`%I`yGt`{}S>E9k9Z+c4{~#A$Ppyx&uV=8y?OLIPxrTa6fZ7c(Bl=v8-{z6=C; zx>oL)10b~~uPNArj$6imN8FLPC5RU{10x%Z#{gum_$Pf~w~`k^Vx}-31KQOH%E*#` z5De$D|GjiPM`7>EB_PIieyZ>8#V%-rSh^z??ZvY@=aPbW!-x^1v7cfz$wf6IO?~T8 zKm;dYk;s4}+^`HDt|7XAclYj5L=WqY^&;R!CtN;9WeSZ5hA5MQgPfz#Y zYa?Ux^vPUPSX(8n2#gdn3H}LulGLdQ)EvyHqySg``ou3^fB5B}{P7<@&#%A!`hNfX zH~;0o{@?#^|2O~oKmX6`Z~kxi?Qiy1{G(rgS%3It@(+jmtzpKaVzS?sLad1NBzK=A z5dz7X%3KcO_`|RwkBRp)n)+D8N$DC=aNE#8y{DhOPMwH^qXKoi3~z79eP^#AXAbUi z6Ul68rUEc3s9O&EO#A*ulh^B1u4P4O@7>+#;ff3IQjB`-Wq|7(F+s2lclUko#+?{x zx#9Xt5E4?J=P*(ul6PZo^Esx(B(E0(YGtmQg}MPWdTQZ)#7By2qvPBpt0;8DZ655; zO`EtqD>Jp$a{fHw`gU*cIx>hb8o6Zyjhm0qGkfhDB=N*OLIgjW_KL_{OF_DTs zylnFKIbf~XKO2a;QV2mIGB^X1;g}gfpNT*ZW(v$jO^iER>?-F7nIX11b4?Y}^^neb zjzJG_gF~Gm7b#(S*7nLJdu9j>SMaS95dxB#dtb1;rqz;E6A=n4-rg}>Wqu^6BevvM zhYQBLi3X;G*84YpgI4G2m3^m5pMu_x`aXUuX2mG^*pgN9A z1r6?$IT3tMKWoVj_E_D1(FZt50O79Hfm8>vFv=j(d2yfWo(M+hjIWu_#i^!p94ek zW{joKDmGo$}nZxrBR7yh-DbEBe(KKaKx7KE=t&4a2d9R`|7>2Tba>QE3)rJoVH`& zigl9w>;UFh4p*l0ZPPPqcH~!TAXUUh7=?LtK*JM#gkq4}b;Z5DzWNo^krb&?q!2rD zDY;_Tbj@UhYJPk@V>Pb2>#fmO@_OmOw;ksJSGtPpIL|dAhmk!^`E?sBQ$2>DOJiPG zI=-7AB0^o7K5K1ZB36xZ#FaI**OI0!Q4lLuO;6Wak1qgiF_h}AVR&pNqw9p%4@9nI zpNHELoN)2#DE6-RNXkq`p7&+&`Fi>-#~h|-MT*cZbcyL>ibLXZpj@wJ>$F{;5sSon zenr5t2H}Mhr3o%XP*ZhI7wS0j>`8mAUELyfJk=)xZS|_!oNr!=mOEHb=a3+C?=_k( zyL$DWld&@6RDtmXO9)1F2gQu8&dmGL;4S@3@{B^`TI7gyL|E!zPPa6B@9wGYj96*m zb&%Nmt9r(5dgWsE4~a}z5#aRT@@rREzP%=k)GJj4j@pk9ky=G{xvBE&rs?($OL{cku`*pd}EBT&D zX)>hz@yoCAEDg(ruaKi75PZ|2ZPne?-{TLLh+dLGm_nywLrSkf} zlQe?wW4m^B#k{2z(n_9DB6EHJ_8O(T*Pa_-PmrhTSvjMslWT`B`^0(c`T9CtE0+(? znTp)#X(?|VN;Zn1qdC%WrGmZncBJ0;9`*PDLVj=KySYv->Pl8iEXEj;sHSL*5D7P|#V%fx1jmJY}SAxyWea4u8Y>qpgVYw#r{ihG9* z$BwB7@K&#kI-R+y&U%*3r>E-cSu@`EAtI%gl(A|~LJ7IG{PAD> zwS>VWZuDT>mDq?7B74e|ZtFU{kx*A|<*0&*>)N^2cZ}_k(WkIn3$>upG-5&HN-Z=M zTA;ZizWW8)=5da^0rF)^joVr!f5_5BjLWGx-V{lGD%=kmLK+V=bZ!}Kae%oJWLMj6 z0BNT9G1b*L@@Tx~1GIAP`c;EVZE-KZHTz=p$`IPW|&zOVAJY6(4 zDqI1V>am&dCROZPaaEC%{p8G5(*Rl#2y)Pw$)LM~{c`|sy@{W(4^u=|FCd)imC&de z{J`24n$?5exiX(WVgB@Q|5kthx2P9C{?RZ0@~{5m|M~yofAAmu$N%g<`5*n$zx-G8 ze0{(1-~IOU@4x%|=b7pE`_JFswYY2kG%dwf)kJ{X9UFW12x4RZvcG=)Lp=E~|9gMj zJHB$)FL?j%|MTDexBr*_>;Ln=_&@#4|M~y$H~+`~-TeK(1AgLdHewHNP-#o3Z$dQi|0&I;seEK z6tQr> zsyZ%AdBRl79;?mQ{5caDBmX#cdxp$)>D&IN-xb3VFv;i}l`%cgBXNLQjPL#if(@yO z%MPsakfU&8ODZxk6f`{%m-dq;4t5J%naAl-pwX0qxmMO3kSxW{>KPzOPE^cZkC$!( z5$gH|l4nX5+}<&z+1h-xm> zoQUY}w%5`C#i1~8)z=K~Hv7YFA?S`ABb@OF?ndvmGaji1 ztuqQi>N9(Xnh1E^QBd4{si>tnLnfl-Iu2#H^-{6c-1o0#zRtBYka`7Y0&1-L5DAR^ zBvDmYD41qXQ_Ht7TU|Aj@_FhUDOQ?pMh77v(9c$cy}U`<7MYm_r6+PI*;rxT7P;aM zLddmT3cpu`XPiV#y$8~qq9Z&i4#ydxp=<4s?DZv6@@3!k}wR zV|~oUK~JE4ikWlSgV$*N+5O80*FaCRQS;nLbr7<^m8R1KmW( zr~{%;W#%O>V#us14-C3jLwB3t@-pJwN4?XcN)H;EXvSmq=m1$F%X- zNsOn2pZ(_g@q8^X219H=JehdUiGlj{t#hi0SD* zd#~|2%X!3z?(->;M6Rg!XK=wfSJ=uDr`zT#AG*FOq}WiB19j^zan&^wnKqk14Fnu# z8NUI>X*I*(=UV-pWuu_#dA@!ycSeq?35@+Q3@9@-{hk-q;$)JOxOMB$v_@+$Ky)S! zkj)y9#6d~1f*I@k=c^S-s1EmX#G`Rmn92{rpoN?K7LXa&)0T+~8vO9HuJdOi79nGI zGFE`4PQvyyYZ-=g7?o003BDNXdZfC*W$sV4u-DVNZyFIh*Lx~p+BX7(Vt$uw1MZ6q z!bK5X-675ru%G0577|OnZbze5wJep&Z9{Kr)7D+1wLO-Yx?`Fy}B9%l>`<$KY?enSCf==(R)pro_x0a;M;LvpLr)y^VSx?Pjm=^{C55pGUfb$h-3et*Q z-MXfL2&j8)px6U(2q-eaMt+SO6$mCwD>&p{BiDSZ*frftRnxh)7OZ(npgs^JG9-J+oG5l);v4qDP26 zyALL{+|TgKU;OngwwlR^`Ty}tM_jW{GO8PxK=eiP6e6S5)MgxfMk{?%85q)HFolWC zs;0!u!KA{wCC?*^c+ccwARM>=d8zNAQmE@B$X6q9iENLZ91t?R4L z)yCXtPL8x9-Qgw9fG&_G;R-4*`@;^ifj`n2DK##*(N(hvxW7ft!;dZv3o`1=A4fR2 z+S6A1=Cl_wxJw*fdjUA=xV(DnS?%rIK%sz|TodC8lh*9DBvzd#ch3k4y8trWf?>vl zAtS!sYjgpKL9=OafkqDNNx;fRe=0#l{+@^_RYX+4B`S^V^^P?Z5l)e!hJMDt!Hi`1k+i zuYd8c{@K6$kN)ys{rCU*U;K-I@=yQ6fBNtJ`}xaeKK^w)`wL4E88zzfZ+-+Z z=l6LNzy6Fzuh^-|+5k z-NI-_rKz!2G3`?HLwXYyt-Y3OsF&qOH8+^06sr23q=zMrP2)_x6YzZV>5;rcS}{pT6dTKQL0?4j!5TZ zBeT9=fVr|;9t&XwCvKP9wKiYwi9Fn zpMkC}%xU95K_~hX07Ga^w~}Chx$wC_QqT;N<3UrpR5%7QFzBA(#LghQB*lK#aTTX} zJIg}8fkh) zleAr3iEOV995Hj;nv}R0Er`bC4KF~-Fso}LF;m9zG}`Lzr0})N&05bwRFd|66lcB( z*7PlIb&I>p8KwMKOzlayMuG%}J$041y9c&iCrIXs_vgusYe(a){o};?TB76blz-6Y zP05*yjKyH};c%@znz!C(JtAg0?luF1$jzy~&6NJ{yTetoD{a_q8OW<4r{#+fPh-VM zHQE`CTx&sTCs9C{dFwmzQK3fM;dN~5(lR_|2wW?==HAbNz4!ZmN30$3PWcubG>1#l zeI?npSJlS3#|}HxT;vm40_M{WVf$QnQ)Skn2N;7(T;Z@*_LMW4fe<_b*~ouOGa{~q z*|4_m&dcNFryN>Y4vG#* zCF4x*y;UPlU=3O$-i#zZ7VvrY^ZmZdw=n+J+`wqo!sQj7$nyeZJP7(W!Gg z!tGm=_I}P(f~Okb3bufqJC-gJk_^l%#)SBu?<8j0g%vGvkWY4-b~k(NpXYsSWff%i zpNHY@#UNQGKi-`!y@^8 ze=+4<`W@;Ev4MX2`_}~c^%Epl;x7Zr&gFw?HNzer5fE_ zrdnh$$syyMW|#qOTEgwta-`zz&cOTD*Vm?aPUl`;oe+q?^t3wHqnfp1pwr*a`m(q@ z)9M*y#sv6wXU4Pgx9<}f6l!MW&SwEw`_YZgN7Z*=!!&SA?3|;4`umk$PNkEufS^`q zZU9wUi+#IOcv0z8OMU8jo*4~##fs$V4%~@?pCrC@c`EJ~5A3zi`^HXQU%xHPF+BiQ zQp!fhok0X{N`n(zjh470%c)qOM!aqdo3#B~m7(dJWnxp9Yca7N7C1>Hr$U9wISJm>7a5pmx0>^)O*HEqO5Nw(`*5bIg? zMXu|s03)XdhKJfsJoxeK@AqdinPICP*P5ybN7Q|7{d{N6T8www%_K&-awIdD3G3#w zVpUHt8ck%nPt#@BeUJe=xMN{PGtBJ{;S9G2VrIH)MKZV4_b;s`v-^FXr^@-5i#E~p z^W#ee*!U1BxtP&6*EQ;-HEN6XGc6J;SHlNs%&id3>e{jVJTZa;Zd+Jg?&%J`eGR;W z6|5c&e*E&)_02#0i~r0&3U#mCg}yPX6?d(mY}L*+eNlC;v9t@$hFgM-!N4QS2rJOu z+z^1cQmrdmmU4Meu&h)5jKx~e)dytrrI5LGQ{A#hvCHsjt`#4^#9ii>T}xI~+gN0j zl;a?z??*EX2}yJhGjDgfc@QLi_X|lqNQUC_eOIn>(YqWgtxURu;uETJnfg8KGNPrG z@$)@tn}M&2GbARiiO}>NFO|ctEJjGqiYM9Kt~Yjfb@I05=yN+w@gM)QU-zS5pRfEn)Hy#{`2PO;?=Jr7{jL7~```WT_uu{- z{QL=ir z4z3sZc;Ux)A$e_aB$81*k;_vnF&S*{sWo@QJZfmURKrT>N4xbW7$D+GVn%+N564_J zCqMHuG+fcu+e|LTsM>xX#M+5bt4#R2SY0lAO8rdwqEEXDJp_A0>g^cdUHnbJ1x}NDdq4+3B<96G!|~oQ zc%DXZV;C8Y>C>4Tivst`o6_rafuvgi6Uz1$^G5EysZ#s zI?|~-b}IsFEuAT~D2{5d){0C-uE@b8_4cTazkZsU_T#MrG+;hpB&>7BYDiT0yw7-6V)kB4;R#Od~s!3uXhHJgA zyfdR%X~tQuCC&TR-dpI8zN{Vl)b}70D)rubx`p89PZJDabNe`#!bavm5LjI-<7b~M zB~vNY@ODz!_k(WjXCnwKg`2#d`%drgstSQCG+u#EOnT_(=>&{e9E>d$zFM3fdlts{ z9{Q6++kE`j+fMKBxb+YJQrZjo(LY3bGrfL5tU-g@{BKDm?dQjS z){MBa+rve0eHu<0Ql0OgfU4(fZ~5ie15PeC@o@tKoO3dk(6`Pgm@sjEE?z3rP*^5C zO!j@z-F@WgqGDwl|E8L~mc?J#%uKcfYFT;^2sj%!PJzlr4%9TvZFaobU?@-%x&k-0Lw{5A^?^hJU;zs5BaW@J>ig9469 zNUAFLHrIDQ&mJ6NixXh?OwU?*DYNdwnBiJ2n~(v>Won?qXNcsAtm7n~FN$0d-K~o@ zcLwS<;lNOdV0EonP9>hIy_QPr*)^}2c1XW&#;NV-g`u&FoyK z`gxwJcdvDhQ3hCyIu(K3tG*8+B|Uppx4I%0E_g<^RpNS$;U=SJKW`miGN0~Vh<6H@ zh}ipq*V0#km0x6;ZoOz>Ry?PE29psh;?%Jqn=50jI^UdNUR&gdd++Y*DMu_2OR5Bh z0YTG?!9V`xf95>As~{x7;s`P0qF+?Ck4R|}sRZ3LA&{Rd)@QJ|*-yVmz4Q3QyV}xP zbJz}I7!fJCs+$h_-j%j-@#};7F;7xtYRcdP$Gh%{AkD`Q0=mfZ%)QlK36nRS09+!1 zZ)(A#S+=VB!i>))d1xx$bc4Cbk}aL%1YrifrXVorxe@-bfMpba5OYcqx#*}z89X*E zAQ@cYYT{%TCWj+e|F*9L@yQOfYqe~dHdNc@W#VdfM_O=TP(55stkEFE%QU({NMNpM zHqu#0j#=T2TShy#U5R1mg(a-fP=3vYFw^5fgp4t6^=gAYYyletOkHp@j+z9ydWw?5 z+;Yv$h0MLZ&Sex?&~RDllp;+uT~rT-lU(fXyM)&GF2|V_dC-9sRDBd!^WJNaG3ps< zotD&`rl2j@%wmMGLxj4fi|~>pK3P%%;^Jv#t|%C%;y+6B%I z^uccw-x7Tp#wQse;p3cAFp@bl)>1i$bPBOpLv|=3^U|&gQ ztm<-SgzwdtHtR2gX3{XoR_}}&CDQ{XXmgN3QADfz)f{HP_fn73)QGuI@7T&9AXjuF zGtOH+EZ5?6+wuEB-qM#+h`Cn16$@^H&`f50%upFSF{rL-VZPlgMd7UqZ~5IOsqjuw zGmXjI7`0>tHdZ(Zxc8ds2`0l`SJZv=`n_K&a0S7=fG|O+XM#EJfsXNfk--TY`s9sC zP^VXBQ#i1EmW(N-2TgRYhqp@duD{6aQDm%@SZjuZN+zYM z>T{BEZfkBCA2kX$<=A&_O(Ek$AmT_dP|h?05xII^#O zGm`}O4u&p7CNmIr5TE1PHRuI1Y=^rCj6V%FI3LrAw45nx=0=xb^rV8Ushz8Vuf4v1 z9*g&bSu5*wM9f774QWY1VUkGJB47n z;hsF>9CpysDP)^HG5Fa}Z%R3<7I(BDTY>ZrYYO zij}CU+pfhSd8)tG230jRWq;Pi*)hnhIi_{A6u3CyMq~K(U1xzut-cOh3wHH{gs)kl+v*w1;tKg(}*^?H`ufi?U{CboG}zApQ< zOWSH{?dP0V-TQgqB=`*C_EX#i9U&kiAygNMwGxQaZ$z>%vLm}8NwfABNOik|xJQc= zS#wry7x|TCjk|{Le?;C&;k#;LY5Yy^DBA@5U=RvNO&#|kxt^K`;#6vW4t!}NvpMU!^yF+tP8w@e) zEw0FwV~};v+F8{`F?3(@lm~AQCq_2@L%Eo3uR&aXlEF84_Np^-J~@O&Pv^=3&?4MY z#C{8*$gLS`XDQ{{ZR1a}s*-kE`FcO;A{#?=g`QryBJ#U_K5J`KWrz<(&4Cu5NMlsG zyL;B&P|TdQmbyn;&vpRG4v*9I^|kAiGas3GzTdSUlBd3Z>>p>!_ZxW|w z4GcK%*C8=w}K@O}84}N@VsqCKz8n z4DsXn@xDJ}?P~9vp$K(FY^MckPKaE=U;pB-Y>^97H!xzV8w_z~X2(;I@u8k+qg0e5bt z$;{xuoaW}GFP8kb^Pe+#Zr zW6DmsmDyHpf>V|I(Ol?*u20&X%ZpOj7=kvrBN=roZ|(ng{0*(48GIVIHXG!Kd!2_% zk=&-@?UoP4%W2|`tlxE1#9dAG5MV3-e)eQ-Oq?l@8GEMbk2{Ql!?YT+GexKo3HdY! z05PGqm(|=FsKKa+WSGH@M9j2?xg8%(!8tyI_Am?6y||nGHS9iSmd@VQICS?%|H#!G zV6rRvJj3rfi^||Detl);S6Kx>G+;0SrCf;S%d@cCx`O7H(9fQ(6Wq$^87C`C3oEN9 zV{2IGhr#KHo<_x44B!zzl`bxI9RM@LVzl)P0Kz?tg15uM{9w<<8i!Fb;kj7O66?mu zaUoHcK7%WHHkjQLA;C1?OZSE?^TXWHH8mY%dPu%mNJwoc=FO=_*l(g%ESIYoWsG(I z2hgCqav3_tHXybq!vUmQPHdkas2f)dsPzH#7?d7kfYSX+6KI>|(~VlOpcXE-_`X-v zYdtWI1h=0IimLN$qxkX|3Cx%&|MWQB*ROBa)6!TrlmvzQu?DQ z*xKsn4g_6L-*9#MrvRD^J7@ywc%$(g;?&H_rFNRCxe|p>4kbZqimrSD`ci^wU>ZmC z2(s!lKm-@mbDPL-KfPv{3$C}%Y|V}=Qnyyo>4WrFdTU>Xng&DO0@OtM4U#?IJ2!*% zI}#G({T6M8c0?ssaM}lR4d}vUTP6Kgw#N{2Dk2BSl^J`e%ua zK}KCrj{jy#o%>d&Nv%w_GS`_C0J$W2zn*Iir2FZ{CxeoTU{Jtj3Mf^7|BT3MPPLoU z_R#6b_0H^Ex5Do#`($$7A)C3p{Aa3;;(0=X{Y4=5LVawu$y2>DB67t#sz46fo*ngQ zN=o4D_1Ig)2nE8Iu0OoC|)0G297$I%BA49<$UN&3V&iPTV{l!Qy zbD_S!#bBV{gJ}(S-rST|DAuv73d^K)F;bZ7d2&~2?Ym7QF|CyWp`bJb=t{ue`CIw! zOrJRe?zTRgX@M9)V{r*~zvuhSMT*_CpDzzkE3#0;;`r!o3|jLnbFzHa+(NTl*DV!E zV>P{gy?Ian`sH)wo<+Pq?bu-X9LSV#T5IiGtETqa-#shS_D2d`-*x;#k4VlGl%jGi z0_v%|T8}=5xw@~x3ZT)U8S&{a2-)vxGn!<_XZ3^)ctY-#;9GCT9%te-RTF9F$SudY z92w(TTQ!q=2Y_4|A$xCHEo>$rqNe9P$GeM#jHP;qnMz<33XfQlfDT5iXVkyP`5}|V z;T#FCX-XuMt4_liOZT_nlkJ5BcK3=*MybFH_R{aikWHu5V!ExBwomeNHUztCuWjNi z?wE{lvci8MQ>=Q={_)G#j~{CEg{1PxwT!d!F0%W5r#pZW)+QQWvs-kop70f>?+X;f zjGn#UQ@MlVf*?uU&#rUslDrBlLeWkt@*k=?F7!2`tJiu)P@lb@>f^B)*P)iv6`2C; zR$$y!>8K+Yx?`{Nebx#Ar)C8*_c{2d@=X}Rn z!GJ7!BXW&n4J3dXq4fOv2Y;Qou6*689*l^L2y~qpl}^9?#>%_@(6kuQ!POE*xuRMt zjkm=e`0WSrTsCkYQ;?(H&)2D1yyyl5fS8^jMUB5^CK7XIMzIMY5og4h#F8|Wq!q!N z1-T~OspfKj%f&T{TCv_b!4wVZg2r}Gi0^lDjlI!9{Cl^`+%iQq~y=2S)w zdxn}`&sGZ&&QAK)=nI&f3>Zz%+Qwh7x}Imv6-J`wV8}~c1{vz|PqN#~<_2PA_B4Vx z^E)ZQl${&BNuU*bL%H`>aIF+rJ@;vecoKc&0-X#Js%cfd@ApivXJeR9Ytr$yl`89I zIe0?}W9A~Am93WJFLy!eCJAe-Q)H~jvOn4yHE=DE?639J1*w}{EBe&R)f)HQ@4frG zT4%2{k*FfWzgbBaIxylVgIV1x7Q@29U0664ZzzxnVXt(n0B*aXZ86tfeklYWchaa& z)w333oqCxOHxqF4;4TZBnI{+AH*e(kk>{PF_=|L~W8?Q%rkcN1vTD3^SBxYM4sE%H->Xa|WM(ig@-@u~#q9_!F# zh+Ko z;IQK+!i73kRAN{}hN5*dQ$1s|0k4qixeXA7&}Z)Pf3_LMe#EtN27%ADaSUM@r`#Dd zf+rlOVgMT1pkarp|Eq3kt)-a>+xh(N5xl$)cF(dI8&FIlOh1MAslZfEUxmwgJyGgh z`(6{nk1@v=#oL7mrzxxy-Dn~vBdgn>D{r|um+fp2uYXw%?islfU|$2FfQt#b@ZAAI z!RR)?+dBrB=46Y(b!ifzY&4QHlSmS!aT{FNyvLgtjo|fpF(E1gGb1f>)MA*|OHTKY zmbaV!;L*YXa&3;PDmC*X`+%`xs3?%Ddq*$K`<_|9^kq{sxTpDBkg>t3sT7uQ48oMB z1t5vkiHYCpdDh^Wh@MnW_0^|mQpE5}S;);gPd653 z6rz6bN;8q-ZYq~B)djQT!lk^%q1X?_5z!TPPPQMzj+L6eJz}KkTlXzK2tbkanCwNX zd#|uvw8{|;GoGQKut&Hza*RRAyhb{}QQ~CO6fR|qpx6F4AQ1ANvo5`oVdFntO zA+t8=!`wU7V;qyv3Be6v)}tX~n`O6qQ=BUIL28rjDA2Xtgd4cwtw_5ZYKh&acO;S) zvNMxjHPR91ct=UBz3P0oVK@9F2SZ z9)opuuPK}V?xX0~H6Up{tLw5IrH*7E6$`Ntf$noUF^a?KLGH|frWKzHXk?fX%g?hx zu>0V%hzw6YD*E_SEkx ze_}p`Wpya#vpCa(?uxanGS@jPbKr0xt7c`$cPRl-MowU=b3YRHv(LTtyO5*Lc{$b7 zPkyy}Lc!&7539?t2(^NeVVQ>NeF)Pn<*?BUoA7-+XSk=%%l2)QhATpmO^J_!nD_KTN6|3HQ7e%hIJKQNzMR#Rz&?~pS z8a*PO!T`H<`|UzSL9o zGBUK{E4dcQss>|5`8g%))O2N}$&g8%5-2KHQkro=TLOxB{3I-|Ace$u6g=X1E8PDhn|nqA!6I*CadKUtiN@STkd# zYerYrDVdQ>nDwJ+MW~1I`>RA&0^#*7P;=>Uu6ZM(`;ExlTc=|M)bHD|NavNEF6fd5 zYyJ58H8Ovid@u)y90>!4q-Xz9s`q`T4$omK#1*M7KKp$;*R};F15#6n(6k#OgtYdg z>dMG)S&(<^J+V^ATQ=x$_$C3UnVBlJ|p5@?`g&k%aP zet`J??K_+l^IIpNf$K}BCX*n$Pek@iFmmnc3Iw3xB=WMfk`(3~t_2Jg6JBXyjw>Ai zb#QfeJ_)dEt_N>X(-?%~ist1c98;xczyVgS?sBr}>+47N8{DVfoxAH`=g#$>_95S= z)>=l(R-Yg1nVzAO7mnMz_>%}4bFYm z5_`v3T-PT7JohT+hvhD-f<#QW$M~SVw9%TC%bu?xGEmP)6l$c4yfKXndpQNL~lA64WAv+H{&XHd5Q#|||* z%;Pr0h|8E(DR>m?>(@WT`gMYc=z95wzxW@wCNd?3%!76|-}`c10iJESDT8rdPk>r{h?jQQ9Z7SK*N;HJQ4u<{Z&40gX?s>uKx0Jrwu!4iiN z1h{U^CPRRNrkG1s^M$q6TeUI*VJfXY)^7_dXe&un*Is*sQSY^@I)bf{dgT_JO;h|H zZWUHU>)Mb(sR{bAGdMjkj1^sVH%+vC><(Xkg^XFq#*BcaS(!Zw2SzDK;H{4hVPNj* zW=svk6-629iFC?!9K^`miy)gb`pn+hQ^D=uCg{ujTqm7ciuEu=15my0^C{*O{Iu*o zxXtw7n0~#ss=_M1gYjKNW=7i~rb@*Gq0Y6s46`%~^LqItz(}wKRuD}(H$;n30ZF-6 zs>dU|x#vd}@!ZCu0W%h}{F@!w$ujjlh_!OY2?rz`qawiS&RhmoLu6V9p%de=*duDx z#C9f%44(JoTK*tuK9IKSI4beb5-Ee_B5Bmu%iy7zi{bnz$AZ_9+J4JFX#k zcBJ(cgC`Os(2x+8ydstmD=^r^3#m`3Cz42zJB$;<-8L|BDUs!oCypB4^o9$R0iaGJ zLgZ!~m0gG=8nd7?6u@p|A|G-xmkdj{Kfxdvvbq?X>Rj8HM+iN$R(7>l?n6aHG8n4U zMvYi0>lQh~NhZ0b3%Nm>=y2&5afeK=bh9~Bi4v77<0 z56z^7U~koVT5h7)2GfGh)hlyxgj_hC@>egt2#1Awbo5SLVFn}NcHkODa8%=_ zZ42Mb3`Eb#SY6FKe}J1%%v6BmT!?Dto>BM2ihzqOfg0`$hjs}p2I=^s1T=H4ucr^V z)?{Fi?LAU!NqMlnTt~I}^qiGWb|aj*A&3m2QSzep786V{ z1U~!A$(M;xi)dt|EEFEpnHf0V(b#KMd%CpG8&&|Td+$9MmF`R|$rsuTL`n^q zpoGAzCw1s)q*mYG}Ap(qn@8X_m5xdyj~5)T9F%bdLY{*p-=AA z(iekMZ|6?6%y1mJ;i0^`;9dXR@WCiF%|N*025b*?UIt*GLL_RiXfI|eicl3Y4dXy} zM8K}49aA;BMx=;1=fw3ZMG!uyq*+f?$*HBqsNdK17!D=v6)&+D&-cW1Fpqs|8QpD@ z=>k#wMj>P6Gs@h#R?1{tGYpN-rx_^FZ$Hsp=j4uC6%o6-Ei(J*i*Pk5r@8#$xsV3t+hhFc+bex zfKu+HCk^7fCs%qqE(#^C`{z=($IOT^0lC)seq$||oPr^vrk!l^_}e3&32&dpIQ8!R z!_erO_TJy?{fOv#he&3S-}SxsGu4^Q$e-s8rkw&SO+`peSNDE)*H!Z)kz9>e2eFpO zz!Iyw6H-qmeW<(|tz7x__56wzesb1AcgNq?X_W`assE5;)%v>y$ z=OrfU`xsf^6|Rf3GE(hP@G3$af&R7#zzmwwEM^HYg(MXDB%0GFgC$!kDC}NDnYVq z)|1n62wbhNujjY-I~hBc5Ut*s)!(gqkAHGa@SH#I`+HXB*8figBCGjcDn~3)y{1r74DClSB*`) zr!tt#q0q{VmLqR@Cpx>lBD#i)Y-)?YcK67?x6GhDYK@)z7Jh>v!rsV%R_3(LGU=kL zh*k4aNMunv)4xL-(gs-Tu`#~iaxV^g`qPVz384)Qnbz9qh6uw8KSXnwlTMF9i7MN~ zJPfS~ZC;oZ?%{;tqG7s;mCKY$b8fAab!s zf^<pIm;0xYj_@g!R zNdv7uXN7Cf62a&mjLXhvrb^62=86QvDGaG7b(efViBhk~(`OjzD(gGc+6mme8G1$F zblq`hx*=a?><}FFS{oLp34AYwqB zGkt2l)(&vy7{@z3zB~q&R4wjYf|C5McVX%J9WCY|GN&E?G2QP*Y$RsT_vgLV=|%(T zXVSsQd7ahl_a(YdXXNBv_EPpY0>AUmf~F!a@-Cm9SGw-t z>{Eu_x|`#o<;Vc4JNA+~x$G2}=?`HIDsiE^7uN(ez1A|`sISu;GxOw+e69dNMjC79^X~$yX>CPUcLh(8KtpkJ6DcZ<^yVKV%>fj zL`t=C_w-z_^mx%hvQNnYz?pIS-X}))UJuhwlR!>@8iU3Xik^yKjX1Mcy8pH6n6wzl zoliu{_-o<}k}UM%(kK?@%%INC6Sw;SnP_p;ivbvQXNLeKx#W?c{9!YQyMdjmarf3> zR2{kG!iT~0>>>NKw<9Z8ofE+^-o^}dULz+XN8$_#Z`b>lHxKap(wif#%=f$$P1uYK zuT?TKKBRDIu_D`F4PgV`q~sV|zzUFQkmcS@%lmR2ncu4rZ^_$D72| z1tJ^0!9|-L21K8t8zAq!#N)N(t}83(z*pOW*kg?YL+t1v~I2v>#Jic(If!t62{Qh2P!T`zWJ`t9xXNBt=yrs)i zMQT5f{SXk&G8F;*xsn z4L-z_+7x>J@h|^+?l2uC!U2(iS5m41GBaxWnk+fKQ`pr2KG%|Z@jwua`x?&EeJ#p29Ci(>mkD4;3oX^z{qFu$bBKJ6KsPek z(<^f37MBP&4ep{$*AlD77!)vZDI(Y7^MTP`r`}CI-HrJW)F5)f1_5bhwjepf71bh@ zKn*yG9n&Jnv@zRAc`)x6B%Ao)nlR;^1M+>}+?nRN+nsXpxc-?>&I+6z44j-i+kUET~~0_=&E(***^k8{P;8|t$)npUKU)vEB>s-CrOhgw7+-kC@@WrRH%qWi48 zLJy}OtVH;TytglnkUlbR>da! zmxAb5$nIJ@yIhHN{2V?uC(G+m76*J2IudG!!d8YJbjkOX|pm{R_UX zj5ytEB}4>AMFi>Cl6R-nz|Pi~;r83k?_$#Xqw-I{^|(H^uR#%!HM26Q>Cep__#F+7 zPhv$i9SRT{-!A&|pj&OdF4>EF41~1~ci%)#l``YfM<-&r&DauYESNJsU01YEfAIX_ zwe#rSw5ux9J`&rQ0FnX)+kOZ{(D|*8)l3=LC9xxxwIcprb4Hx=9kC^m%2?CoHA}w- z7rLJ?pM$~H&>men6n63Me$d9Z>0vH^NT;nY;NszNeX8spd7W?b1y;9T+MPx279Q}|~9Z9O< zO8KyXgS%Jtwe=$+#(Ry?iY&FH6^oyO=YbWUh)jMG`}cOb5~v(;fgBw-9&Ybizy@0`RXn*n~3f*x$wrzkwJbPt3 z7t-Y_xaylM^v87Iix|^}zRbaBgh76SBs8hrMnPrx-pZIh%Z=TMj5TF5b4lPJ_ChYe zn*=7?i5jm}U_g5~_u}iZE_~*CS^XIlK$?R~#-QbX&YN?yJH5`k_VVI6ATXyVR+frN zLL;MO?E1-EKbVj(4XRe=`<`|uU@{Pw+Ith7hRVTzti2z%`RbzzVvK!V#}y>ijOeM% zK%`9)8CbE0$FMtG`o>ZwxsZN2v~3fZKIcO)@oPs!OvaMf(|+E4p-P4>I?Dfm{-NSt zHYub@Ljl%%7>U5nIQ5}X`QQ=6`F(RRfyEn6g-e!>`1NG+!byQIv&%;6_f%(Q1~eQ^ zt{f3lk$I{!!YP%JHbX%tt={u~J-Y{e`cn@TT@wMCKgz)EsbnIIYn716u4aZyx%RWs z5=@stK$*O|$AO&I4^Ng$`3e;8d7u5%NM667 zNm~W6_pTa8PjJ~8bsLrfRlQcq!BN5eDo9Qpn@(LnJWS32lesh4-9yB<)ui^<)9qSd z!RX1cB};T`l^f`DwNI?;l9-x~SazevT85Ft#4MZ71?0?RqHEAK(`P1u1r9?~lGa`l zr3okXob^Ze^(JDas|n(~CwJby=}}sRi5o2k0HSITdg8143})}`b$Xo^f$p`wE{?=m zmcDMB_&m!52J@^RHMi+cV{JlUj5+r%pCP=nDYs=IfmU@qyWUDbrrr-S;zJn|8O*5n zFf)S#)oFOc6I_`D+xsX9vA*^L8+iiLO?+BeHP(YtU3L2Hn(uI_s&cJGvd>}041ivd zc3Q3sQyMOwqRTbI`D~TC+pN5Nvc5||IGydqiIi(GIKI~r7=?2;mxVYtm+1S4Y^aBE zGoJPY#&SEsZM9rUXOAe(9c{&hK-6?FW@bh72TnLWgfgNAq=jNm3!G4hK<1p+y?r%< z(cWuj&eRjBD;_M!H8L{n*{ew3*Myj0U^p%=r}%qeEA^2tFL(>lcM$brbZ<=e{CM`L>)5D)$iJDK#~IKKSOh=pOGBFFK*ArJ#C5n%AMZTSaR{5{!)27 zMwmoPfDHz2L!qnwz;OX_qY17EyRXp0wau!*y@XlRMVGwUW#$E);^H8E`VcuW(U-Lt zv<>oNbnvko7>4BjZj2pNzPFLduFeP-T_VVVg$)I&YJqtP#9=kT|G%RlgUJXD?NXt~ zHK*m0y2rMsc}y$Ub+LKYH>PQH^(sdiuC<4pF7t*kBJcFAQAV1Z41Y-d*|VD$VQ=KU z2-~f26L1hGA~E>FK!rPjNq#wgBGBMvi*t?r8|Q62Lef#mtCqdw|(fE3BhYm$-IS zVn4JF44Q6kzt836Fbq7Fl+2p84=sb|v~ytg+UCdk(sNO@v~mT*u=0wr0IsHF zuSQi(f~^o|U`TX$x9zEF<`Zk^jNR(Iu0vigx_sIu*fsX}Km#T+@`5EJV`ZK9YSvyx z^{n+_UAx4MhH_{i)Z|W8b6FAjWNvW1mnJV#nG1DZ0m`Je{LT+8X*_q$># z#(+qS+>(|ht$=(A+2S_l5h{`*)GcQ6?$6Z}`_|EF7NQ;Dh{U-6H9n)3zTY>={XCIr z#Zs+0FIRL`CV*VQaqP}EcfzTx@rx((eZRkA8@OPG8XY~eY!n1=W|n)S{Gq4TT2)7% z4|C*(p(L1eL)UayX9H?|;t0qhdf0F|tV=-BMs3bjk zUNAwGetczh`)6nqga(n@Z%F&`ro|NzQjK@(64w(M+ooue_JS#f!?eT5j+A~mASNP2 zsT7f!IcSnBAvpjBxp#m693nH$>HTcKdIQm?MC`9GRk@eKE0f=@h8jq_L@-?laBUlM30V?^Q-m-l@l(%NUC-Wi4v=2w zUDC(BXf}|UVrIYd?EHRDE~}F{7;hHs?+o1U!oU8DMGm-l9ztZE^E%v3Fq4?6=3XJl zLco)&r(ME0K({Nx6^sc!>qkB-n58B#863{E&FnE!a%Z+Wp>wL=ciL4L3XAXE& zXq%K*?jgF)PIfag1FmqAsisWsT<}hI%}E7!(tZSq z5lqfGh$V{U%!G}W`$CQ)5z#9m!ztzFZ}m_E#iwKns8n`%TVv>89&@8@}De4NZpl6q5> zOWlk#b$@y=9n8l3`1;XjJWsZ;xfG3Cc66QSxkAdBGd;1tLU`+YFOFg{UdQ~I0C#E_ zuJ3%-I(35ieU3oJM6BoQYybGe-s`PbTHR&+lR+_5!*n!o1##ZPU;pB-aJ7?r38#o~ z$mK4AqA{TWG0&T5~h(x!?*xL?R z!}R+dQfMXsH%>W#d2dRPqbtE^4yFaH2uWi$wsmPKGBxdbPzzQ!;c!!Q3Aq(-soLCL zYft`O5!y81Q19aJlS5bzu5clUCKw=$qxCTpT6y3Eo(dg^&ROebI zZdg$1-x)~;2qU3!|C5A%-&~KS4O^AP(cC;;xasmDdp)qOPl+(d`@iw$&)cE2(v%5W zvGX*WpUR0@xh#A6_ALzK0W?s^1nn_L&?+J2HrDce)$74r*78!*;|reRrfc0W3EP7c z9s^|{A4N*DJ`}VSS<_H2?#bcY=4h{+0K>mT)38Tif^zAAA#J9AF%lTYQja%wwrm7= zrqgJK3?k}$XMWl7a~)twBeBgl)+pTF2ASvG-O0R=W1~5*N=N_-^jjjG^kjGf4hwp@ z)@bOik#YMQN)xb`q{&6J4H{;$&dkm|QxuLmBk66EJtSg=En2(?eb>`opr9hwRMAA< z4BKQ8b~0M@Rw%r(!zgm*ozuu<)r6^j-H2t4 z)7Z9^8#Y1+{aH%;VVUN7Zg%5TEi>wU?IShgl0$JYX3Y(7L5cUk7nR|UQr}k>7l{@u8~tbtGgjYvZhx!6Kwk4Z0L=HC6(c7X zKh@A)J1nHD@VPSz0i8kv3MP;@Z}S7Q(1ACmiiG%J|625wUpQ z`B=Mc$%J~Il`U!L7}8Bw?iG=Y{1h!7TwQfE7*x!P2LXp7!=8~D?X~P(CF8vB$|XWz zM)ow((}-jsW*U3-JNsGF1r32|(cm=YiO8M%l9Z>Z{yuKr>X?|kz0(}Etv^~3-Gh)1 z%t%aQ?JRe7Svz!OSBwmA=OU9pkJ8>dU0YuStFRWj4aq_7hXLjy0@Lg3nVxfg;~4oD zq|0f7UD#XjI@wM=B-hwO#Bi4?q}=ONtytFX0cyI*ua#vBH{_%@0cdVHg`#r?vEqqs zCzYsCq(hhNJ&B9=NjxQ{@l6y?(hYIf$D*@xb(ZW==mC$?)@x{>NJRz zVX0wyrfaQzsy*wDT#o>0Vn5`zsv-q55(K*6V*?{E@XU+AxrtHNV_c-9Z{usKCxlTj zPEDpF1M?AuKU-~yfrvy;n>vYM=G}shD!6n*DE1$CPa0AO^K?@aE4y03wZ9Npu>noP ztv1_l{_Z*lkVVm+c{Y7UBGSBQWD=}8E7s|EMT%+Wk|WRwLX;>SGDc80F6{`ObjKme zymlkcWj%g?X%LAVS9j}VBu71+NpsN5WDSrz`gnQ?kf^zzfWUMESbJ-x)kLsS?7hE6 ziv5))crob$FON4Wn>1CeX^)yYn1rj8tS{uKg3j0Yb-ZH1rf7hMxlTh~;yPvKttE`v z_oX22nJNZDQ9Y6H<mAP6Q&Oy02ZbCYEmmaay@@J-;@rD_epfOyJ0F|3rW#6ls>=TzQC5 zr@EN=?B`E^`qN%3GmZD2o^%V<05p-qoj$NvL3Sbw;$&>8d%QCqcsa;Lj#I)O#=6Qg zwxhwhm)UmH%KZN_^#?t+BuSDkCZei#BCF<+YXURmhC2fD79_y`|CjiPsl4H?s=|fX z$z}uH=&tIUbtBGkb5l`~PwH;AJ(ys(x9TihG_(?CJEC+!kh?-v?#}grDKd2zu-=07 z$W90&;DX#4xvs>f!f)+5qu)1(JfG=VycE6n90AzMBO6sjfv1kBd0O1h=danFx82&{ z3$kM_5PCNRq{W`RzELXkGvn}DB-GE$4o-!8Y+x&JXV$CrpIzzWL)?&apl20e{>0(u z^RHwev)^fKD!^s9;yGG$sx7z~>Y%Y>=jmCZO~m-DpZ6Z;HZ&I@RS`;&3ik+)P;;A#@Fc7@N9 z8D-*@k1M#AD9BfnS=eF3&YaA#%g1_^wJp;dpfA!AD`4P4(ZyyIB`12Mj;v`RH+ke) z%*G^ItAXClPs%CX6~i1SrCSQ%YefhRl(6bSB}7-VuL}~dyGmdpG=JWxv_5c)Xf}LV z3;6*GT`2N~G3$|63=;&*Zf1Co&#%xhy|?>G%Zj)wUnj{;kiLwsU^ri+X&0hM(5MPe zPt}=jzxHP5oa1rXX&wkOZ$==}>;MM7q(ggWl%#s)KBid)5lmsI%+!t)nbF<2EHaxD z)}OV1YZ>E*swSVJNI z-W|wyZH(6Md+lVPS07u%kxq1H#`lsD=Po@=qFW5n;8PP8)qo=Df z;Qi+~6j4eG98Bcy8#6r1jwKJ$l?{Yydm|PRGX#_+jOP3XCxIdtsdGYoo zHQg_oznEY+UF-z}2O}z(`wYwe`0(0HJGdWs%&h;^r6Gdajl*q7U^;DcF-&ySfX?@VO&PLduJ0q(w-?a|wRR!ZQf zs%Pz693j&-0Lw+US67m_#q-XqSr>|1FssU$_S9G8Z+Apd4dm5@v6bfrleIfr=d+Mz zs_K2;2ohYvbwtyR3_oj5Jz0_v>7MS{-hOcn zFLGEn<43XEn*g)Ofw0KKYCW(za+?-o7Xq`6cY$=Lm9F)bw}|PVtQ#nY2rx62-_I#9 z-lr|~@rFjC*Pa(?CeQI8P#Has2WLYo`<<{`fuK9@pxFDU1*3O%HY1s_yEE_Sb2MaP z*UK3CV^VvDS?@k1AyLTQvB>qlzfqZSdf!6MHiHqIo~Y_)&QH#$BDx*yqXSDmV^Ii19Sf^?#l z*K|Ko=}?td$j7aRym8`U4Q{_b;$8?6p}~ zxr>VIUZhCQJ6S297;Uhhd0Y9NR<+2SS%_I_3|^IMo|IX=F9Gk1?m)xwz#O<8PwzV! z9t!RS(LRTsIgEGv>+n}bfh%6LIL!gwnbA2V4ZvhPYfmEY=_6fpUwo}rL@e_p#I<)c z$cSmTj;x0RM-9VXN;& zG(_En<1LhyBC7W{WW(b|d{(pbWmNg2y;YGboQPQBRL&~ah>Ue15!3wK&8Y5;V1Qo5 zyD1>dWB6tOz4VJnJLw}iquYZ9o7Hem0ij;M2Hon)!1;XMcW+XXvrjYdb{lHBn%(_5 zKfSHZOuHb3jX)rFda`n7S98vp*}LkWb+$MwZj_uc(@r$(3`pJHc^_PE8)sxhCYTW^ z?({?iXa4;DMyzjvW}Oj!odOKQM}_5x0Y>cZS3#r0#StkoB^RFGosa13XMWD~%LvXQ zz9RN6v+DB~;1_PMt?9^q|L&exL|h^|uuHFAGZ`z6rXmIGc1Ap-Pf+;g0f3Bb4F=3x zWI*_~laXfF0}f4SGfIG{nK@bRlw^^@E(Ep5&d4$uT^lSIb=CX4FTI4rMMpq%acg`E zquDuGtu}od%Gs_Y!XZ;7YBfyu+wx|vZh{iP&Sr&n-KG~A0;V^!5PE-~pP!$e&ZyM{ zV%DujF8}sXhKORM63$!6s|d2l8O{DC`TYI{KY0LbKewz`hRfX45p71j1i7_bGban= z>}c=zVb|$}yN>Z?dEIX%X2ec2vZv{Xj?Q<4^XCI4143l1%fYNRI?Upnc?PuhFFMsS z^NvtR_`VQHXO~uMwo0Cib3QpM^>I_zG^7QE)29p8J&S0nK!TTzT$rMM-TrOV?okNoH zRQIIV+f{W%0V%<^ZAPA|^LBHgf;Z@42Ud5Uk8Gs0UK#v)fwWYtA7anm+}+BO(EXV2 zlUcjdtvb|Navx@%Jiq-CYeao!KEIFm{ii-}zmW(Y;955-9jxXqdbenbB3JEpk+8jy zyCYjl&#Bf@q#;%|@<|)wATrm>Lh*T?WBX4Q?iCx%eEY5!(6#whREmrO#}X}&XM&waXz-vI}ja?QbthGXm4&R;(h<_w^JHzzc0zi+J5UC z-}HUol^ytu9o6A1s8IAg{tciq5`1?8L2%Jhp5wFbb-Ye+)AB7oB3;Fuex@uc`>5&n z{rT(Xc^*qGqZikRs96LDx4Jv9+ue0OJ1-*^ICl)(Yu>Cx3(5ECI>&A{u3%T@>gW8d zF3RAGn!8zHK@lYUWi)k(AT;Ct+3SlI6IkkGb+;dXU$rPy#()0)`#PF^p$4VSI3)i3 z`TJjg{ri1?$z+Db;L6hWf{ZH{1U*n{=CvU$ZbqKZ+n-N7?{e|;@4tG6b|IBPB47nx z8=4fSq}X|b=^MRz-J|{a>+}2j5H|iZPi%Wk@)g!)Q#2HKZ?DnR=j;knB&Iif*$Vob zxIHA_*`J@EeP0j=PH(@@Uv(z;eRb-u`1j{uKmToK9j6#0-UbfyIp^N*p2JgTSJ>zI z{qz3)`};mWr&4tl#4n7TLEs9%#)hadh!o8@?|pW@^T4bsI5s{W2i- z>#~`sOKFg?bhmPQnCWL?W^Mzh%TAmYSPZV!f+j=w%0}2rmd0>6%#2$=j2FF&G-GmBSvk8WbM&oW;MH^t2OUkaAdf~XTtIHv!zq19Ri=`eQ5ricgGby6 z8nJSE1K!H|nj4Isp6$>1%a4@94Rg~h0Agk9)42J-^IQNB8!~=N5kLiYs^%=P3zCn+}rA!au&YX&}x&4sblBPh!WQWwh%u4HD@-4l`H$aiFty<-;A z8s;+1$XTUzD&wL^gY*a#v$1yp^8G5i8(Tf7Ya@uX_YcXGCelt$w-wxmZ^GfF$w20d;%#ol{J7X=(u-&?f@bDEZAow47p3L-{JU2bbKpBWgxy>0mLYNSn^ z-B$9bCa#~K(A{$*yq3QHF5Q}i2)bg{hO$c)jw_jp+G%D|E>6L?{E+P4JnpbCRXVj} zpweP^zp)FXb~CZ05SmG{eKCa(@(U`y@A9wAX!XQ8mTe~gEYB5k>x->A_?j){s0EyS zP>2v&)NUYW8xd*SM`Z6CaAQ;&Hj2pA{DVH4-cz~lO>8JU0y%E;c>A$eWW9_bA0UqN zAfmfZeRdblJ3(3~U==%r*4hANet(d&lV5D})d{{_C7(l%*j~4}63Ha@O1H3`r>U}} zz)7afS-XpEhMBv01FYYK$jMrbqu`XWWmgj?7`kP^MuDtP>xfZXyHI$X3nB+ytoHa9 zQpEIDMn?2JChJ!Hz!<)9bpUyhO3+21}^RItdO7txj(DVe>^Q#EhC-Y_X^VD_&fGcubtfV2r zjHL7|4y?vKBk-!*pbr`58oa?uc28wB^{J0H?K3koWri_c_(Vx36pQ4}M(SF?c|}*W zvyNiMtWso#)vO)_ox0uK%{-Db0VHc+XaXb=U#p@}0FN7Fk0;s?QGqDc*fgp6v&&Ef2*2;Bbris;Nju z@7k*VZWry$qNXFlXGxo}b!+%=5lgt)PCvJI{o)fL4%IFnS3uWO z=GyH&rv%Nd(G@{wQg7VbcfBCP40Y2Y2hjU=Qu|1WyaPUYkLh$S^1HFZt}`@SHv4yB$B5|JV6t6-M@;MbDpn}K&;jwKG#-nXKzrFMIFhM(AG zW$+xH@-20C4BYeb1)&$b6h&bp0|@R!#z)^Lzy{_FHJ2073l&v)%&$xI_waN+X#bpSbU zejDOD^K+_as#5cvKcMqDzmJoWo&&=dKZ6(7Ob@^ixy*zOk91%v>zsby`;!0{@hKn^ zyP4TDLCibn^O+q6r#I4Lqnl3oKF|4l-X0P`|HY#*5Q3%xH35lrDzftDCzvza(>899 z^4{!v_LT7+d{L*WmU@&aP zs-WPOxnRY1M?_^f%jq9nKqk5Ir~m%M=j|u5PUPFq%>MlKBl4O4ki9xpI|IW{yDN)C z&wPUzGS1^t5Cw9hPQSl_S}21NczY-^Z)}PTZy^a=O$um9T6gJfeOD? z*MD+H6|q__kurB93`=omDX~NX-HZ~sS|g0iUI}-jtl9P9#TYcFYP7hxP?5v{sqpB) zSZ;t9FGX*tY9w5L4->7WCZhbYMUel0 zE|0r#bKz)TYUy1*f^hT)(v&ACN4>=#C_n#dItOYo);73_#eo=bVr1)g+gQh<+Eb zgnK;szHb`pvqG@@J@GLJ!2e(nyQ)g7T_Ack=$@9qM=MbxP(A5rCOay4D5U ziUmWM3G6EGegij~yoY-dzf^!LvtE)(2` zoF$X5<-Vvv7yvcn$JIG3 z+afJ8T6ekKG#2YKW;>aRf=6O)xUkPZkMJcg+n2&9bR$#A@FG(TV&C^=rnADf{oUR5 zh#6V6{VW|o)oL>^NB|k!MShNL)?eE^-fl9m4QE$z&62ha43MyhdZ(tf9P3?jBreg% z)hBuVSy|p^T@xLnXN;;^4RHh|*1H{n*be0EMi5~{b`r7vZT9jUx7j8Gl^D3t>ivDl zkhn8J7pcJcEPnIVLAsNL$$ls7pmgNZ-X$O^-}kA^n_1*dcG6#P#HcesxmKEF3Nv8( z^1~2ahGbtJgkb<1qEaxVT4R=jr{Wm-hZl)$;C?GNQ5(>%t0LeU^J(+E!aQ16dFy95W&|BlU9Ux5vj=B z0fgO`%q1c!vzAL&Jw21>^YpKJMBgsC)Vxn5gE_khaEL?7PCzVTr+Irza;}DM28SW> z@(b6cioFvCNG(6-D7Yje6C4TCAp3cOGawg1Bx7v-b+s+-Dq>;B6R#J_W5FmY9H7`+ z#u+nXPd7J#H4HKsCP!Kqbzt+EiLk<3l|M?_?*kw-Sp40;>N!v6hAXqG6BjSC3Gt1B9g?Rs0dqs@q+9CvDDo@nGLRAfy0X*{rzHlvO2v2ur ziji@`kHQ!37J~Zqb2|HSDk8ElBe^vXw;(LTn_u({MwQ=om4pFA8PT@|PoUF&7pA|v zBX}ca0w5SxUy=U|@JARyiF|t`RC#vQulAF9^5<*Mj`gL44vuxdqt(u91<{5(z3X`F z$r|`A>AxH7KO%NUQBlG7dEtN92%)Oa-~a1BpP%EvVlpjlDXvB-fl_g}a<)V`vO#5{{*{*y3e%a4nM-~C;HDw4=N=iG|GsNR-9EQ+b% z?(@F8uJ_tHwIIJ4Z5U-3Y+bI50rPf@`@eV*REo@u*yZxYaMV>NK}kuqzefKeuAyvCFNol^!9 zNN`6Iyn~)a+;+Ltu0nylu6%gCC4i%a;`8s%;ZI~Pr@OVKfGb~+NJLQ zf{J-xW&s<%Xla}z-f39~##OTs#7vyRa{8^RFIABD-?zNuW!o|$X8Y&-%yer{L`z29 zNgYu;>tc_UF6k^oivXiI3-0Er9t+?OW9;spbNm9$;0(T%eC;}R2A#;;@qX$XlwTly z7vRiR=4ejD%o-&Sj+&Wq$}{`wewRvX1mW!7UrGkMn+)ydInVQE#Ng@_0k!En42KM7 z!3!;AX1&wM3|CtKny0E}I+TN+Wo9r^58g`(#ODvEfJw#??nGfV2{od5hjC(yH}et4BH$YnhMc{x2! zATJktlRYFy{}||HHj*bYGlIX{Tr+Vdn6pL;NxM!nl8c#+I=Gw^8Q`W-m}7ktGH~S8W%t+d1%I)=neQMG zJ#QIDcC+TXglYkaP^`Jd(>77uc#Jo$w>j+FUADTl!ImYcpx>#8JeoFB(ARY?HV7!) zYXAW%PmG4D;%-q#b9m$)#&7!gd-Zpdpf73e5ZaY-0D14kUh{#{2;wbq1MU>}{dml4 zcJ({FiOc;`_Hb*ZkmkoabLF|6F#yzAHSdzljCY5k6MUvce1poVwH>MDxH9;5S3)=r zJ?;v-Rk^!H`5B8dTuPY-9>vE$D3p#RtRsyO;bL7lX6Bd!xfpvxbc^tMChd(UD{?Lr z@OGd=(K{zXgm$r;=hO2t>YkuGLneJuzokDJc>7)HlgH~wBxdBabMI!*$3x;>5J{Zt-3CY(`wk-ELzCA>A7Etm`#=W2Ad>wq?5C$e zmF)m~CHs|It>LwTxwhU|$cY9mFg+Ey@VAm6qH3Hk2#q!zpd`t#%{RSj*iD3X6zJDc z|Mh(hi1I4id2Bz@GyML??=0Q*Ww%>^4BMJa-Pm^`6BT$QPGr8V^U3KqnBML90^yU} zpfoyIdVwz~qaji|`Z=esIZMn)#rGhY(RhmW5?>eh>_;DDyt~x$=2`x6i`brFkX-s% zcD_Rcf*Ou3)4W$iy(t%pi|2vq&bWlX*=dW;<#L^>1%KIF|LuYj1%0D-isZD)&1>uT>D-6IjQ_8n7NS{3E_T@+Xo*~Ku~|Ps7tL1& z7SybEb{5pWzg4wg0v7|`L!7+6NTwry>*#JoYydrWf%;%ySGbUsu`@Pm&hDwx(^{RX zwh7TM`z&Oxcq*rDc7D_|8mRPnQ1#H~w9TNZX_wEakOp+F`bknxC%MAdnpUjr#Vb-E|Nd!61saem+TlugpM z-@c(lQnQT6tW`(GJf7DroYBepNc7vYI+YAJuGUV+In$kp*51`4uy3DpWPDkKc9*7j z0+N@ACjvtj-kHS`N72bsc>u6#7VFslY@JA&oVb79jp6Lyr#L3v*rINJG{j){n@lep zBiSo_>wN><@CWVX&|bTD7AVbTh2@I(eJk@;c{p`L^Nzsuic&pI(k05E>ZY+`2EgS& zg;9IV)||}ueVLWy%u>itt@AGd>;J-XW8j*RFML0#T_-E0y?C);T>=BI?nUl)DOCxn z-;O-MoX<~wKBBPs`@UgcpTqB`=pMvb?6YGl!(KR4?5<9ncU7t0)oj#fXSJ`3l_N~i z&UfdN=jz&l{+&n=3G8Syj(jw)s*wpSj(2j%Ir2)CZ)d z?e?2~tA2LhwX-e4#phuz8!yZ2nKhat5N|&}=NO`3W@uFHwyR6d`RN_BGIO=7Nv43z z?CH1r=X`dDQKa7n{8T;jXL?Vbo{lVr>jQSA8AVnE?t1SoTGzuUZ>2HkHKxEnH+@{} zvxpH7*gGi3?{sDS)Q_t2^U(sC{l3LiuHK~uSQlgmtn1D5CxmC-(0&ou@R&nSc9;cE z)H^NfVhpGS&h*I-GIn}26{nbk*Pr%&#nm9)aXvj&<=Pw{>C8|MlK}c{Mue|-PLq6@ z_r@!bx$0eH#;MOc{Z$ZGRIory-$I&IXCBSwDHFa(%&MQ?id04*Y<0J9R{`{W`2-R5 z(Y#;(qq9rZ@9(LP1FT-N?lzeWSCGNaI2?4^djXxdjcAsTpPJV`*?gyi%!u9%X`ypI zyV5uNhK%`rK7XBF8Gin}?}@y!WDuG1kxoo+d}80W-?qCe>CbQ>?PQ${%qv06*coQ2 zUk?}llFL!2$eH#IJXk&N=llfq_V_8@7s5u>*FoY8Ud}ueBZy$tnO^U)g$YC^7qM^e z-XfDpX8!!^=ZBd%A5D|onOUAlaFMm+4qWc-m0Qee=I{UfM>|p%S**EmGd}$rnQ7rv z%uN1o|JVQBl?If658Y6 zytaSLJ@Za?VyBXQ^#i^cA4@mr)~&5{V9)fC8xh?ytiNEdhHd#*Ha=nT@Xu_*wj zJF8q*ftd&@bGkE2+dgX7by7sJdYiI_vWTeQ+a0vwa|4CgS%*Zd6)G8Tj}j-t_A)H< zczY@&Ww!_XSvuhbH+8O-NiQ7iZ}VAU`XE7DOd|u{P;sFY+WDsS6$<)Pz0=ckGK922 z1DCqMJG8DeGF`4mLCq*Ll4)ZlF8ly9U%^zd?n=M7W^VztlD*1?>4UeaT;9f9{m}Tv zF|ukPVUJ~IAuCL>%e)ff%{6;K`^0S=+x2ftb(_jfnNdlZ824be`f4&*Qc}>tTRRj-ql{d{TsSCS0Y55%I?0U zYQkz9chGd^0eegcfih#}=7`G|!Fyx1bmFu&XhKUc%=ia0z(~FCnqB3;08QQ*0@v}V zji{OS-b0uR%;mLDr$x+acYvL&8h4@zO6|%8U6F9@6wOk71!Yd!l464OG!o6>|Vo!VN{UIssLy^SPr6z(c2JRo-_8TrV98 z{?IiKzN(XfDw@j^71)`UwqFNGdl6YD)-F~%)rTl2HT=^>)^rP~hO!0a-rK$jTCqGAEFftP2+pl)Sk3m?{ zFftgw?~@=i6wo_#Zf*f0&u8BO!R^H|%E2lE5ooOj!HkdVl>WL`|AeNW-`}i&lZLN@ zp;-C(8DF=j=Twc&1@w77LKGZG9j)^AGb+x(?!3)n;9Gej5pJ#qLfxdn9wb>v>avuT zi^j9>Vu!r--t%-+nqZh&_I83mgjSU?YkN78pb^e)=wZw%BMAGQ#}-c~)8W!aH`wXs z4QJ+a$`G7cfV~~eIC++09uLA4-}F-ZFQcFx$%_iu1`7u9+rKA&cp)%YPBB}X`BAqYa_!U0%#5naQf6yt z-gfB2)T*E7?MD|v%yJtA`Hd>UqfTZm1RGT8e#|xJZH0;i`8@AAIcpP!rIYA+PW~Xa z`wrxhwfjZ{7@Bb(EB2NEk3ew02^i88U!r{_-*$(cZ#2$FjMem+2_fsVT&~970sC5~ zGyO^(ChD*M%@l$}tSih*W^K|X^jNtB{r~mrv zXY9V$Y6zY6o-funR@UJ9onM01g*7cirJd%T-!3Z#=Xo>I9*ODx{CwWG-vb{fIhh3VQ! zj)FCEEtGfaxjvsgYYGbW>&PL1srcLo7{9w&?;HW|ZEPW&w#|;GaZ zj9h95_fOP7k&ImfFy?vZ?cII4gZR{eBn>OyUf=p6(>8N|P9%fqRR9*yz2#1DNL-MQ zh*)h#+HCCI^V@G$ed90^V`op6;c=mrdCx_MmF8_SSR&56Z-mb0=bhP|QcN&|JMY-F zL*p(~RkOP@pL1puU>iZLjjHa4thgtn=(#yi;t1PYCtOYV&Rco3+dG+NEX+AS@n6|| zW>68BT|}Lj=jE+N;T7=)vu|X2m7pu;UURT^lKJ!-nT&*tvGU}y05a3879U0=rO>{S zC2VE&GhVt{pX!}3qh46Gz^c>T!KlwsPrn_N#Bg&%jOc!o(LLvZa@U)Vvq$?I;(&0`q{czf3F01QmW3x@4L3#4OQaR+J#rk3mT1GHN>DeiXUVPZxB z_Y+?k?A<%SR)k=~U(Wm58(d4r_Y=guHo-PR?LEX-W6|0-Ojc z)}>uZl2d8ITdiQc7H6@6Q5 zFjm=_1m^pd^OR>XmO^H3zhw08If?6x9WsRktP-MUGh$Yfdsu~FS%3?Kco7yBe;C|Z zZ)d~|yfdJ-b)b=s-$~4cu*1p=7J+uZy@ElH?7RC9C8KAFjVMTDn8EK5GA{Qi98E_U ze7i(4a^9{&k0J@c1wY+)Xnakh5F!u}b$(`E7mK^|cSgZkal221$i@UC5jz_v%o@TS z^6biHxTwSLaF)4OkPM83SCi>{8?MgAWt7QwHxs5M*#M9~6-v_)Xe8NelTfe26yRJM z?!3Ne?@dVvT2me>omq80Q5T)+rwca6&Fp4=xVAxm+w}(GMlqOZZipu`4y0Z7cI;pV ziS11WiPs{J)_w@ALmXln^(AS7$8wh=lNx2*H;YGG3P`9|B+AJLwdUvZvx|&~C{XkL z4nUZGR+~3Hw;YII9qdy72-479v}{yDw~<-^uSyH1?PQ=IqxqKZ@+bdMSt^)xd*=mA$QaxT>B9Mv=cU)*z&fOSMXcI96jPh`L!5p~)SXC7~5z!#I4OWm) zGQ0bI{$zyK+%CYYmpUmt?~@TCW2FlFwJg3Gsm{3HnV!W?=5a%ZpFjdTVhVK3H8R*e zS?BF1#H#Gs+vEi9>}oTUX4)d%MNJZnI-eF=lS;)DGZ?RCpI2+X%r1DoQ-|$Q2&_Tv zure54Bx7&we4C3Ap@EGeLDs3?-^XiYCf?sS^OMQ9AI3>aPI!q?u>-3N;#Qn{w;`VA zt*VQsF;RJaM@=~$#((lODn!egQ{eifXAraRPn~)De2(H|eMBMHZ+nysL}l*u?)-WF zgoKScyA#Zku$)j(BZZ*zxr|<5-?yvIEXs-F%P#{IBf}_}yjB5Y>{g3lW%l$8$|TdU zA}Huv>8!2e0z@X!+Yu2wv+qUiX-p5Pd|_dFYr~Lv$GlTzJ2nnIx6R# z**EKBZ?~he5y0}DCs+$rfXdNmgfJ!(O8~0)1 zdXSfyvUd}Hl^2_%?f$bLF0`*M%+WfpXdeStd-6{H{`NVv!QJ}QJRKFYR!!GN=}|+d zJP;b29(l0??v6&Ezy8(xaP_J4J8$OcnUkSe@4qki$Cl9fVhIx&xiW=(CH_>syFtt{ z=>Feaar8z;phnVkxdh9TsR(Rl%-cN@`se(`DrMF=Q1!e#IqxJQb9XPyvFg+N%Hl!4 z&->^7{o9WcgIPzr&-0$o&)d(b;|(q#A@#mljI5pcXF;2p+U=e?wb#*^Ao}uUP>hB9 zvLddS#p%7~_n;M)r{7aYZ0hz^-YnG(X}*XI1+Zf*X^^dF+kxiFeBS|4nK#@jF+!tj z3hRyxM_*=884RvEP`~f4K zpP%i4lfSFot*GHvcp$C!`OTBT+`f4<1QHwt)R6(kt_aO+W@yaa6kPVEeBR&B&(H48 z%tal&v%C#dHwx`e=jrn~>bDorY80pD?aa(`y8D_(+*T`96~6NqT)rKpZTdNjeBL)A zDmVykOB;3i`Hf6(<$WMdpD1e>Pa2(6`qE z$(U6nK}~Dl=I)=-g$$8Y@xlAg#FT;T)- zyxndpWYlP_S!8~&vzHa>%yR7ZSK>V~F-QtXw`^r*M0!f}z86m76E-H8SU$MX&CA$< zyKzXTem+s7A%HZK-MKlqAul6s6|fgXQYgGNzAYH&%ECZuv62{>5@9BEt{PvV;){Q_ zp9YuVizN%hJMUqwHtUimW$c9RHhO^o8z=yRqc)xsY}^W=r3%o6*Y>9fhHBs3{>=k{ z7lsWW{rSvPb%2y^%r7oWUv*>_0m zqYR6kj?Aa0E(a9^1{(`xNZRcWPy4lG!;?fGTv2wQOLOY<_5xOn0%$orNI=1u+l8n5 z8r02*2dP~zR83=F!M6d^%kz|GQB@2iBzs(Ux{X$S`^if6LReho2)gVw1_IUUxCsgR zunPdFEWSM_6RXCMUM(0$qKv%#NA_KoJ)Sax6u>(hSZ2J7&q=eWNsP9j-Q7zs6K^)6UQA*p3H+o5PhP+*Ld8VNL@Uj{f9y~YKu)k$h>Y$h>!V#!Tm)mg<9wv` zRtf>vjRCt_x-EWp69wMwm!Tjt;iTA=^-0!m|2b7us7_@%x1$KXQ-w}w&~u$HmH z&e$FL$&ZPfFuZNVpi6cWXjk^ENId-^ZJdsuTJRNQ?D?b|!b;+QpLL-yUa!2yuL*!%6IQbcGG0mOY{xP!~}SVoC2cyBM> zD(qBNzb~^YW2VI@@b&C!k4C0%jc{Uj2w!qd@>(o{jGYVirtF!6#vdnx(fcHG`Q<~;p3mp)4u-ESJA!K^PvLf) z-|h5tI~C{!xA`CrF;~>@@9*bxW;Z;5eR6ly%X3VN3(mZ@iv}{faZd4ktR;J|?Xr+_ za(kx#^fL_XEiIX>pPuLLl-wR=>WT2q3n@=+?=1(QS8yQULrh=Voi)q54PoxSkw@EF zdZ^1vBhxYpMutd;t@!zU|74UWj;jNPZ{7wCIA;tS6&i2G381wQPF8E(>BUH!PZ#@7 zw&;D{&*$te_8OpZ(G8|iL|pTJJkRfm{D*M7>CVZ|`T39tiyFH@^!2Tf+)!#;(=#&z zY7{7@J(wW15*g>Ce!UJ$4<3c*_x=3*8|Z#JG6V7SFP2#q1h_X7*RE$8TWLq&PE>uJ z7+Q%@yL-Vlz^q%+kdfbt(VcEagpVwt&Zp-IMLQW6Zh$i4DyO@$MsnL1g75RxshO>E ztJ*q9?wVt(+%ucWu_G?oZ-35br(G@YyXCxNq4T?gv~gC0Idwe!-`qNGTK_x7`4XdG zYDBYyGvNj`xR4q==--a4A~&U8?2c3?X1Tor^5?HQ$vE~DY#=5TZUNmutZ9G&BFKHa z-#@>Joo;3tY8aXO1tH{(#}K=eFK%!}i#J?5ZP54ZROT*M+VXZi`T zFSDQH@Sx{i+Wr|pTWn|2`FnnwC;|Gu1mW{JUXE(Ew=+JBSan2H#O&C}K=-#05!LUn zfVlh+$HPs-$dycD$xAM4LXpQkP8fj*#=DE%DvO(NepZ3$`PA7R>>bQ5Q7htPNh_dt zF`Fkz&f8fvD@~)!`_pPod)+T5cczmW6^z>M$lU3k+aJP!KM6(1cfaRJ_qtqwX^c8E zgV@!I(@#c58cDvP%F3PBg$A~ycn<5=Ty}c(;x|;Df})>i@&5e$x9Ns%i9%G(v}UX} z6_0|ubLu1Y48acC1hUf`jA2B5i1_)}Pkuhy=NY)YtmWomaJ`UF@w~A@)C^YL&-C;B z{$^&tb&RXotZFsDSdLb}=Oh6scDhbIZ628*^1uC$|L5p|OHfwS+Eb#tWm-5Fs*&P+ zs{5Ul(LcOwHGzp3Q}8wbZ}EpH;bkQ@prt!~R(ret_~qF~>^tBk@kz=IfVe&dU0<_? zEQczjm-Z1Ni6*%lb#k`pZM&e93=+C4_ir**9XjF|iR3)ir#N1!4QR&1Is{;u-RYhT zyw4~z!2mizC}v+Gef9KyKa3o|6l$YM7p4@@;UI=jJ+mtULFcrt6O$Rim~9Xl;nEQ2 zy6iIbADVrAI%6qrM(mfU4GiS;_BU|q{eYz*+iUMWz=@Hq%ziJOr1$;F(;li9g9%$Z zzSBP7Fta2i@y=uh>+JhWM#K>wA-_GUvb}GSy!H?h23+cbU4nD}rqbxv*aw;1SulyM z$Y&>{tTgs#XYU;Ik7Oo zTX`NM6mM{+65SK7E!zojB)6FPS2g!LR_lZma@5w3NbWmTXSAQJ-r0W~I>gLW#O@+8 z(|A;;f1>hk>l~h!5Qx#-``SOqqKFu7h`V2?v%U)K6)g>0l(hjLhAtgfymViXJ1p$NV1)FZ&(T2N3zCql9z)b80f)TIfu&-S0F0sMz zqUr-ZWKPNElSKr^-hH?t3v(y8a2EB3Hijq8FLRHyp5ldERCo;OX z5+*@A;3KhT&q){_{0-^vDk}6246-V2VNIHdjpy z-&S}0d^CNxCQiTZ8XmFt-ZW;d+-Jw{(*3V@#%cp#nms>h0fPFe&+qdal~zbH7#Z_6 znKtH#Vx1rs1x^a{JcHPM0>}h6)+AE1-?f2=lkfW=HaC~@^0}uOVb~EPdZt*4!F~H3_ShzFW?Ld3;Dbgfz2xLarbI3ViiTkZO$Su z=kLDt<6Z}dT`}0RKc|3rpC^iI^RL~K&?eA;mJG$MLqAbk^giByWfrnB3&g(5;2H!8LzaDSw*Kt5ttn4w zlog5m)pKxW+L{w{rQCg~U{;-vpg1K!&B6Q0g0R#)1H9Yg8ej&;tf zz}NY#_3KN?YHlb9f;)%bo^q9>}blP~>KPrspoV@2{g2d-B65LFve7z_g+oi zXNZ~3`~*>1f1W>;XEa#kNsWBtm}z5jttiee7F9WSaZCzToY{-KN^0@WV1iDFE>@teRbU@lw zaAqP-+L?G_pCL3<ih7!Mfx#d2tK53Qg-Br2hJxciLI^e&0Hu?&q?K83WaZ z(o?nrFL$H4QpH(H-N?|)$un5Ur5uLrMT}-APjz=ifGNFJm9Gp4r@D5*s?f~rR-D=W ze9kTBqOn?fcVoG_pZVff2yk*;yF?MoZ6$h9cf>iV_Ap z|Fqj-2XP#T`<4a=pG-VTqTobs?Gq~{6TKH4;=i}<#g$-YX+ z-ibA{ZJ{!x((QMjPtR~|o}IB6yedLT_e4@qD4~X&OC-LGerzB|OH$peqD5?px5me| zXgFEu$f|5IOKR1l%pfeg;#%W&!-4Q+-pBYl_8qRB(J6z+8L_kUGdNHog*$%6a)-=b z&|1CWZPV{E^P3x^BeQmdGycKc*k@7X8Wu52$EB^JX6!V*agzp9ks63i1-}m@!{oob zTQZUsq;78Ri>IbABY;s}@e%9gOk|BQCA%XE4Iy|2olyid<3il zxEY;v+cMpCal5ubDNw+yHqFA2&lK)}76(^Z*&cuXiGhW7xtM|r`GkuQ_Wu=3aM$7# z?kC~juAvQ>)p5ln2l5ZJ-e0kwyYKY%))UsH8{-!??UX12IsW9OT+f>$mX!GH!4Y)RW0pLe^E2rc}~>DtjOTZhNZ zr9+guK=ylTA#@{%;y2<-zm6Co?lz45vOgX=r)EV)RRO-pVWu&Y%y(^7P%#@3@lv^a zvwwG!bXTtYw#x*z=`xhG-=(zk<)=7$c~1`PMy8fgIY!v7PUUJP={A}rxYMdS4BlV+ zGKhEHfH-WtFyq*usou=+(w2;w3moy*i!5Px2fJCN#c<;ivcesX%+UC{yCeCLOvDBV zW`;m9s_ZWVR@{9h=)EfsW6;CD`W3JPCIw0QWbR;7MGENNlR3N2mAb(sh<+U_g?-N5 zZ$z@Z^x4)X%QR8u@st{icSiD-ncEYN>k{yS;$}&ObOam&Wn>_F-jngn1fou8aa+W8 zXQ#5PCCn=82BHaU%Y8vIfBWiTwMBc%19;y5yu*+2klaw*g=i41I@!}iYKN5?U7A|J zEEwG9H+H6~`g#4)`bq#eyMWb1)ZU(~>DjE~Q^3R%lE^#hg1jR@|JtraMHGna?Yz7Y zXm;-EOvr1e1)_@Y+fI%)`Kl1h<=|uhZ12&w~2Hi4TJkmos#hi3oyaVPh=E)IPM4;5G(XP^R}ST zP#Y`{JQXpRK+N5#Ia5UjN3*@oKG+Z%)5AE{M~74-uKylL#a@mPd`u9S&e5l;r6|H*}G_3+7SAEPJMi{E=FU5NuqmB7Vaq6 zUf5Xn$~@Piz5BMR$_Jwv-~PKfv^D+0{0V!+>_H2THiL|qXK9Dmx*OV(^s#5bwp5r@ zIBzj89@77W3Q z+&|BwcSwG!P`T6gsYYf+&aU+a;Vh*;@!PCu`TAxvAEUkJFWMMTEDPh?%Oz@vS# zpZ?~W6~@+XJJ3HfSqGTzHkr}ea}ac|T;|MckAuF!K{IZ^Tek<>+Z=7_&U0=Y+m_-C z@Bf&|hJq37_sy(V!%= zSNV=GM3`5|Plx!D3^ zGeThYbP(r!`gv`e5^V}6MD27p7{FE>!%qCp#Kh3HTqmm(iRmQ~mAh*TEJ79Wyqiu# zYch`{hBBhx_QEFP&=v6h(!@Q%ceXy2=J1lw`}?V%3-^#{-#K&ob?lI#VD&q*la(1{ zwFA+abSD+%{*MA_zpMN^o4D+{~5u*!GHXP=Cm!S;*v zO-mGp0|%v+)(78Kl_?h1Nd$SN;zLegEEI0?Cc}3*hDYFrDuc3j-KA|h zpbPJ=Rp$$h*h}82q}HDKAe{o^%D{GkyKM(eF5_^7WO^=d)(wGso@?X1{MTeA6N`>2Jz@Z6bVPhvPX80vbSdfa|zL#S9`Ec-3$t2?4=bu^EIZKEdt z2^c9dyD!x<7^_{5cQ30AQ|~vlud=8Kp1EzWl=W=4p@}Y-Si7TTHF5!_#I)DO&8ZT! zDzPg*0~Ec=;06!k5g37$_C{usBGyS6-*^F^k%>snX0h7?370k}Ca@5gwKEkdO;&YJ z1P4PUF)dUkf*8p`=rAEp3r8a&*!~VOxRDvj$UrXl_jw|MyV4j-28~h9001MTFuVB; zYETjlg{ClGa=J_Aem~`t)6&S2v15V$rfR%164LQNK&%>*K;HI27VjIMkNU~$_x8Um z>(rU`V(2_5Z@uq5(#@Y41$iOsM%H7kfAwxAld;{Z(9A9>Af^y`%EKfHOmE|P{yt=! z=$%9^P(jO08<*|2Z`Y~To2zm1lOmcep+` zjf1}4?IskVb?C$jR`&Siq1V+TuUHK#QQn8|l zN(*p;PMvr9>V|uZEx(`*co?+()qd7H9KKK1@p@+7HzHt~*sQyp7z;qNT)cWepT87! z&W|I0qE!&=tDRr;%;-}@DRXPa%m_VRdlc2?7PpwOk3KcNk0_ol~Ehk+QVoIN@@O z0CL`e{ycwvPZ>^>@4P?tmnAWe97i!=cqJO_w`o>$lm->})4x^6o-()Gb`O(jqhhe% zHOW2QDzKWBnP01$Al}}S_3nJbT#EHs8PeSP5k(q$P4@JuoAGhj*?3UUT;vqCGJGZX zQEg=-UgkZ9FtBI-z6eE1AjiBWihJzcStf~baGz@4Orc;X6Ev86WIyYGw}uh~5r=>GQ0{I@z>?B$ot*oy=t5 z_jxKRs^C>TNo>Y(-7pb5vpZSl-^bfeFyfr;h7eUYekNn4(>VDklJmTBw?mrll=p0) zTeK`#D696}(dMbpj{V|0vx+MCy^KX9BrdX!eVwCmuWtq{1dJBo&*!}Fu$YnWO!!R& zMV%RuK~3)_vEVuRz7q^!EJ4_8l;Vp?hTQPXomZ9d`TPu#=QFUz*Woi&k~W!Qf~?A? zC&<75{D(6{@6(wm0Krx)Q29gd%tiq%zmV)A2*yZZ2ETxP85t3;REX7_tThYy^Yi>Z zmusvBqv8O2zXq;F1cd16a8<<&mUTWt>qh+#G|xPrJc0c4{{EcQmz%yofg4ewIOm=A zGSX{jX(S+{SmM6D9`;DQJ&{bLxRv$v>$eC9O^@{R`DxEzHmZ9NSmAo{*zbP+DlC7W zUjmWGIoS&KOkUDmM|{Rhrr$p}Ct!Rkt$=$7kdK#nGtTvm2E&zo5zwBK@AIHezg-B{ zHO^J$`?lYe*A9QqQM~I+6L;5}&RK=)64tgwxHE+$q(n0Hj+mLIf?u~F$NiO5h&^+D zQd^p51A(*qx;MsD5=LNL7_{O00s_0Mt;!&JG~E^Ko;vyY>o5NNdyx_6w;yN-1-=x} zeTB?O$N%Cd`swX?p5J-?IIHqkaTo1zfTejOOGF9NJ$REJCM)>o?Lb8gA}h|QS3BBM zf2kiv%{~J7@BhpHLx8qvtPt0QS3S)!)6hSwH9D_V232KBOZ=6bo<)5C)Xf$R8DM05 zRy|}z^-kIAl_&0(owLi^BB6>il=u4UachQ|E$MnvA zXTmBBHh_tkR%M8Dzy$}g+X~|LW^s4j?Xl1y#GLNPK!P2sj%5{Vp8%0E_ z!&EPId89fSyS7cao$Q|vd_6gbziPBMgboGV$N39==yx;SImUGE`W8ZK7ea7VpTEY4 z6szDfAaiT)nnawM9r`=5c?gcO0+QwUg zw@YE8u|@T6GUNcs>%~NOYSW3&brv} zK3+a;{?Rfs2ynV1l4&=v2-tCa6%%TD60wx^{aY37xEipSfTK2y z4^df|ZcU?iv8MV35nlOeO?mJR$#d8C*sHmBv8shmBpEHY-I??m8GL5axU zn^90AH)v>7@F*iOwinLxXQlOxe}{Q8a@;XTJkMlh_hiLSetzez%;$OFn^BNj!0h|I zf9+kQJ3tCrETU-CS@^xI?41mp&tHFje?u~rP`ie)_lyA7v$nP}BxokHG`64V{;rvF z1Gq~cu|1QF*;(@1gr(V0@N>C2;~M(iwJ{2i#NEks<9jF)W~EE7CNu1D1pMiJKn4dJ z(ugIDQy(^z6o7g9eP-4D1V2^z^ivrlavl2iQh=Eh9cjr(_I4^2Fza`AD3aOp)~S%w z?%Ww05Zoge5d>z3$OyRdEUTn{U>DygVbRL)>;!};^(s&q(>=TA=Lf6Zo$0CsBbck6 zUWO{mn_$QJ&gZB55s(p)^**n#LEh_%3s^E{Y$YIJu3|1mx3X|{ECG>-*%5Fmx|ej7 zs-^FKdrqB*kSpIaP1PeYvm<>@XfH-T7!~o`eUfWppCru(PD6BNHu!eG5r2LDou7Xt zQhFoU^AHtZ{N%G>A~QIBvZm*K{uFlSU1`Luv9^r=II5-t%e#9(J`Ijk21 zjv3N4BA~Sy<(J0-`#zDCnQuRtXWy46KY8A_nVeNDSUK+#ks7gVw+LTleFp$NyX~o% zaY{d}!N~zJUl(@99F?k_ww$z3)sNoSeEf`0?;8@6v-okvQ}3f)b>xZj*ZFV%Eg}}K zf>^HNi_m*}BGRdc$UG6
  • 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

    B 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

    BI7A%_&nFa!e>A_&Ix<;hS;+CjuJV|o*g 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

    ^^qtj&>0^Ed@!Qoqij0W3&fw2v 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ǖy$2V$smm{J>pR!ssA3&Gf2R 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ު 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%0Am_m!kQEJGHwJ?m2xBy$JW?wTd2C*IF~p3Kpu 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%0Ak_iPpcJ* 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�s$z4uji$n%y^y`;pWG@a#Lc)SO^AD59#EQBc>({ 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 KMNUMnLSTYG9z**8 literal 0 HcmV?d00001 diff --git a/reference-deepwiki/deepwiki-open-main/screenshots/Interface.png b/reference-deepwiki/deepwiki-open-main/screenshots/Interface.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab25129b224f959928eb1dfbad9846c6cf2921e GIT binary patch literal 143225 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 Mc?@1^e(L5w06E}J2LJ#7 literal 0 HcmV?d00001 diff --git a/reference-deepwiki/deepwiki-open-main/screenshots/Ollama.png b/reference-deepwiki/deepwiki-open-main/screenshots/Ollama.png new file mode 100644 index 0000000000000000000000000000000000000000..fab50339cfeefdea37fb43e609068f5ff909e70c GIT binary patch literal 45701 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

    EU0H=m4386ak@+Pc_TS>sM$ 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 Mtf~xD>R#ag0CqV*e*gdg literal 0 HcmV?d00001 diff --git a/reference-deepwiki/deepwiki-open-main/screenshots/privaterepo.png b/reference-deepwiki/deepwiki-open-main/screenshots/privaterepo.png new file mode 100644 index 0000000000000000000000000000000000000000..74fda6cb2e00f5ebe59024ce0aff11aec485b306 GIT binary patch literal 193287 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
    \` block listing ALL the \`[RELEVANT_SOURCE_FILES]\` you used to generate the content. There MUST be AT LEAST 5 source files listed - if fewer were provided, you MUST find additional related files to include. +Format it exactly like this: +
    +Relevant source files + +Remember, do not provide any acknowledgements, disclaimers, apologies, or any other preface before the \`
    \` block. JUST START with the \`
    \` block. +The following files were used as context for generating this wiki page: + +${filePaths.map(path => `- [${path}](${generateFileUrl(path)})`).join('\n')} + +
    + +Immediately after the \`
    \` block, the main title of the page should be a H1 Markdown heading: \`# ${page.title}\`. + +Based ONLY on the content of the \`[RELEVANT_SOURCE_FILES]\`: + +1. **Introduction:** Start with a concise introduction (1-2 paragraphs) explaining the purpose, scope, and high-level overview of "${page.title}" within the context of the overall project. If relevant, and if information is available in the provided files, link to other potential wiki pages using the format \`[Link Text](#page-anchor-or-id)\`. + +2. **Detailed Sections:** Break down "${page.title}" into logical sections using H2 (\`##\`) and H3 (\`###\`) Markdown headings. For each section: + * Explain the architecture, components, data flow, or logic relevant to the section's focus, as evidenced in the source files. + * Identify key functions, classes, data structures, API endpoints, or configuration elements pertinent to that section. + +3. **Mermaid Diagrams:** + * EXTENSIVELY use Mermaid diagrams (e.g., \`flowchart TD\`, \`sequenceDiagram\`, \`classDiagram\`, \`erDiagram\`, \`graph TD\`) to visually represent architectures, flows, relationships, and schemas found in the source files. + * Ensure diagrams are accurate and directly derived from information in the \`[RELEVANT_SOURCE_FILES]\`. + * Provide a brief explanation before or after each diagram to give context. + * CRITICAL: All diagrams MUST follow strict vertical orientation: + - Use "graph TD" (top-down) directive for flow diagrams + - NEVER use "graph LR" (left-right) + - Maximum node width should be 3-4 words + - For sequence diagrams: + - Start with "sequenceDiagram" directive on its own line + - Define ALL participants at the beginning + - Use descriptive but concise participant names + - Use the correct arrow types: + - ->> for request/asynchronous messages + - -->> for response messages + - -x for failed messages + - Include activation boxes using +/- notation + - Add notes for clarification using "Note over" or "Note right of" + +4. **Tables:** + * Use Markdown tables to summarize information such as: + * Key features or components and their descriptions. + * API endpoint parameters, types, and descriptions. + * Configuration options, their types, and default values. + * Data model fields, types, constraints, and descriptions. + +5. **Code Snippets (ENTIRELY OPTIONAL):** + * Include short, relevant code snippets (e.g., Python, Java, JavaScript, SQL, JSON, YAML) directly from the \`[RELEVANT_SOURCE_FILES]\` to illustrate key implementation details, data structures, or configurations. + * Ensure snippets are well-formatted within Markdown code blocks with appropriate language identifiers. + +6. **Source Citations (EXTREMELY IMPORTANT):** + * For EVERY piece of significant information, explanation, diagram, table entry, or code snippet, you MUST cite the specific source file(s) and relevant line numbers from which the information was derived. + * Place citations at the end of the paragraph, under the diagram/table, or after the code snippet. + * Use the exact format: \`Sources: [filename.ext:start_line-end_line]()\` for a range, or \`Sources: [filename.ext:line_number]()\` for a single line. Multiple files can be cited: \`Sources: [file1.ext:1-10](), [file2.ext:5](), [dir/file3.ext]()\` (if the whole file is relevant and line numbers are not applicable or too broad). + * If an entire section is overwhelmingly based on one or two files, you can cite them under the section heading in addition to more specific citations within the section. + * IMPORTANT: You MUST cite AT LEAST 5 different source files throughout the wiki page to ensure comprehensive coverage. + +7. **Technical Accuracy:** All information must be derived SOLELY from the \`[RELEVANT_SOURCE_FILES]\`. Do not infer, invent, or use external knowledge about similar systems or common practices unless it's directly supported by the provided code. If information is not present in the provided files, do not include it or explicitly state its absence if crucial to the topic. + +8. **Clarity and Conciseness:** Use clear, professional, and concise technical language suitable for other developers working on or learning about the project. Avoid unnecessary jargon, but use correct technical terms where appropriate. + +9. **Conclusion/Summary:** End with a brief summary paragraph if appropriate for "${page.title}", reiterating the key aspects covered and their significance within the project. + +IMPORTANT: Generate the content in ${language === 'en' ? 'English' : + language === 'ja' ? 'Japanese (日本語)' : + language === 'zh' ? 'Mandarin Chinese (中文)' : + language === 'zh-tw' ? 'Traditional Chinese (繁體中文)' : + language === 'es' ? 'Spanish (Español)' : + language === 'kr' ? 'Korean (한국어)' : + language === 'vi' ? 'Vietnamese (Tiếng Việt)' : + language === "pt-br" ? "Brazilian Portuguese (Português Brasileiro)" : + language === "fr" ? "Français (French)" : + language === "ru" ? "Русский (Russian)" : + 'English'} language. + +Remember: +- Ground every claim in the provided source files. +- Prioritize accuracy and direct representation of the code's functionality and structure. +- Structure the document logically for easy understanding by other developers. +`; + + // Prepare request body + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const requestBody: Record = { + repo_url: repoUrl, + type: effectiveRepoInfo.type, + messages: [{ + role: 'user', + content: promptContent + }] + }; + + // Add tokens if available + addTokensToRequestBody(requestBody, currentToken, effectiveRepoInfo.type, selectedProviderState, selectedModelState, isCustomSelectedModelState, customSelectedModelState, language, modelExcludedDirs, modelExcludedFiles, modelIncludedDirs, modelIncludedFiles); + + // Use WebSocket for communication + let content = ''; + + try { + // Create WebSocket URL from the server base URL + const serverBaseUrl = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + const wsBaseUrl = serverBaseUrl.replace(/^http/, 'ws')? serverBaseUrl.replace(/^https/, 'wss'): serverBaseUrl.replace(/^http/, 'ws'); + const wsUrl = `${wsBaseUrl}/ws/chat`; + + // Create a new WebSocket connection + const ws = new WebSocket(wsUrl); + + // Create a promise that resolves when the WebSocket connection is complete + await new Promise((resolve, reject) => { + // Set up event handlers + ws.onopen = () => { + console.log(`WebSocket connection established for page: ${page.title}`); + // Send the request as JSON + ws.send(JSON.stringify(requestBody)); + resolve(); + }; + + ws.onerror = (error) => { + console.error('WebSocket error:', error); + reject(new Error('WebSocket connection failed')); + }; + + // If the connection doesn't open within 5 seconds, fall back to HTTP + const timeout = setTimeout(() => { + reject(new Error('WebSocket connection timeout')); + }, 5000); + + // Clear the timeout if the connection opens successfully + ws.onopen = () => { + clearTimeout(timeout); + console.log(`WebSocket connection established for page: ${page.title}`); + // Send the request as JSON + ws.send(JSON.stringify(requestBody)); + resolve(); + }; + }); + + // Create a promise that resolves when the WebSocket response is complete + await new Promise((resolve, reject) => { + // Handle incoming messages + ws.onmessage = (event) => { + content += event.data; + }; + + // Handle WebSocket close + ws.onclose = () => { + console.log(`WebSocket connection closed for page: ${page.title}`); + resolve(); + }; + + // Handle WebSocket errors + ws.onerror = (error) => { + console.error('WebSocket error during message reception:', error); + reject(new Error('WebSocket error during message reception')); + }; + }); + } catch (wsError) { + console.error('WebSocket error, falling back to HTTP:', wsError); + + // Fall back to HTTP if WebSocket fails + const response = await fetch(`/api/chat/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (!response.ok) { + const errorText = await response.text().catch(() => 'No error details available'); + console.error(`API error (${response.status}): ${errorText}`); + throw new Error(`Error generating page content: ${response.status} - ${response.statusText}`); + } + + // Process the response + content = ''; + const reader = response.body?.getReader(); + const decoder = new TextDecoder(); + + if (!reader) { + throw new Error('Failed to get response reader'); + } + + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + content += decoder.decode(value, { stream: true }); + } + // Ensure final decoding + content += decoder.decode(); + } catch (readError) { + console.error('Error reading stream:', readError); + throw new Error('Error processing response stream'); + } + } + + // Clean up markdown delimiters + content = content.replace(/^```markdown\s*/i, '').replace(/```\s*$/i, ''); + + console.log(`Received content for ${page.title}, length: ${content.length} characters`); + + // Store the FINAL generated content + const updatedPage = { ...page, content }; + setGeneratedPages(prev => ({ ...prev, [page.id]: updatedPage })); + // Store this as the original for potential mermaid retries + setOriginalMarkdown(prev => ({ ...prev, [page.id]: content })); + + resolve(); + } catch (err) { + console.error(`Error generating content for page ${page.id}:`, err); + const errorMessage = err instanceof Error ? err.message : 'Unknown error'; + // Update page state to show error + setGeneratedPages(prev => ({ + ...prev, + [page.id]: { ...page, content: `Error generating content: ${errorMessage}` } + })); + setError(`Failed to generate content for ${page.title}.`); + resolve(); // Resolve even on error to unblock queue + } finally { + // Clear the processing flag for this page + // This must happen in the finally block to ensure the flag is cleared + // even if an error occurs during processing + activeContentRequests.delete(page.id); + + // Mark page as done + setPagesInProgress(prev => { + const next = new Set(prev); + next.delete(page.id); + return next; + }); + setLoadingMessage(undefined); // Clear specific loading message + } + }); + }, [generatedPages, currentToken, effectiveRepoInfo, selectedProviderState, selectedModelState, isCustomSelectedModelState, customSelectedModelState, modelExcludedDirs, modelExcludedFiles, language, activeContentRequests, generateFileUrl]); + + // Determine the wiki structure from repository data + const determineWikiStructure = useCallback(async (fileTree: string, readme: string, owner: string, repo: string) => { + if (!owner || !repo) { + setError('Invalid repository information. Owner and repo name are required.'); + setIsLoading(false); + setEmbeddingError(false); // Reset embedding error state + return; + } + + // Skip if structure request is already in progress + if (structureRequestInProgress) { + console.log('Wiki structure determination already in progress, skipping duplicate call'); + return; + } + + try { + setStructureRequestInProgress(true); + setLoadingMessage(messages.loading?.determiningStructure || 'Determining wiki structure...'); + + // Get repository URL + const repoUrl = getRepoUrl(effectiveRepoInfo); + + // Prepare request body + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const requestBody: Record = { + repo_url: repoUrl, + type: effectiveRepoInfo.type, + messages: [{ + role: 'user', +content: `Analyze this GitHub repository ${owner}/${repo} and create a wiki structure for it. + +1. The complete file tree of the project: + +${fileTree} + + +2. The README file of the project: + +${readme} + + +I want to create a wiki for this repository. Determine the most logical structure for a wiki based on the repository's content. + +IMPORTANT: The wiki content will be generated in ${language === 'en' ? 'English' : + language === 'ja' ? 'Japanese (日本語)' : + language === 'zh' ? 'Mandarin Chinese (中文)' : + language === 'zh-tw' ? 'Traditional Chinese (繁體中文)' : + language === 'es' ? 'Spanish (Español)' : + language === 'kr' ? 'Korean (한国語)' : + language === 'vi' ? 'Vietnamese (Tiếng Việt)' : + language === "pt-br" ? "Brazilian Portuguese (Português Brasileiro)" : + language === "fr" ? "Français (French)" : + language === "ru" ? "Русский (Russian)" : + 'English'} language. + +When designing the wiki structure, include pages that would benefit from visual diagrams, such as: +- Architecture overviews +- Data flow descriptions +- Component relationships +- Process workflows +- State machines +- Class hierarchies + +${isComprehensiveView ? ` +Create a structured wiki with the following main sections: +- Overview (general information about the project) +- System Architecture (how the system is designed) +- Core Features (key functionality) +- Data Management/Flow: If applicable, how data is stored, processed, accessed, and managed (e.g., database schema, data pipelines, state management). +- Frontend Components (UI elements, if applicable.) +- Backend Systems (server-side components) +- Model Integration (AI model connections) +- Deployment/Infrastructure (how to deploy, what's the infrastructure like) +- Extensibility and Customization: If the project architecture supports it, explain how to extend or customize its functionality (e.g., plugins, theming, custom modules, hooks). + +Each section should contain relevant pages. For example, the "Frontend Components" section might include pages for "Home Page", "Repository Wiki Page", "Ask Component", etc. + +Return your analysis in the following XML format: + + + [Overall title for the wiki] + [Brief description of the repository] + +
    + [Section title] + + page-1 + page-2 + + + section-2 + +
    + +
    + + + [Page title] + [Brief description of what this page will cover] + high|medium|low + + [Path to a relevant file] + + + + page-2 + + + section-1 + + + +
    +` : ` +Return your analysis in the following XML format: + + + [Overall title for the wiki] + [Brief description of the repository] + + + [Page title] + [Brief description of what this page will cover] + high|medium|low + + [Path to a relevant file] + + + + page-2 + + + + + + +`} + +IMPORTANT FORMATTING INSTRUCTIONS: +- Return ONLY the valid XML structure specified above +- DO NOT wrap the XML in markdown code blocks (no \`\`\` or \`\`\`xml) +- DO NOT include any explanation text before or after the XML +- Ensure the XML is properly formatted and valid +- Start directly with and end with + +IMPORTANT: +1. Create ${isComprehensiveView ? '8-12' : '4-6'} pages that would make a ${isComprehensiveView ? 'comprehensive' : 'concise'} wiki for this repository +2. Each page should focus on a specific aspect of the codebase (e.g., architecture, key features, setup) +3. The relevant_files should be actual files from the repository that would be used to generate that page +4. Return ONLY valid XML with the structure specified above, with no markdown code block delimiters` + }] + }; + + // Add tokens if available + addTokensToRequestBody(requestBody, currentToken, effectiveRepoInfo.type, selectedProviderState, selectedModelState, isCustomSelectedModelState, customSelectedModelState, language, modelExcludedDirs, modelExcludedFiles, modelIncludedDirs, modelIncludedFiles); + + // Use WebSocket for communication + let responseText = ''; + + try { + // Create WebSocket URL from the server base URL + const serverBaseUrl = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + const wsBaseUrl = serverBaseUrl.replace(/^http/, 'ws')? serverBaseUrl.replace(/^https/, 'wss'): serverBaseUrl.replace(/^http/, 'ws'); + const wsUrl = `${wsBaseUrl}/ws/chat`; + + // Create a new WebSocket connection + const ws = new WebSocket(wsUrl); + + // Create a promise that resolves when the WebSocket connection is complete + await new Promise((resolve, reject) => { + // Set up event handlers + ws.onopen = () => { + console.log('WebSocket connection established for wiki structure'); + // Send the request as JSON + ws.send(JSON.stringify(requestBody)); + resolve(); + }; + + ws.onerror = (error) => { + console.error('WebSocket error:', error); + reject(new Error('WebSocket connection failed')); + }; + + // If the connection doesn't open within 5 seconds, fall back to HTTP + const timeout = setTimeout(() => { + reject(new Error('WebSocket connection timeout')); + }, 5000); + + // Clear the timeout if the connection opens successfully + ws.onopen = () => { + clearTimeout(timeout); + console.log('WebSocket connection established for wiki structure'); + // Send the request as JSON + ws.send(JSON.stringify(requestBody)); + resolve(); + }; + }); + + // Create a promise that resolves when the WebSocket response is complete + await new Promise((resolve, reject) => { + // Handle incoming messages + ws.onmessage = (event) => { + responseText += event.data; + }; + + // Handle WebSocket close + ws.onclose = () => { + console.log('WebSocket connection closed for wiki structure'); + resolve(); + }; + + // Handle WebSocket errors + ws.onerror = (error) => { + console.error('WebSocket error during message reception:', error); + reject(new Error('WebSocket error during message reception')); + }; + }); + } catch (wsError) { + console.error('WebSocket error, falling back to HTTP:', wsError); + + // Fall back to HTTP if WebSocket fails + const response = await fetch(`/api/chat/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (!response.ok) { + throw new Error(`Error determining wiki structure: ${response.status}`); + } + + // Process the response + responseText = ''; + const reader = response.body?.getReader(); + const decoder = new TextDecoder(); + + if (!reader) { + throw new Error('Failed to get response reader'); + } + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + responseText += decoder.decode(value, { stream: true }); + } + } + + if(responseText.includes('Error preparing retriever: Environment variable OPENAI_API_KEY must be set')) { + setEmbeddingError(true); + throw new Error('OPENAI_API_KEY environment variable is not set. Please configure your OpenAI API key.'); + } + + if(responseText.includes('Ollama model') && responseText.includes('not found')) { + setEmbeddingError(true); + throw new Error('The specified Ollama embedding model was not found. Please ensure the model is installed locally or select a different embedding model in the configuration.'); + } + + // Clean up markdown delimiters + responseText = responseText.replace(/^```(?:xml)?\s*/i, '').replace(/```\s*$/i, ''); + + // Extract wiki structure from response + const xmlMatch = responseText.match(/[\s\S]*?<\/wiki_structure>/m); + if (!xmlMatch) { + throw new Error('No valid XML found in response'); + } + + let xmlText = xmlMatch[0]; + xmlText = xmlText.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, ''); + // Try parsing with DOMParser + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString(xmlText, "text/xml"); + + // Check for parsing errors + const parseError = xmlDoc.querySelector('parsererror'); + if (parseError) { + // Log the first few elements to see what was parsed + const elements = xmlDoc.querySelectorAll('*'); + if (elements.length > 0) { + console.log('First 5 element names:', + Array.from(elements).slice(0, 5).map(el => el.nodeName).join(', ')); + } + + // We'll continue anyway since the XML might still be usable + } + + // Extract wiki structure + let title = ''; + let description = ''; + let pages: WikiPage[] = []; + + // Try using DOM parsing first + const titleEl = xmlDoc.querySelector('title'); + const descriptionEl = xmlDoc.querySelector('description'); + const pagesEls = xmlDoc.querySelectorAll('page'); + + title = titleEl ? titleEl.textContent || '' : ''; + description = descriptionEl ? descriptionEl.textContent || '' : ''; + + // Parse pages using DOM + pages = []; + + if (parseError && (!pagesEls || pagesEls.length === 0)) { + console.warn('DOM parsing failed, trying regex fallback'); + } + + pagesEls.forEach(pageEl => { + const id = pageEl.getAttribute('id') || `page-${pages.length + 1}`; + const titleEl = pageEl.querySelector('title'); + const importanceEl = pageEl.querySelector('importance'); + const filePathEls = pageEl.querySelectorAll('file_path'); + const relatedEls = pageEl.querySelectorAll('related'); + + const title = titleEl ? titleEl.textContent || '' : ''; + const importance = importanceEl ? + (importanceEl.textContent === 'high' ? 'high' : + importanceEl.textContent === 'medium' ? 'medium' : 'low') : 'medium'; + + const filePaths: string[] = []; + filePathEls.forEach(el => { + if (el.textContent) filePaths.push(el.textContent); + }); + + const relatedPages: string[] = []; + relatedEls.forEach(el => { + if (el.textContent) relatedPages.push(el.textContent); + }); + + pages.push({ + id, + title, + content: '', // Will be generated later + filePaths, + importance, + relatedPages + }); + }); + + // Extract sections if they exist in the XML + const sections: WikiSection[] = []; + const rootSections: string[] = []; + + // Try to parse sections if we're in comprehensive view + if (isComprehensiveView) { + const sectionsEls = xmlDoc.querySelectorAll('section'); + + if (sectionsEls && sectionsEls.length > 0) { + // Process sections + sectionsEls.forEach(sectionEl => { + const id = sectionEl.getAttribute('id') || `section-${sections.length + 1}`; + const titleEl = sectionEl.querySelector('title'); + const pageRefEls = sectionEl.querySelectorAll('page_ref'); + const sectionRefEls = sectionEl.querySelectorAll('section_ref'); + + const title = titleEl ? titleEl.textContent || '' : ''; + const pages: string[] = []; + const subsections: string[] = []; + + pageRefEls.forEach(el => { + if (el.textContent) pages.push(el.textContent); + }); + + sectionRefEls.forEach(el => { + if (el.textContent) subsections.push(el.textContent); + }); + + sections.push({ + id, + title, + pages, + subsections: subsections.length > 0 ? subsections : undefined + }); + + // Check if this is a root section (not referenced by any other section) + let isReferenced = false; + sectionsEls.forEach(otherSection => { + const otherSectionRefs = otherSection.querySelectorAll('section_ref'); + otherSectionRefs.forEach(ref => { + if (ref.textContent === id) { + isReferenced = true; + } + }); + }); + + if (!isReferenced) { + rootSections.push(id); + } + }); + } + } + + // Create wiki structure + const wikiStructure: WikiStructure = { + id: 'wiki', + title, + description, + pages, + sections, + rootSections + }; + + setWikiStructure(wikiStructure); + setCurrentPageId(pages.length > 0 ? pages[0].id : undefined); + + // Start generating content for all pages with controlled concurrency + if (pages.length > 0) { + // Mark all pages as in progress + const initialInProgress = new Set(pages.map(p => p.id)); + setPagesInProgress(initialInProgress); + + console.log(`Starting generation for ${pages.length} pages with controlled concurrency`); + + // Maximum concurrent requests + const MAX_CONCURRENT = 1; + + // Create a queue of pages + const queue = [...pages]; + let activeRequests = 0; + + // Function to process next items in queue + const processQueue = () => { + // Process as many items as we can up to our concurrency limit + while (queue.length > 0 && activeRequests < MAX_CONCURRENT) { + const page = queue.shift(); + if (page) { + activeRequests++; + console.log(`Starting page ${page.title} (${activeRequests} active, ${queue.length} remaining)`); + + // Start generating content for this page + generatePageContent(page, owner, repo) + .finally(() => { + // When done (success or error), decrement active count and process more + activeRequests--; + console.log(`Finished page ${page.title} (${activeRequests} active, ${queue.length} remaining)`); + + // Check if all work is done (queue empty and no active requests) + if (queue.length === 0 && activeRequests === 0) { + console.log("All page generation tasks completed."); + setIsLoading(false); + setLoadingMessage(undefined); + } else { + // Only process more if there are items remaining and we're under capacity + if (queue.length > 0 && activeRequests < MAX_CONCURRENT) { + processQueue(); + } + } + }); + } + } + + // Additional check: If the queue started empty or becomes empty and no requests were started/active + if (queue.length === 0 && activeRequests === 0 && pages.length > 0 && pagesInProgress.size === 0) { + // This handles the case where the queue might finish before the finally blocks fully update activeRequests + // or if the initial queue was processed very quickly + console.log("Queue empty and no active requests after loop, ensuring loading is false."); + setIsLoading(false); + setLoadingMessage(undefined); + } else if (pages.length === 0) { + // Handle case where there were no pages to begin with + setIsLoading(false); + setLoadingMessage(undefined); + } + }; + + // Start processing the queue + processQueue(); + } else { + // Set loading to false if there were no pages found + setIsLoading(false); + setLoadingMessage(undefined); + } + + } catch (error) { + console.error('Error determining wiki structure:', error); + setIsLoading(false); + setError(error instanceof Error ? error.message : 'An unknown error occurred'); + setLoadingMessage(undefined); + } finally { + setStructureRequestInProgress(false); + } + }, [generatePageContent, currentToken, effectiveRepoInfo, pagesInProgress.size, structureRequestInProgress, selectedProviderState, selectedModelState, isCustomSelectedModelState, customSelectedModelState, modelExcludedDirs, modelExcludedFiles, language, messages.loading, isComprehensiveView]); + + // Fetch repository structure using GitHub or GitLab API + const fetchRepositoryStructure = useCallback(async () => { + // If a request is already in progress, don't start another one + if (requestInProgress) { + console.log('Repository fetch already in progress, skipping duplicate call'); + return; + } + + // Reset previous state + setWikiStructure(undefined); + setCurrentPageId(undefined); + setGeneratedPages({}); + setPagesInProgress(new Set()); + setError(null); + setEmbeddingError(false); // Reset embedding error state + + try { + // Set the request in progress flag + setRequestInProgress(true); + + // Update loading state + setIsLoading(true); + setLoadingMessage(messages.loading?.fetchingStructure || 'Fetching repository structure...'); + + let fileTreeData = ''; + let readmeContent = ''; + + if (effectiveRepoInfo.type === 'local' && effectiveRepoInfo.localPath) { + try { + const response = await fetch(`/local_repo/structure?path=${encodeURIComponent(effectiveRepoInfo.localPath)}`); + + if (!response.ok) { + const errorData = await response.text(); + throw new Error(`Local repository API error (${response.status}): ${errorData}`); + } + + const data = await response.json(); + fileTreeData = data.file_tree; + readmeContent = data.readme; + // For local repos, we can't determine the actual branch, so use 'main' as default + setDefaultBranch('main'); + } catch (err) { + throw err; + } + } else if (effectiveRepoInfo.type === 'github') { + // GitHub API approach + // Try to get the tree data for common branch names + let treeData = null; + let apiErrorDetails = ''; + + // Determine the GitHub API base URL based on the repository URL + const getGithubApiUrl = (repoUrl: string | null): string => { + if (!repoUrl) { + return 'https://api.github.com'; // Default to public GitHub + } + + try { + const url = new URL(repoUrl); + const hostname = url.hostname; + + // If it's the public GitHub, use the standard API URL + if (hostname === 'github.com') { + return 'https://api.github.com'; + } + + // For GitHub Enterprise, use the enterprise API URL format + // GitHub Enterprise API URL format: https://github.company.com/api/v3 + return `${url.protocol}//${hostname}/api/v3`; + } catch { + return 'https://api.github.com'; // Fallback to public GitHub if URL parsing fails + } + }; + + const githubApiBaseUrl = getGithubApiUrl(effectiveRepoInfo.repoUrl); + // First, try to get the default branch from the repository info + let defaultBranchLocal = null; + try { + const repoInfoResponse = await fetch(`${githubApiBaseUrl}/repos/${owner}/${repo}`, { + headers: createGithubHeaders(currentToken) + }); + + if (repoInfoResponse.ok) { + const repoData = await repoInfoResponse.json(); + defaultBranchLocal = repoData.default_branch; + console.log(`Found default branch: ${defaultBranchLocal}`); + // Store the default branch in state + setDefaultBranch(defaultBranchLocal || 'main'); + } + } catch (err) { + console.warn('Could not fetch repository info for default branch:', err); + } + + // Create list of branches to try, prioritizing the actual default branch + const branchesToTry = defaultBranchLocal + ? [defaultBranchLocal, 'main', 'master'].filter((branch, index, arr) => arr.indexOf(branch) === index) + : ['main', 'master']; + + for (const branch of branchesToTry) { + const apiUrl = `${githubApiBaseUrl}/repos/${owner}/${repo}/git/trees/${branch}?recursive=1`; + const headers = createGithubHeaders(currentToken); + + console.log(`Fetching repository structure from branch: ${branch}`); + try { + const response = await fetch(apiUrl, { + headers + }); + + if (response.ok) { + treeData = await response.json(); + console.log('Successfully fetched repository structure'); + break; + } else { + const errorData = await response.text(); + apiErrorDetails = `Status: ${response.status}, Response: ${errorData}`; + console.error(`Error fetching repository structure: ${apiErrorDetails}`); + } + } catch (err) { + console.error(`Network error fetching branch ${branch}:`, err); + } + } + + if (!treeData || !treeData.tree) { + if (apiErrorDetails) { + throw new Error(`Could not fetch repository structure. API Error: ${apiErrorDetails}`); + } else { + throw new Error('Could not fetch repository structure. Repository might not exist, be empty or private.'); + } + } + + // Convert tree data to a string representation + fileTreeData = treeData.tree + .filter((item: { type: string; path: string }) => item.type === 'blob') + .map((item: { type: string; path: string }) => item.path) + .join('\n'); + + // Try to fetch README.md content + try { + const headers = createGithubHeaders(currentToken); + + const readmeResponse = await fetch(`${githubApiBaseUrl}/repos/${owner}/${repo}/readme`, { + headers + }); + + if (readmeResponse.ok) { + const readmeData = await readmeResponse.json(); + readmeContent = atob(readmeData.content); + } else { + console.warn(`Could not fetch README.md, status: ${readmeResponse.status}`); + } + } catch (err) { + console.warn('Could not fetch README.md, continuing with empty README', err); + } + } + else if (effectiveRepoInfo.type === 'gitlab') { + // GitLab API approach + const projectPath = extractUrlPath(effectiveRepoInfo.repoUrl ?? '') ?? `${owner}/${repo}`; + const projectDomain = extractUrlDomain(effectiveRepoInfo.repoUrl ?? "https://gitlab.com"); + const encodedProjectPath = encodeURIComponent(projectPath); + + const headers = createGitlabHeaders(currentToken); + + /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ + const filesData: any[] = []; + + try { + // Step 1: Get project info to determine default branch + let projectInfoUrl: string; + let defaultBranchLocal = 'main'; // fallback + try { + const validatedUrl = new URL(projectDomain ?? ''); // Validate domain + projectInfoUrl = `${validatedUrl.origin}/api/v4/projects/${encodedProjectPath}`; + } catch (err) { + throw new Error(`Invalid project domain URL: ${projectDomain}`); + } + const projectInfoRes = await fetch(projectInfoUrl, { headers }); + + if (!projectInfoRes.ok) { + const errorData = await projectInfoRes.text(); + throw new Error(`GitLab project info error: Status ${projectInfoRes.status}, Response: ${errorData}`); + } + + const projectInfo = await projectInfoRes.json(); + defaultBranchLocal = projectInfo.default_branch || 'main'; + console.log(`Found GitLab default branch: ${defaultBranchLocal}`); + // Store the default branch in state + setDefaultBranch(defaultBranchLocal); + + // Step 2: Paginate to fetch full file tree + let page = 1; + let morePages = true; + + while (morePages) { + const apiUrl = `${projectInfoUrl}/repository/tree?recursive=true&per_page=100&page=${page}`; + const response = await fetch(apiUrl, { headers }); + + if (!response.ok) { + const errorData = await response.text(); + throw new Error(`Error fetching GitLab repository structure (page ${page}): ${errorData}`); + } + + const pageData = await response.json(); + filesData.push(...pageData); + + const nextPage = response.headers.get('x-next-page'); + morePages = !!nextPage; + page = nextPage ? parseInt(nextPage, 10) : page + 1; + } + + if (!Array.isArray(filesData) || filesData.length === 0) { + throw new Error('Could not fetch repository structure. Repository might be empty or inaccessible.'); + } + + // Step 3: Format file paths + fileTreeData = filesData + .filter((item: { type: string; path: string }) => item.type === 'blob') + .map((item: { type: string; path: string }) => item.path) + .join('\n'); + + // Step 4: Try to fetch README.md content + const readmeUrl = `${projectInfoUrl}/repository/files/README.md/raw`; + try { + const readmeResponse = await fetch(readmeUrl, { headers }); + if (readmeResponse.ok) { + readmeContent = await readmeResponse.text(); + console.log('Successfully fetched GitLab README.md'); + } else { + console.warn(`Could not fetch GitLab README.md status: ${readmeResponse.status}`); + } + } catch (err) { + console.warn(`Error fetching GitLab README.md:`, err); + } + } catch (err) { + console.error("Error during GitLab repository tree retrieval:", err); + throw err; + } + } + else if (effectiveRepoInfo.type === 'bitbucket') { + // Bitbucket API approach + const repoPath = extractUrlPath(effectiveRepoInfo.repoUrl ?? '') ?? `${owner}/${repo}`; + const encodedRepoPath = encodeURIComponent(repoPath); + + // Try to get the file tree for common branch names + let filesData = null; + let apiErrorDetails = ''; + let defaultBranchLocal = ''; + const headers = createBitbucketHeaders(currentToken); + + // First get project info to determine default branch + const projectInfoUrl = `https://api.bitbucket.org/2.0/repositories/${encodedRepoPath}`; + try { + const response = await fetch(projectInfoUrl, { headers }); + + const responseText = await response.text(); + + if (response.ok) { + const projectData = JSON.parse(responseText); + defaultBranchLocal = projectData.mainbranch.name; + // Store the default branch in state + setDefaultBranch(defaultBranchLocal); + + const apiUrl = `https://api.bitbucket.org/2.0/repositories/${encodedRepoPath}/src/${defaultBranchLocal}/?recursive=true&per_page=100`; + try { + const response = await fetch(apiUrl, { + headers + }); + + const structureResponseText = await response.text(); + + if (response.ok) { + filesData = JSON.parse(structureResponseText); + } else { + const errorData = structureResponseText; + apiErrorDetails = `Status: ${response.status}, Response: ${errorData}`; + } + } catch (err) { + console.error(`Network error fetching Bitbucket branch ${defaultBranchLocal}:`, err); + } + } else { + const errorData = responseText; + apiErrorDetails = `Status: ${response.status}, Response: ${errorData}`; + } + } catch (err) { + console.error("Network error fetching Bitbucket project info:", err); + } + + if (!filesData || !Array.isArray(filesData.values) || filesData.values.length === 0) { + if (apiErrorDetails) { + throw new Error(`Could not fetch repository structure. Bitbucket API Error: ${apiErrorDetails}`); + } else { + throw new Error('Could not fetch repository structure. Repository might not exist, be empty or private.'); + } + } + + // Convert files data to a string representation + fileTreeData = filesData.values + .filter((item: { type: string; path: string }) => item.type === 'commit_file') + .map((item: { type: string; path: string }) => item.path) + .join('\n'); + + // Try to fetch README.md content + try { + const headers = createBitbucketHeaders(currentToken); + + const readmeResponse = await fetch(`https://api.bitbucket.org/2.0/repositories/${encodedRepoPath}/src/${defaultBranchLocal}/README.md`, { + headers + }); + + if (readmeResponse.ok) { + readmeContent = await readmeResponse.text(); + } else { + console.warn(`Could not fetch Bitbucket README.md, status: ${readmeResponse.status}`); + } + } catch (err) { + console.warn('Could not fetch Bitbucket README.md, continuing with empty README', err); + } + } + + // Now determine the wiki structure + await determineWikiStructure(fileTreeData, readmeContent, owner, repo); + + } catch (error) { + console.error('Error fetching repository structure:', error); + setIsLoading(false); + setError(error instanceof Error ? error.message : 'An unknown error occurred'); + setLoadingMessage(undefined); + } finally { + // Reset the request in progress flag + setRequestInProgress(false); + } + }, [owner, repo, determineWikiStructure, currentToken, effectiveRepoInfo, requestInProgress, messages.loading]); + + // Function to export wiki content + const exportWiki = useCallback(async (format: 'markdown' | 'json') => { + if (!wikiStructure || Object.keys(generatedPages).length === 0) { + setExportError('No wiki content to export'); + return; + } + + try { + setIsExporting(true); + setExportError(null); + setLoadingMessage(`${language === 'ja' ? 'Wikiを' : 'Exporting wiki as '} ${format} ${language === 'ja' ? 'としてエクスポート中...' : '...'}`); + + // Prepare the pages for export + const pagesToExport = wikiStructure.pages.map(page => { + // Use the generated content if available, otherwise use an empty string + const content = generatedPages[page.id]?.content || 'Content not generated'; + return { + ...page, + content + }; + }); + + // Get repository URL + const repoUrl = getRepoUrl(effectiveRepoInfo); + + // Make API call to export wiki + const response = await fetch(`/export/wiki`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + repo_url: repoUrl, + type: effectiveRepoInfo.type, + pages: pagesToExport, + format + }) + }); + + if (!response.ok) { + const errorText = await response.text().catch(() => 'No error details available'); + throw new Error(`Error exporting wiki: ${response.status} - ${errorText}`); + } + + // Get the filename from the Content-Disposition header if available + const contentDisposition = response.headers.get('Content-Disposition'); + let filename = `${effectiveRepoInfo.repo}_wiki.${format === 'markdown' ? 'md' : 'json'}`; + + if (contentDisposition) { + const filenameMatch = contentDisposition.match(/filename=(.+)/); + if (filenameMatch && filenameMatch[1]) { + filename = filenameMatch[1].replace(/"/g, ''); + } + } + + // Convert the response to a blob and download it + const blob = await response.blob(); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(url); + document.body.removeChild(a); + + } catch (err) { + console.error('Error exporting wiki:', err); + const errorMessage = err instanceof Error ? err.message : 'Unknown error during export'; + setExportError(errorMessage); + } finally { + setIsExporting(false); + setLoadingMessage(undefined); + } + }, [wikiStructure, generatedPages, effectiveRepoInfo, language]); + + // No longer needed as we use the modal directly + + const confirmRefresh = useCallback(async (newToken?: string) => { + setShowModelOptions(false); + setLoadingMessage(messages.loading?.clearingCache || 'Clearing server cache...'); + setIsLoading(true); // Show loading indicator immediately + + try { + const params = new URLSearchParams({ + owner: effectiveRepoInfo.owner, + repo: effectiveRepoInfo.repo, + repo_type: effectiveRepoInfo.type, + language: language, + provider: selectedProviderState, + model: selectedModelState, + is_custom_model: isCustomSelectedModelState.toString(), + custom_model: customSelectedModelState, + comprehensive: isComprehensiveView.toString(), + authorization_code: authCode, + }); + + // Add file filters configuration + if (modelExcludedDirs) { + params.append('excluded_dirs', modelExcludedDirs); + } + if (modelExcludedFiles) { + params.append('excluded_files', modelExcludedFiles); + } + + if(authRequired && !authCode) { + setIsLoading(false); + console.error("Authorization code is required"); + setError('Authorization code is required'); + return; + } + + const response = await fetch(`/api/wiki_cache?${params.toString()}`, { + method: 'DELETE', + headers: { + 'Accept': 'application/json', + } + }); + + if (response.ok) { + console.log('Server-side wiki cache cleared successfully.'); + // Optionally, show a success message for cache clearing if desired + // setLoadingMessage('Cache cleared. Refreshing wiki...'); + } else { + const errorText = await response.text(); + console.warn(`Failed to clear server-side wiki cache (status: ${response.status}): ${errorText}. Proceeding with refresh anyway.`); + // Optionally, inform the user about the cache clear failure but that refresh will still attempt + // setError(\`Cache clear failed: ${errorText}. Trying to refresh...\`); + if(response.status == 401) { + setIsLoading(false); + setLoadingMessage(undefined); + setError('Failed to validate the authorization code'); + console.error('Failed to validate the authorization code') + return; + } + } + } catch (err) { + console.warn('Error calling DELETE /api/wiki_cache:', err); + setIsLoading(false); + setEmbeddingError(false); // Reset embedding error state + // Optionally, inform the user about the cache clear error + // setError(\`Error clearing cache: ${err instanceof Error ? err.message : String(err)}. Trying to refresh...\`); + throw err; + } + + // Update token if provided + if (newToken) { + // Update current token state + setCurrentToken(newToken); + // Update the URL parameters to include the new token + const currentUrl = new URL(window.location.href); + currentUrl.searchParams.set('token', newToken); + window.history.replaceState({}, '', currentUrl.toString()); + } + + // Proceed with the rest of the refresh logic + console.log('Refreshing wiki. Server cache will be overwritten upon new generation if not cleared.'); + + // Clear the localStorage cache (if any remnants or if it was used before this change) + const localStorageCacheKey = getCacheKey(effectiveRepoInfo.owner, effectiveRepoInfo.repo, effectiveRepoInfo.type, language, isComprehensiveView); + localStorage.removeItem(localStorageCacheKey); + + // Reset cache loaded flag + cacheLoadedSuccessfully.current = false; + effectRan.current = false; // Allow the main data loading useEffect to run again + + // Reset all state + setWikiStructure(undefined); + setCurrentPageId(undefined); + setGeneratedPages({}); + setPagesInProgress(new Set()); + setError(null); + setEmbeddingError(false); // Reset embedding error state + setIsLoading(true); // Set loading state for refresh + setLoadingMessage(messages.loading?.initializing || 'Initializing wiki generation...'); + + // Clear any in-progress requests for page content + activeContentRequests.clear(); + // Reset flags related to request processing if they are component-wide + setStructureRequestInProgress(false); // Assuming this flag should be reset + setRequestInProgress(false); // Assuming this flag should be reset + + // Explicitly trigger the data loading process again by re-invoking what the main useEffect does. + // This will first attempt to load from (now hopefully non-existent or soon-to-be-overwritten) server cache, + // then proceed to fetchRepositoryStructure if needed. + // To ensure fetchRepositoryStructure is called if cache is somehow still there or to force a full refresh: + // One option is to directly call fetchRepositoryStructure() if force refresh means bypassing cache check. + // For now, we rely on the standard loadData flow initiated by resetting effectRan and dependencies. + // This will re-trigger the main data loading useEffect. + // No direct call to fetchRepositoryStructure here, let the useEffect handle it based on effectRan.current = false. + }, [effectiveRepoInfo, language, messages.loading, activeContentRequests, selectedProviderState, selectedModelState, isCustomSelectedModelState, customSelectedModelState, modelExcludedDirs, modelExcludedFiles, isComprehensiveView, authCode, authRequired]); + + // Start wiki generation when component mounts + useEffect(() => { + if (effectRan.current === false) { + effectRan.current = true; // Set to true immediately to prevent re-entry due to StrictMode + + const loadData = async () => { + // Try loading from server-side cache first + setLoadingMessage(messages.loading?.fetchingCache || 'Checking for cached wiki...'); + try { + const params = new URLSearchParams({ + owner: effectiveRepoInfo.owner, + repo: effectiveRepoInfo.repo, + repo_type: effectiveRepoInfo.type, + language: language, + comprehensive: isComprehensiveView.toString(), + }); + const response = await fetch(`/api/wiki_cache?${params.toString()}`); + + if (response.ok) { + const cachedData = await response.json(); // Returns null if no cache + if (cachedData && cachedData.wiki_structure && cachedData.generated_pages && Object.keys(cachedData.generated_pages).length > 0) { + console.log('Using server-cached wiki data'); + if(cachedData.model) { + setSelectedModelState(cachedData.model); + } + if(cachedData.provider) { + setSelectedProviderState(cachedData.provider); + } + + // Update repoInfo + if(cachedData.repo) { + setEffectiveRepoInfo(cachedData.repo); + } else if (cachedData.repo_url && !effectiveRepoInfo.repoUrl) { + const updatedRepoInfo = { ...effectiveRepoInfo, repoUrl: cachedData.repo_url }; + setEffectiveRepoInfo(updatedRepoInfo); // Update effective repo info state + console.log('Using cached repo_url:', cachedData.repo_url); + } + + // Ensure the cached structure has sections and rootSections + const cachedStructure = { + ...cachedData.wiki_structure, + sections: cachedData.wiki_structure.sections || [], + rootSections: cachedData.wiki_structure.rootSections || [] + }; + + // If sections or rootSections are missing, create intelligent ones based on page titles + if (!cachedStructure.sections.length || !cachedStructure.rootSections.length) { + const pages = cachedStructure.pages; + const sections: WikiSection[] = []; + const rootSections: string[] = []; + + // Group pages by common prefixes or categories + const pageClusters = new Map(); + + // Define common categories that might appear in page titles + const categories = [ + { id: 'overview', title: 'Overview', keywords: ['overview', 'introduction', 'about'] }, + { id: 'architecture', title: 'Architecture', keywords: ['architecture', 'structure', 'design', 'system'] }, + { id: 'features', title: 'Core Features', keywords: ['feature', 'functionality', 'core'] }, + { id: 'components', title: 'Components', keywords: ['component', 'module', 'widget'] }, + { id: 'api', title: 'API', keywords: ['api', 'endpoint', 'service', 'server'] }, + { id: 'data', title: 'Data Flow', keywords: ['data', 'flow', 'pipeline', 'storage'] }, + { id: 'models', title: 'Models', keywords: ['model', 'ai', 'ml', 'integration'] }, + { id: 'ui', title: 'User Interface', keywords: ['ui', 'interface', 'frontend', 'page'] }, + { id: 'setup', title: 'Setup & Configuration', keywords: ['setup', 'config', 'installation', 'deploy'] } + ]; + + // Initialize clusters with empty arrays + categories.forEach(category => { + pageClusters.set(category.id, []); + }); + + // Add an "Other" category for pages that don't match any category + pageClusters.set('other', []); + + // Assign pages to categories based on title keywords + pages.forEach((page: WikiPage) => { + const title = page.title.toLowerCase(); + let assigned = false; + + // Try to find a matching category + for (const category of categories) { + if (category.keywords.some(keyword => title.includes(keyword))) { + pageClusters.get(category.id)?.push(page); + assigned = true; + break; + } + } + + // If no category matched, put in "Other" + if (!assigned) { + pageClusters.get('other')?.push(page); + } + }); + + // Create sections for non-empty categories + for (const [categoryId, categoryPages] of pageClusters.entries()) { + if (categoryPages.length > 0) { + const category = categories.find(c => c.id === categoryId) || + { id: categoryId, title: categoryId === 'other' ? 'Other' : categoryId.charAt(0).toUpperCase() + categoryId.slice(1) }; + + const sectionId = `section-${categoryId}`; + sections.push({ + id: sectionId, + title: category.title, + pages: categoryPages.map((p: WikiPage) => p.id) + }); + rootSections.push(sectionId); + + // Update page parentId + categoryPages.forEach((page: WikiPage) => { + page.parentId = sectionId; + }); + } + } + + // If we still have no sections (unlikely), fall back to importance-based grouping + if (sections.length === 0) { + const highImportancePages = pages.filter((p: WikiPage) => p.importance === 'high').map((p: WikiPage) => p.id); + const mediumImportancePages = pages.filter((p: WikiPage) => p.importance === 'medium').map((p: WikiPage) => p.id); + const lowImportancePages = pages.filter((p: WikiPage) => p.importance === 'low').map((p: WikiPage) => p.id); + + if (highImportancePages.length > 0) { + sections.push({ + id: 'section-high', + title: 'Core Components', + pages: highImportancePages + }); + rootSections.push('section-high'); + } + + if (mediumImportancePages.length > 0) { + sections.push({ + id: 'section-medium', + title: 'Key Features', + pages: mediumImportancePages + }); + rootSections.push('section-medium'); + } + + if (lowImportancePages.length > 0) { + sections.push({ + id: 'section-low', + title: 'Additional Information', + pages: lowImportancePages + }); + rootSections.push('section-low'); + } + } + + cachedStructure.sections = sections; + cachedStructure.rootSections = rootSections; + } + + setWikiStructure(cachedStructure); + setGeneratedPages(cachedData.generated_pages); + setCurrentPageId(cachedStructure.pages.length > 0 ? cachedStructure.pages[0].id : undefined); + setIsLoading(false); + setEmbeddingError(false); + setLoadingMessage(undefined); + cacheLoadedSuccessfully.current = true; + return; // Exit if cache is successfully loaded + } else { + console.log('No valid wiki data in server cache or cache is empty.'); + } + } else { + // Log error but proceed to fetch structure, as cache is optional + console.error('Error fetching wiki cache from server:', response.status, await response.text()); + } + } catch (error) { + console.error('Error loading from server cache:', error); + // Proceed to fetch structure if cache loading fails + } + + // If we reached here, either there was no cache, it was invalid, or an error occurred + // Proceed to fetch repository structure + fetchRepositoryStructure(); + }; + + loadData(); + + } else { + console.log('Skipping duplicate repository fetch/cache check'); + } + + // Clean up function for this effect is not strictly necessary for loadData, + // but keeping the main unmount cleanup in the other useEffect + }, [effectiveRepoInfo, effectiveRepoInfo.owner, effectiveRepoInfo.repo, effectiveRepoInfo.type, language, fetchRepositoryStructure, messages.loading?.fetchingCache, isComprehensiveView]); + + // Save wiki to server-side cache when generation is complete + useEffect(() => { + const saveCache = async () => { + if (!isLoading && + !error && + wikiStructure && + Object.keys(generatedPages).length > 0 && + Object.keys(generatedPages).length >= wikiStructure.pages.length && + !cacheLoadedSuccessfully.current) { + + const allPagesHaveContent = wikiStructure.pages.every(page => + generatedPages[page.id] && generatedPages[page.id].content && generatedPages[page.id].content !== 'Loading...'); + + if (allPagesHaveContent) { + console.log('Attempting to save wiki data to server cache via Next.js proxy'); + + try { + // Make sure wikiStructure has sections and rootSections + const structureToCache = { + ...wikiStructure, + sections: wikiStructure.sections || [], + rootSections: wikiStructure.rootSections || [] + }; + const dataToCache = { + repo: effectiveRepoInfo, + language: language, + comprehensive: isComprehensiveView, + wiki_structure: structureToCache, + generated_pages: generatedPages, + provider: selectedProviderState, + model: selectedModelState + }; + const response = await fetch(`/api/wiki_cache`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(dataToCache), + }); + + if (response.ok) { + console.log('Wiki data successfully saved to server cache'); + } else { + console.error('Error saving wiki data to server cache:', response.status, await response.text()); + } + } catch (error) { + console.error('Error saving to server cache:', error); + } + } + } + }; + + saveCache(); + }, [isLoading, error, wikiStructure, generatedPages, effectiveRepoInfo.owner, effectiveRepoInfo.repo, effectiveRepoInfo.type, effectiveRepoInfo.repoUrl, repoUrl, language, isComprehensiveView]); + + const handlePageSelect = (pageId: string) => { + if (currentPageId != pageId) { + setCurrentPageId(pageId) + } + }; + + const [isModelSelectionModalOpen, setIsModelSelectionModalOpen] = useState(false); + + return ( +
    + + +
    +
    +
    + + {messages.repoPage?.home || 'Home'} + +
    +
    +
    + +
    + {isLoading ? ( +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    + {loadingMessage || messages.common?.loading || 'Loading...'} + {isExporting && (messages.loading?.preparingDownload || ' Please wait while we prepare your download...')} +

    + + {/* Progress bar for page generation */} + {wikiStructure && ( +
    +
    +
    +
    +

    + {language === 'ja' + ? `${wikiStructure.pages.length}ページ中${wikiStructure.pages.length - pagesInProgress.size}ページ完了` + : messages.repoPage?.pagesCompleted + ? messages.repoPage.pagesCompleted + .replace('{completed}', (wikiStructure.pages.length - pagesInProgress.size).toString()) + .replace('{total}', wikiStructure.pages.length.toString()) + : `${wikiStructure.pages.length - pagesInProgress.size} of ${wikiStructure.pages.length} pages completed`} +

    + + {/* Show list of in-progress pages */} + {pagesInProgress.size > 0 && ( +
    +

    + {messages.repoPage?.currentlyProcessing || 'Currently processing:'} +

    +
      + {Array.from(pagesInProgress).slice(0, 3).map(pageId => { + const page = wikiStructure.pages.find(p => p.id === pageId); + return page ?
    • {page.title}
    • : null; + })} + {pagesInProgress.size > 3 && ( +
    • + {language === 'ja' + ? `...他に${pagesInProgress.size - 3}ページ` + : messages.repoPage?.andMorePages + ? messages.repoPage.andMorePages.replace('{count}', (pagesInProgress.size - 3).toString()) + : `...and ${pagesInProgress.size - 3} more`} +
    • + )} +
    +
    + )} +
    + )} +
    + ) : error ? ( +
    +
    + + {messages.repoPage?.errorTitle || messages.common?.error || 'Error'} +
    +

    {error}

    +

    + {embeddingError ? ( + messages.repoPage?.embeddingErrorDefault || 'This error is related to the document embedding system used for analyzing your repository. Please verify your embedding model configuration, API keys, and try again. If the issue persists, consider switching to a different embedding provider in the model settings.' + ) : ( + messages.repoPage?.errorMessageDefault || 'Please check that your repository exists and is public. Valid formats are "owner/repo", "https://github.com/owner/repo", "https://gitlab.com/owner/repo", "https://bitbucket.org/owner/repo", or local folder paths like "C:\\path\\to\\folder" or "/path/to/folder".' + )} +

    +
    + + + {messages.repoPage?.backToHome || 'Back to Home'} + +
    +
    + ) : wikiStructure ? ( +
    + {/* Wiki Navigation */} +
    +

    {wikiStructure.title}

    +

    {wikiStructure.description}

    + + {/* Display repository info */} +
    + {effectiveRepoInfo.type === 'local' ? ( +
    + + {effectiveRepoInfo.localPath} +
    + ) : ( + <> + {effectiveRepoInfo.type === 'github' ? ( + + ) : effectiveRepoInfo.type === 'gitlab' ? ( + + ) : ( + + )} + + {effectiveRepoInfo.owner}/{effectiveRepoInfo.repo} + + + )} +
    + + {/* Wiki Type Indicator */} +
    + Wiki Type: + + {isComprehensiveView + ? (messages.form?.comprehensive || 'Comprehensive') + : (messages.form?.concise || 'Concise')} + +
    + + {/* Refresh Wiki button */} +
    + +
    + + {/* Export buttons */} + {Object.keys(generatedPages).length > 0 && ( +
    +

    + {messages.repoPage?.exportWiki || 'Export Wiki'} +

    +
    + + +
    + {exportError && ( +
    + {exportError} +
    + )} +
    + )} + +

    + {messages.repoPage?.pages || 'Pages'} +

    + +
    + + {/* Wiki Content */} +
    + {currentPageId && generatedPages[currentPageId] ? ( +
    +

    + {generatedPages[currentPageId].title} +

    + + + +
    + +
    + + {generatedPages[currentPageId].relatedPages.length > 0 && ( +
    +

    + {messages.repoPage?.relatedPages || 'Related Pages:'} +

    +
    + {generatedPages[currentPageId].relatedPages.map(relatedId => { + const relatedPage = wikiStructure.pages.find(p => p.id === relatedId); + return relatedPage ? ( + + ) : null; + })} +
    +
    + )} +
    + ) : ( +
    +
    +
    + +
    +

    + {messages.repoPage?.selectPagePrompt || 'Select a page from the navigation to view its content'} +

    +
    + )} +
    +
    + ) : null} +
    + +
    +
    +

    + {messages.footer?.copyright || 'DeepWiki - Generate Wiki from GitHub/Gitlab/Bitbucket repositories'} +

    + +
    +
    + + {/* Floating Chat Button */} + {!isLoading && wikiStructure && ( + + )} + + {/* Ask Modal - Always render but conditionally show/hide */} +
    +
    +
    + +
    +
    + (askComponentRef.current = ref)} + /> +
    +
    +
    + + setIsModelSelectionModalOpen(false)} + provider={selectedProviderState} + setProvider={setSelectedProviderState} + model={selectedModelState} + setModel={setSelectedModelState} + isCustomModel={isCustomSelectedModelState} + setIsCustomModel={setIsCustomSelectedModelState} + customModel={customSelectedModelState} + setCustomModel={setCustomSelectedModelState} + isComprehensiveView={isComprehensiveView} + setIsComprehensiveView={setIsComprehensiveView} + showFileFilters={true} + excludedDirs={modelExcludedDirs} + setExcludedDirs={setModelExcludedDirs} + excludedFiles={modelExcludedFiles} + setExcludedFiles={setModelExcludedFiles} + includedDirs={modelIncludedDirs} + setIncludedDirs={setModelIncludedDirs} + includedFiles={modelIncludedFiles} + setIncludedFiles={setModelIncludedFiles} + onApply={confirmRefresh} + showWikiType={true} + showTokenInput={effectiveRepoInfo.type !== 'local' && !currentToken} // Show token input if not local and no current token + repositoryType={effectiveRepoInfo.type as 'github' | 'gitlab' | 'bitbucket'} + authRequired={authRequired} + authCode={authCode} + setAuthCode={setAuthCode} + isAuthLoading={isAuthLoading} + /> +
    + ); +} diff --git a/reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/slides/page.tsx b/reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/slides/page.tsx new file mode 100644 index 0000000..8b487fa --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/slides/page.tsx @@ -0,0 +1,1299 @@ +'use client'; + +import React, { useCallback, useState, useEffect, useRef, useMemo } from 'react'; +import { useParams, useSearchParams } from 'next/navigation'; +import Link from 'next/link'; +import { FaArrowLeft, FaSync, FaDownload, FaArrowRight, FaArrowUp, FaTimes } from 'react-icons/fa'; +import ThemeToggle from '@/components/theme-toggle'; +import { useLanguage } from '@/contexts/LanguageContext'; +import { RepoInfo } from '@/types/repoinfo'; +import getRepoUrl from '@/utils/getRepoUrl'; + +// Helper function to add tokens and other parameters to request body +const addTokensToRequestBody = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + requestBody: Record, + token: string, + repoType: string, + provider: string = '', + model: string = '', + isCustomModel: boolean = false, + customModel: string = '', + language: string = 'en', +) => { + if (token !== '') { + requestBody.token = token; + } + + // Add provider-based model selection parameters + requestBody.provider = provider; + requestBody.model = model; + if (isCustomModel && customModel) { + requestBody.custom_model = customModel; + } + + requestBody.language = language; +}; + +interface Slide { + id: string; + title: string; + content: string; + html: string; +} + +export default function SlidesPage() { + // Get route parameters and search params + const params = useParams(); + const searchParams = useSearchParams(); + + // Extract owner and repo from route params + const owner = params.owner as string; + const repo = params.repo as string; + + // Extract tokens from search params + const token = searchParams.get('token') || ''; + const repoType = searchParams.get('type') || 'github'; + const localPath = searchParams.get('local_path') ? decodeURIComponent(searchParams.get('local_path') || '') : undefined; + const repoUrl = searchParams.get('repo_url') ? decodeURIComponent(searchParams.get('repo_url') || '') : undefined; + const providerParam = searchParams.get('provider') || ''; + const modelParam = searchParams.get('model') || ''; + const isCustomModelParam = searchParams.get('is_custom_model') === 'true'; + const customModelParam = searchParams.get('custom_model') || ''; + const language = searchParams.get('language') || 'en'; + + // Import language context for translations + const { messages } = useLanguage(); + + // Initialize repo info with useMemo to prevent unnecessary re-renders + const repoInfo = useMemo(() => ({ + owner, + repo, + type: repoType, + token: token || null, + localPath: localPath || null, + repoUrl: repoUrl || null + }), [owner, repo, repoType, token, localPath, repoUrl]); + + // State variables + const [isLoading, setIsLoading] = useState(false); + const [loadingMessage, setLoadingMessage] = useState( + messages.loading?.initializing || 'Initializing slides generation...' + ); + const [error, setError] = useState(null); + const [slides, setSlides] = useState([]); + const [currentSlideIndex, setCurrentSlideIndex] = useState(0); + const [isExporting, setIsExporting] = useState(false); + const [exportError, setExportError] = useState(null); + const [isFullscreen, setIsFullscreen] = useState(false); + + // Define a type for the wiki content + interface WikiPage { + id: string; + title: string; + content: string; + importance: string; + filePaths: string[]; + relatedPages: string[]; + } + + interface WikiSection { + id: string; + title: string; + pages: string[]; + subsections: string[]; + } + + interface WikiStructure { + description: string; + pages: WikiPage[]; + sections: WikiSection[]; + rootSections: string[]; + } + + interface WikiCacheData { + wiki_structure: WikiStructure; + generated_pages: Record; + } + + const [cachedWikiContent, setCachedWikiContent] = useState(null); + + // Function to fetch cached wiki content + const fetchCachedWikiContent = useCallback(async () => { + try { + const params = new URLSearchParams({ + owner: repoInfo.owner, + repo: repoInfo.repo, + repo_type: repoInfo.type, + language: language, + }); + const response = await fetch(`/api/wiki_cache?${params.toString()}`); + + if (response.ok) { + const cachedData = await response.json(); + if (cachedData && cachedData.wiki_structure && cachedData.generated_pages && + Object.keys(cachedData.generated_pages).length > 0) { + console.log('Successfully fetched cached wiki data for slides generation'); + setCachedWikiContent(cachedData); + return cachedData; + } else { + console.log('No valid wiki data in server cache or cache is empty.'); + return null; + } + } else { + console.error('Error fetching wiki cache from server:', response.status); + return null; + } + } catch (error) { + console.error('Error loading from server cache:', error); + return null; + } + }, [repoInfo.owner, repoInfo.repo, repoInfo.type, language]); + + // Generate slides content + const generateSlidesContent = useCallback(async () => { + if (isLoading) return; + + setIsLoading(true); + setError(null); + // Clear previous content + setSlides([]); + setCurrentSlideIndex(0); + setLoadingMessage(messages.loading?.generatingSlides || 'Generating slides...'); + + try { + // Get repository URL + const repoUrl = getRepoUrl(repoInfo); + + // Fetch cached wiki content if not already available + let wikiData = cachedWikiContent; + if (!wikiData) { + wikiData = await fetchCachedWikiContent(); + } + + // We'll just pass the entire wiki data to the LLM without complex processing + let wikiContent = ''; + + if (wikiData && wikiData.wiki_structure && wikiData.generated_pages) { + // Add the wiki structure description + wikiContent += `## Project Overview\n${wikiData.wiki_structure.description || ''}\n\n`; + + // Add all wiki pages content + const pages = wikiData.wiki_structure.pages || []; + const generatedPages = wikiData.generated_pages || {}; + + // Limit the total content to avoid token limits + let totalContentLength = 0; + const maxContentLength = 30000; // Approximate limit to avoid token issues + + // First add high importance pages + const highImportancePages = pages.filter(page => page.importance === 'high'); + for (const page of highImportancePages) { + if (generatedPages[page.id] && generatedPages[page.id].content) { + const content = `## ${page.title}\n${generatedPages[page.id].content}\n\n`; + wikiContent += content; + totalContentLength += content.length; + + if (totalContentLength > maxContentLength) break; + } + } + + // Then add other pages if we still have space + if (totalContentLength < maxContentLength) { + for (const page of pages) { + // Skip high importance pages we've already added + if (page.importance === 'high') continue; + + if (generatedPages[page.id] && generatedPages[page.id].content) { + const content = `## ${page.title}\n${generatedPages[page.id].content}\n\n`; + + // Check if adding this content would exceed our limit + if (totalContentLength + content.length > maxContentLength) { + // If it would exceed, just add a summary + const summaryMatch = generatedPages[page.id].content.match(/# .*?\n\n(.*?)(\n\n|$)/); + const summary = summaryMatch ? summaryMatch[1].trim() : 'No summary available'; + const summaryContent = `## ${page.title}\n${summary}\n\n`; + + wikiContent += summaryContent; + totalContentLength += summaryContent.length; + } else { + // Otherwise add the full content + wikiContent += content; + totalContentLength += content.length; + } + + if (totalContentLength > maxContentLength) break; + } + } + } + } + + // First, get a plan for the slides + const planRequestBody: Record = { + repo_url: repoUrl, + type: repoInfo.type, + messages: [{ + role: 'user', + content: `Create an engaging outline for a high-quality marketing slide presentation about the ${owner}/${repo} repository. + +Based on this wiki content: +${wikiContent} + +I need a numbered list of 7-8 creative slide titles with brief descriptions for a professional marketing presentation. Think of this as a pitch deck that would impress potential users or investors. + +Focus on: +- Compelling value propositions +- Unique selling points +- Impressive features and capabilities +- Real-world applications and benefits +- Visually interesting concepts that can be represented creatively + +For example, instead of generic titles like "Introduction" or "Features", use more engaging titles like: +1. "Revolutionizing Development with ${repo}" +2. "Unlock Powerful Capabilities with Our Innovative Architecture" +3. "How ${repo} Transforms Your Workflow" + +Give me the numbered list with brief descriptions for each slide. Be creative but professional.` + }] + }; + + // Add tokens if available + addTokensToRequestBody(planRequestBody, token, repoInfo.type, providerParam, modelParam, isCustomModelParam, customModelParam, language); + + // Use WebSocket for communication + let planContent = ''; + + try { + // Create WebSocket URL from the server base URL + const serverBaseUrl = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + const wsBaseUrl = serverBaseUrl.replace(/^http/, 'ws')? serverBaseUrl.replace(/^https/, 'wss'): serverBaseUrl.replace(/^http/, 'ws'); + const wsUrl = `${wsBaseUrl}/ws/chat`; + + // Create a new WebSocket connection + const ws = new WebSocket(wsUrl); + + // Create a single promise that handles the entire WebSocket lifecycle + await new Promise((resolve, reject) => { + let isResolved = false; + + // If the connection doesn't open or complete within 10 seconds, fall back to HTTP + const timeout = setTimeout(() => { + if (!isResolved) { + isResolved = true; + // Try to close the WebSocket if it's still open + if (ws.readyState === WebSocket.OPEN) { + ws.close(); + } + reject(new Error('WebSocket connection timeout')); + } + }, 10000); + + // Set up event handlers + ws.onopen = () => { + console.log('WebSocket connection established for slide plan'); + // Send the request as JSON + ws.send(JSON.stringify(planRequestBody)); + // Don't resolve here, wait for the complete response + }; + + ws.onmessage = (event) => { + const chunk = event.data; + planContent += chunk; + }; + + ws.onclose = () => { + clearTimeout(timeout); + console.log('WebSocket connection closed for slide plan'); + if (!isResolved) { + isResolved = true; + resolve(); + } + }; + + ws.onerror = (error) => { + console.error('WebSocket error:', error); + if (!isResolved) { + isResolved = true; + reject(new Error('WebSocket connection failed')); + } + }; + }); + } catch (wsError) { + console.error('WebSocket error, falling back to HTTP:', wsError); + + // Fall back to HTTP if WebSocket fails + const planResponse = await fetch(`/api/chat/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(planRequestBody) + }); + + if (!planResponse.ok) { + throw new Error(`Error generating slide plan: ${planResponse.status}`); + } + + // Process the plan response + planContent = ''; + const planReader = planResponse.body?.getReader(); + const planDecoder = new TextDecoder(); + + if (!planReader) { + throw new Error('Failed to get plan response reader'); + } + + try { + while (true) { + const { done, value } = await planReader.read(); + if (done) break; + const chunk = planDecoder.decode(value, { stream: true }); + planContent += chunk; + } + // Ensure final decoding + const finalChunk = planDecoder.decode(); + planContent += finalChunk; + } catch (readError) { + console.error('Error reading plan stream:', readError); + throw new Error('Error processing plan response stream'); + } + } + + // Log the plan content for debugging + console.log("Received slide plan:", planContent); + + // Try multiple regex patterns to extract slide plan + let slideMatches: RegExpExecArray[] = []; + + // Pattern 1: Standard numbered list with periods (1. Title: Description) + const pattern1 = /\d+\.\s+(.*?)(?=\n\d+\.|\n*$)/g; + let match; + while ((match = pattern1.exec(planContent)) !== null) { + slideMatches.push(match); + } + + // Pattern 2: Numbered list with parentheses (1) Title: Description + if (slideMatches.length === 0) { + const pattern2 = /\d+\)\s+(.*?)(?=\n\d+\)|\n*$)/g; + while ((match = pattern2.exec(planContent)) !== null) { + slideMatches.push(match); + } + } + + // Pattern 3: Look for lines with "Slide" followed by number + if (slideMatches.length === 0) { + const pattern3 = /Slide\s+\d+\s*:?\s*(.*?)(?=\nSlide|\n*$)/gi; + while ((match = pattern3.exec(planContent)) !== null) { + slideMatches.push(match); + } + } + + // Pattern 4: Look for any lines with a title that might be a slide + if (slideMatches.length === 0) { + const pattern4 = /^([^:\n]+)(?::\s*(.*?))?$/gm; + while ((match = pattern4.exec(planContent)) !== null) { + // Filter out very short lines or lines that look like instructions + if (match[1].length > 3 && !match[1].toLowerCase().includes("please") && !match[1].toLowerCase().includes("here")) { + slideMatches.push(match); + } + } + } + + // If we still don't have matches, create some default slides + if (slideMatches.length === 0) { + console.warn("Could not extract slide plan from response, using default slides"); + + // Create default slides + const defaultSlides = [ + `Title Slide: Introduction to ${repo}`, + `Overview: Key features and purpose of ${repo}`, + `Architecture: System components and structure`, + `Features: Main capabilities and functionalities`, + `Implementation: How it works and technical details`, + `Use Cases: How to use ${repo} effectively`, + `Conclusion: Summary and next steps` + ]; + + // Convert to match format + slideMatches = defaultSlides.map((slide, index) => { + const mockMatch = ["", slide] as unknown as RegExpExecArray; + mockMatch.index = index; + mockMatch.input = slide; + return mockMatch; + }); + } + + console.log(`Found ${slideMatches.length} slides in the plan`); + + + // Now generate each slide one by one + const generatedSlides: Slide[] = []; + let slideCounter = 1; + + for (const slideMatch of slideMatches) { + const slideTitle = slideMatch[1].split(':')[0].trim(); + const slideDescription = slideMatch[1].includes(':') ? slideMatch[1].split(':')[1].trim() : ''; + + setLoadingMessage(`Generating slide ${slideCounter} of ${slideMatches.length}: ${slideTitle}`); + + // Create a request for this specific slide + const slideRequestBody: Record = { + repo_url: repoUrl, + type: repoInfo.type, + messages: [{ + role: 'user', + content: `Create a single HTML slide about the ${owner}/${repo} repository with the title "${slideTitle}". + +This is slide ${slideCounter} of ${slideMatches.length} in the presentation. +${slideDescription ? `The slide should cover: ${slideDescription}` : ''} + +Use the following wiki content as reference: +${wikiContent} + +I need ONLY the HTML for this slide. The slide should maintain a consistent dark theme with gradients and professional styling, but BE CREATIVE with the content and layout. + +IMPORTANT LAYOUT REQUIREMENTS: +1. The slide MUST be designed for a 16:9 HORIZONTAL layout (landscape orientation) +2. All content MUST fit within the visible area without requiring scrolling +3. Text must be properly sized and positioned for readability in a presentation context +4. Content should be well-structured with clear visual hierarchy +5. Use grid or flexbox layouts to ensure proper horizontal organization of content +6. Limit text content to what can be comfortably read from a distance + +MARKETING QUALITY: +Create a genuinely high-quality marketing slide that would impress potential users or investors. Use compelling language, impactful visuals, and professional marketing techniques. Think of this as a slide for a professional pitch deck or product showcase. + +You can use: +- Two or three-column layouts for better horizontal space utilization +- Engaging marketing copy with concise bullet points (no more than 4-5 per slide) +- Visual metaphors and analogies positioned to the side of text content +- Charts, diagrams, or code snippets when relevant (positioned appropriately) +- Icons from Font Awesome (already included) +- Creative use of gradients, shadows, and visual elements + +The slide should maintain the dark theme aesthetic but can be uniquely designed. Use creative HTML/CSS to make the slide visually impressive while ensuring all content fits properly in the horizontal layout. + +Here's a basic structure to build upon (but feel free to be creative): + +
    +
    +
    + +
    + +
    +

    ${slideTitle}

    +
    + +
    + +
    + +
    +
    + +
    +
    +
    +
    + + +Please return ONLY the HTML with no markdown formatting or code blocks. Just the raw HTML for the slide.` + }] + }; + + // Add tokens if available + addTokensToRequestBody(slideRequestBody, token, repoInfo.type, providerParam, modelParam, isCustomModelParam, customModelParam, language); + + // Use WebSocket for communication + let slideContent = ''; + + try { + // Create WebSocket URL from the server base URL + const serverBaseUrl = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + const wsBaseUrl = serverBaseUrl.replace(/^http/, 'ws')? serverBaseUrl.replace(/^https/, 'wss'): serverBaseUrl.replace(/^http/, 'ws'); + const wsUrl = `${wsBaseUrl}/ws/chat`; + + // Create a new WebSocket connection + const ws = new WebSocket(wsUrl); + + // Create a single promise that handles the entire WebSocket lifecycle + await new Promise((resolve, reject) => { + let isResolved = false; + + // If the connection doesn't open or complete within 10 seconds, fall back to HTTP + const timeout = setTimeout(() => { + if (!isResolved) { + isResolved = true; + // Try to close the WebSocket if it's still open + if (ws.readyState === WebSocket.OPEN) { + ws.close(); + } + reject(new Error('WebSocket connection timeout')); + } + }, 10000); + + // Set up event handlers + ws.onopen = () => { + console.log(`WebSocket connection established for slide ${slideCounter}`); + // Send the request as JSON + ws.send(JSON.stringify(slideRequestBody)); + // Don't resolve here, wait for the complete response + }; + + ws.onmessage = (event) => { + const chunk = event.data; + slideContent += chunk; + }; + + ws.onclose = () => { + clearTimeout(timeout); + console.log(`WebSocket connection closed for slide ${slideCounter}`); + if (!isResolved) { + isResolved = true; + resolve(); + } + }; + + ws.onerror = (error) => { + console.error('WebSocket error:', error); + if (!isResolved) { + isResolved = true; + reject(new Error('WebSocket connection failed')); + } + }; + }); + } catch (wsError) { + console.error('WebSocket error, falling back to HTTP:', wsError); + + // Fall back to HTTP if WebSocket fails + const slideResponse = await fetch(`/api/chat/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(slideRequestBody) + }); + + if (!slideResponse.ok) { + throw new Error(`Error generating slide ${slideCounter}: ${slideResponse.status}`); + } + + // Process the slide response + slideContent = ''; + const slideReader = slideResponse.body?.getReader(); + const slideDecoder = new TextDecoder(); + + if (!slideReader) { + throw new Error(`Failed to get reader for slide ${slideCounter}`); + } + + try { + while (true) { + const { done, value } = await slideReader.read(); + if (done) break; + const chunk = slideDecoder.decode(value, { stream: true }); + slideContent += chunk; + } + // Ensure final decoding + const finalChunk = slideDecoder.decode(); + slideContent += finalChunk; + } catch (readError) { + console.error(`Error reading slide ${slideCounter} stream:`, readError); + throw new Error(`Error processing slide ${slideCounter} response stream`); + } + } + + // Extract HTML content - look for content between HTML tags or code blocks + let slideHtml = ''; + + console.log(`Processing slide ${slideCounter} response`); + + // Try to extract from code blocks if present + const codeBlockMatch = slideContent.match(/```(?:html)?\s*([\s\S]*?)\s*```/); + if (codeBlockMatch) { + slideHtml = codeBlockMatch[1]; + console.log("Extracted HTML from code block"); + } + // Try to extract content between
    and closing
    + else if (slideContent.includes('
    \s*<\/div>/); + if (divMatch) { + slideHtml = divMatch[0]; + console.log("Extracted HTML from div tags"); + } + } + // Try to extract any HTML-like content + else if (slideContent.includes('<') && slideContent.includes('>')) { + const htmlTagMatch = slideContent.match(/<[\s\S]*?>/); + if (htmlTagMatch) { + // Find the first HTML tag + const firstTag = htmlTagMatch[0].match(/<([a-z][a-z0-9]*)/i); + if (firstTag && firstTag[1]) { + const tagName = firstTag[1]; + // Try to extract everything from this opening tag to its closing tag + const fullTagRegex = new RegExp(`<${tagName}[\\s\\S]*?<\\/${tagName}>`, 'i'); + const fullTagMatch = slideContent.match(fullTagRegex); + if (fullTagMatch) { + slideHtml = fullTagMatch[0]; + console.log(`Extracted HTML using tag matching for ${tagName}`); + } + } + } + } + + // If we still don't have HTML, use the raw content + if (!slideHtml) { + console.log("Using raw content as HTML"); + slideHtml = slideContent; + } + + // Add default styling if not present + if (!slideHtml.includes(' + + + + + + `; + } + + // Create the slide object + const slide: Slide = { + id: `slide-${slideCounter}`, + title: slideTitle, + content: slideDescription || slideTitle, + html: slideHtml + }; + + // Add to our slides array + generatedSlides.push(slide); + + // Update the state with the slides we have so far + setSlides([...generatedSlides]); + + slideCounter++; + } + + // Set the final slides + setSlides(generatedSlides); + + } catch (err) { + console.error('Error generating slides content:', err); + setError(err instanceof Error ? err.message : 'An unknown error occurred'); + } finally { + setIsLoading(false); + setLoadingMessage(undefined); + } + }, [owner, repo, repoInfo, token, providerParam, modelParam, isCustomModelParam, customModelParam, language, isLoading, messages.loading, cachedWikiContent, fetchCachedWikiContent]); + + // Export slides content + const exportSlides = useCallback(async () => { + if (!slides || slides.length === 0) { + setExportError('No slides to export'); + return; + } + + try { + setIsExporting(true); + setExportError(null); + + // Create a full HTML document with all slides + const htmlContent = ` + + + + + + ${repo} Slides + + + + + + + + ${slides.map(slide => `
    ${slide.html}
    `).join('\n')} + + + + + + + + `; + + // Create a blob with the HTML content + const blob = new Blob([htmlContent], { type: 'text/html' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `${repo}_slides.html`; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(url); + document.body.removeChild(a); + + } catch (err) { + console.error('Error exporting slides:', err); + setExportError(err instanceof Error ? err.message : 'An unknown error occurred'); + } finally { + setIsExporting(false); + } + }, [slides, repo, language]); + + // Navigation functions + const goToNextSlide = useCallback(() => { + if (currentSlideIndex < slides.length - 1) { + setCurrentSlideIndex(prev => prev + 1); + } + }, [currentSlideIndex, slides.length]); + + const goToPrevSlide = useCallback(() => { + if (currentSlideIndex > 0) { + setCurrentSlideIndex(prev => prev - 1); + } + }, [currentSlideIndex]); + + const toggleFullscreen = useCallback(() => { + setIsFullscreen(prev => !prev); + }, []); + + // Handle keyboard navigation + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'ArrowRight' || e.key === 'Space') { + goToNextSlide(); + } else if (e.key === 'ArrowLeft') { + goToPrevSlide(); + } else if (e.key === 'f' || e.key === 'F') { + toggleFullscreen(); + } else if (e.key === 'Escape' && isFullscreen) { + setIsFullscreen(false); + } + }; + + window.addEventListener('keydown', handleKeyDown); + return () => { + window.removeEventListener('keydown', handleKeyDown); + }; + }, [goToNextSlide, goToPrevSlide, toggleFullscreen, isFullscreen]); + + // Track if we've already generated content + const contentGeneratedRef = useRef(false); + + // Generate slides content on page load, but only once + useEffect(() => { + if (!contentGeneratedRef.current) { + contentGeneratedRef.current = true; + + // First fetch the cached wiki content, then generate the slides + (async () => { + await fetchCachedWikiContent(); + generateSlidesContent(); + })(); + } + }, [generateSlidesContent, fetchCachedWikiContent]); + + return ( +
    + {/* Header - Hide in fullscreen mode */} + {!isFullscreen && ( +
    +
    +
    + + + {messages.slides?.backToWiki || 'Back to Wiki'} + +

    + {messages.slides?.title || 'Slides'}: {repo} +

    +
    +
    + + + + +
    +
    +
    + )} + + {/* Main content */} +
    + {isLoading && !slides.length ? ( +
    +
    +

    {loadingMessage}

    +
    + ) : error ? ( +
    +

    {messages.common?.error || 'Error'}

    +

    {error}

    +
    + ) : slides.length > 0 ? ( +
    + {/* Slide content */} +
    + {exportError && ( +
    +

    {exportError}

    +
    + )} + + {/* Current slide */} +
    + {/* Include Font Awesome for icons */} + +
    +
    +
    + + {/* Navigation controls */} +
    + + +
    + Slide {currentSlideIndex + 1} of {slides.length} +
    + + + + {isFullscreen && ( + + )} +
    +
    + ) : ( +
    +

    {messages.slides?.noSlides || 'No slides generated yet. Click the refresh button to generate slides.'}

    +
    + )} +
    +
    + ); +} diff --git a/reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/workshop/page.tsx b/reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/workshop/page.tsx new file mode 100644 index 0000000..7a1e29c --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/[owner]/[repo]/workshop/page.tsx @@ -0,0 +1,633 @@ +'use client'; + +import React, { useCallback, useState, useEffect, useRef, useMemo } from 'react'; +import { useParams, useSearchParams } from 'next/navigation'; +import Link from 'next/link'; +import { FaArrowLeft, FaSync, FaDownload } from 'react-icons/fa'; +import ThemeToggle from '@/components/theme-toggle'; +import Markdown from '@/components/Markdown'; +import { useLanguage } from '@/contexts/LanguageContext'; +import { RepoInfo } from '@/types/repoinfo'; +import getRepoUrl from '@/utils/getRepoUrl'; + +// Helper function to add tokens and other parameters to request body +const addTokensToRequestBody = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + requestBody: Record, + token: string, + repoType: string, + provider: string = '', + model: string = '', + isCustomModel: boolean = false, + customModel: string = '', + language: string = 'en', +) => { + if (token !== '') { + requestBody.token = token; + } + + // Add provider-based model selection parameters + requestBody.provider = provider; + requestBody.model = model; + if (isCustomModel && customModel) { + requestBody.custom_model = customModel; + } + + requestBody.language = language; +}; + +export default function WorkshopPage() { + // Get route parameters and search params + const params = useParams(); + const searchParams = useSearchParams(); + + // Extract owner and repo from route params + const owner = params.owner as string; + const repo = params.repo as string; + + // Extract tokens from search params + const token = searchParams.get('token') || ''; + const repoType = searchParams.get('type') || 'github'; + const localPath = searchParams.get('local_path') ? decodeURIComponent(searchParams.get('local_path') || '') : undefined; + const repoUrl = searchParams.get('repo_url') ? decodeURIComponent(searchParams.get('repo_url') || '') : undefined; + const providerParam = searchParams.get('provider') || ''; + const modelParam = searchParams.get('model') || ''; + const isCustomModelParam = searchParams.get('is_custom_model') === 'true'; + const customModelParam = searchParams.get('custom_model') || ''; + const language = searchParams.get('language') || 'en'; + + // Import language context for translations + const { messages } = useLanguage(); + + // Initialize repo info with useMemo to prevent unnecessary re-renders + const repoInfo = useMemo(() => ({ + owner, + repo, + type: repoType, + token: token || null, + localPath: localPath || null, + repoUrl: repoUrl || null + }), [owner, repo, repoType, token, localPath, repoUrl]); + + // State variables + const [isLoading, setIsLoading] = useState(false); + const [loadingMessage, setLoadingMessage] = useState( + messages.loading?.initializing || 'Initializing workshop generation...' + ); + const [error, setError] = useState(null); + const [workshopContent, setWorkshopContent] = useState(''); + const [isExporting, setIsExporting] = useState(false); + const [exportError, setExportError] = useState(null); + // Define a type for the wiki content + interface WikiPage { + id: string; + title: string; + content: string; + importance: string; + filePaths: string[]; + relatedPages: string[]; + } + + interface WikiSection { + id: string; + title: string; + pages: string[]; + subsections: string[]; + } + + interface WikiStructure { + description: string; + pages: WikiPage[]; + sections: WikiSection[]; + rootSections: string[]; + } + + interface WikiCacheData { + wiki_structure: WikiStructure; + generated_pages: Record; + } + + const [cachedWikiContent, setCachedWikiContent] = useState(null); + + // Function to fetch cached wiki content + const fetchCachedWikiContent = useCallback(async () => { + try { + const params = new URLSearchParams({ + owner: repoInfo.owner, + repo: repoInfo.repo, + repo_type: repoInfo.type, + language: language, + }); + const response = await fetch(`/api/wiki_cache?${params.toString()}`); + + if (response.ok) { + const cachedData = await response.json(); + if (cachedData && cachedData.wiki_structure && cachedData.generated_pages && + Object.keys(cachedData.generated_pages).length > 0) { + console.log('Successfully fetched cached wiki data for workshop generation'); + setCachedWikiContent(cachedData); + return cachedData; + } else { + console.log('No valid wiki data in server cache or cache is empty.'); + return null; + } + } else { + console.error('Error fetching wiki cache from server:', response.status); + return null; + } + } catch (error) { + console.error('Error loading from server cache:', error); + return null; + } + }, [repoInfo.owner, repoInfo.repo, repoInfo.type, language]); + + // Generate workshop content + const generateWorkshopContent = useCallback(async () => { + if (isLoading) return; + + setIsLoading(true); + setError(null); + // Clear previous content + setWorkshopContent(''); + setLoadingMessage(messages.loading?.generatingWorkshop || 'Generating workshop content...'); + + try { + // Get repository URL + const repoUrl = getRepoUrl(repoInfo); + + // Fetch cached wiki content if not already available + let wikiData = cachedWikiContent; + if (!wikiData) { + wikiData = await fetchCachedWikiContent(); + } + + // We'll just pass the entire wiki data to the LLM without complex processing + let wikiContent = ''; + + if (wikiData && wikiData.wiki_structure && wikiData.generated_pages) { + // Add the wiki structure description + wikiContent += `## Project Overview\n${wikiData.wiki_structure.description || ''}\n\n`; + + // Add all wiki pages content + const pages = wikiData.wiki_structure.pages || []; + const generatedPages = wikiData.generated_pages || {}; + + // Limit the total content to avoid token limits + let totalContentLength = 0; + const maxContentLength = 30000; // Approximate limit to avoid token issues + + // First add high importance pages + const highImportancePages = pages.filter(page => page.importance === 'high'); + for (const page of highImportancePages) { + if (generatedPages[page.id] && generatedPages[page.id].content) { + const content = `## ${page.title}\n${generatedPages[page.id].content}\n\n`; + wikiContent += content; + totalContentLength += content.length; + + if (totalContentLength > maxContentLength) break; + } + } + + // Then add other pages if we still have space + if (totalContentLength < maxContentLength) { + for (const page of pages) { + // Skip high importance pages we've already added + if (page.importance === 'high') continue; + + if (generatedPages[page.id] && generatedPages[page.id].content) { + const content = `## ${page.title}\n${generatedPages[page.id].content}\n\n`; + + // Check if adding this content would exceed our limit + if (totalContentLength + content.length > maxContentLength) { + // If it would exceed, just add a summary + const summaryMatch = generatedPages[page.id].content.match(/# .*?\n\n(.*?)(\n\n|$)/); + const summary = summaryMatch ? summaryMatch[1].trim() : 'No summary available'; + const summaryContent = `## ${page.title}\n${summary}\n\n`; + + wikiContent += summaryContent; + totalContentLength += summaryContent.length; + } else { + // Otherwise add the full content + wikiContent += content; + totalContentLength += content.length; + } + + if (totalContentLength > maxContentLength) break; + } + } + } + } + + // Prepare request body with enhanced context from wiki + const requestBody: Record = { + repo_url: repoUrl, + type: repoInfo.type, + messages: [{ + role: 'user', + content: `Create a comprehensive workshop for learning how to use and contribute to the ${owner}/${repo} repository. + +I'll provide you with information from the project's wiki to help you create a more accurate and relevant workshop. + +${wikiContent} + +This workshop should be designed as a hands-on tutorial that guides users through understanding, using, and potentially contributing to this project. The workshop should be highly readable and optimized for quick onboarding of new users. + +The workshop should include: + +1. A series of progressive exercises that build on each other (at least 3-4 exercises) +2. Clear instructions for each exercise with step-by-step guidance +3. Code examples and snippets where appropriate +4. "Challenge" sections that encourage deeper exploration +5. Solutions for each exercise and challenge (in collapsible sections using
    tags) +6. Explanations that connect the exercises to the actual codebase + +Format the workshop in Markdown with the following structure: + +# ${repo} Workshop + +## Introduction +- Brief overview of the project +- What users will learn in this workshop +- Prerequisites and setup instructions + +## Exercise 1: [First Core Concept] +- Explanation of the concept +- Step-by-step instructions with clear formatting +- Expected outcome +- Challenge (optional harder task) +- Solution (in a collapsible section using
    tags) + +## Exercise 2: [Second Core Concept] +... + +## Exercise 3: [Third Core Concept] +... + +## Final Project +- A culminating exercise that brings together multiple concepts +- Clear success criteria +- Solution + +## Next Steps +- Suggestions for further learning +- How to contribute to the project +- Additional resources + +IMPORTANT FORMATTING GUIDELINES: +1. Use clear headings and subheadings with proper hierarchy +2. Use bullet points and numbered lists for clarity +3. Highlight important information in **bold** or with blockquotes +4. Use code blocks with proper syntax highlighting +5. Include Mermaid diagrams where they would help illustrate concepts or workflows +6. Put solutions in collapsible
    sections +7. Use tables for comparing options or summarizing information +8. Break long sections into smaller, digestible chunks +9. Use consistent formatting throughout + +IMPORTANT CONTENT GUIDELINES: +1. Make sure each exercise focuses on a REAL aspect of the ${repo} repository +2. Use REAL code examples from the repository, not generic examples +3. Create exercises that are practical and relevant to the actual codebase +4. Include at least 3-4 exercises covering different aspects of the repository +5. The final project should be challenging but achievable +6. Ensure the workshop is specific to this repository, not generic +7. Focus on the most important/core features of the repository +8. Include diagrams to visualize complex concepts +9. Make sure the workshop is engaging and interactive + +Make the workshop content in ${language === 'en' ? 'English' : + language === 'ja' ? 'Japanese (日本語)' : + language === 'zh' ? 'Mandarin Chinese (中文)' : + language === 'zh-tw' ? 'Traditional Chinese (繁體中文)' : + language === 'es' ? 'Spanish (Español)' : + language === 'kr' ? 'Korean (한국어)' : + language === 'vi' ? 'Vietnamese (Tiếng Việt)' : + language === "pt-br" ? "Brazilian Portuguese (Português Brasileiro)" : + language === "fr" ? "Français (French)" : + language === "ru" ? "Русский (Russian)" : + 'English'} language.` + }] + }; + + // Add tokens if available + addTokensToRequestBody(requestBody, token, repoInfo.type, providerParam, modelParam, isCustomModelParam, customModelParam, language); + + // Use WebSocket for communication + let content = ''; + + try { + // Create WebSocket URL from the server base URL + const serverBaseUrl = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + const wsBaseUrl = serverBaseUrl.replace(/^http/, 'ws')? serverBaseUrl.replace(/^https/, 'wss'): serverBaseUrl.replace(/^http/, 'ws'); + const wsUrl = `${wsBaseUrl}/ws/chat`; + + // Create a new WebSocket connection + const ws = new WebSocket(wsUrl); + + // Create a promise that resolves when the WebSocket connection is complete + await new Promise((resolve, reject) => { + // Set up event handlers + ws.onopen = () => { + console.log('WebSocket connection established for workshop generation'); + // Send the request as JSON + ws.send(JSON.stringify(requestBody)); + resolve(); + }; + + ws.onerror = (error) => { + console.error('WebSocket error:', error); + reject(new Error('WebSocket connection failed')); + }; + + // If the connection doesn't open within 5 seconds, fall back to HTTP + const timeout = setTimeout(() => { + reject(new Error('WebSocket connection timeout')); + }, 5000); + + // Clear the timeout if the connection opens successfully + ws.onopen = () => { + clearTimeout(timeout); + console.log('WebSocket connection established for workshop generation'); + // Send the request as JSON + ws.send(JSON.stringify(requestBody)); + resolve(); + }; + }); + + // Create a promise that resolves when the WebSocket response is complete + await new Promise((resolve, reject) => { + // Use a local variable to accumulate content + let accumulatedContent = ''; + + // Handle incoming messages + ws.onmessage = (event) => { + const chunk = event.data; + content += chunk; + accumulatedContent += chunk; + + // Update the state with the accumulated content + setWorkshopContent(accumulatedContent); + }; + + // Handle WebSocket close + ws.onclose = () => { + console.log('WebSocket connection closed for workshop generation'); + resolve(); + }; + + // Handle WebSocket errors + ws.onerror = (error) => { + console.error('WebSocket error during message reception:', error); + reject(new Error('WebSocket error during message reception')); + }; + }); + } catch (wsError) { + console.error('WebSocket error, falling back to HTTP:', wsError); + + // Fall back to HTTP if WebSocket fails + const response = await fetch(`/api/chat/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (!response.ok) { + const errorText = await response.text().catch(() => 'No error details available'); + throw new Error(`Error generating workshop content: ${response.status} - ${errorText}`); + } + + // Process the response + content = ''; + const reader = response.body?.getReader(); + const decoder = new TextDecoder(); + + if (!reader) { + throw new Error('Failed to get response reader'); + } + + try { + // Use a local variable to accumulate content + let accumulatedContent = ''; + + while (true) { + const { done, value } = await reader.read(); + if (done) break; + const chunk = decoder.decode(value, { stream: true }); + content += chunk; + accumulatedContent += chunk; + + // Update the state with the accumulated content + setWorkshopContent(accumulatedContent); + } + // Ensure final decoding + const finalChunk = decoder.decode(); + content += finalChunk; + accumulatedContent += finalChunk; + setWorkshopContent(accumulatedContent); + } catch (readError) { + console.error('Error reading stream:', readError); + throw new Error('Error processing response stream'); + } + } + + // Clean up markdown delimiters + content = content.replace(/^```markdown\s*/i, '').replace(/```\s*$/i, ''); + + // Add a table of contents if it doesn't already have one + if (!content.includes('## Table of Contents') && !content.includes('## Contents')) { + const headings = content.match(/^## (.*)$/gm) || []; + if (headings.length > 0) { + let toc = '## Table of Contents\n\n'; + headings.forEach(heading => { + const headingText = heading.replace('## ', ''); + // Create a link-friendly version of the heading + const headingLink = headingText + .toLowerCase() + .replace(/[^\w\s-]/g, '') + .replace(/\s+/g, '-'); + toc += `- [${headingText}](#${headingLink})\n`; + }); + toc += '\n'; + + // Find the position after the introduction heading + const introPos = content.indexOf('# ') + 1; + const nextHeadingPos = content.indexOf('## ', introPos); + + if (nextHeadingPos > introPos) { + // Insert the TOC after the introduction + content = content.slice(0, nextHeadingPos) + toc + content.slice(nextHeadingPos); + } + } + } + + // Add progress indicators to exercises + const exerciseHeadings = content.match(/^## Exercise \d+:/gm) || []; + if (exerciseHeadings.length > 0) { + const totalExercises = exerciseHeadings.length; + + // Replace each exercise heading with a heading that includes a progress indicator + for (let i = 0; i < totalExercises; i++) { + const exerciseHeading = exerciseHeadings[i]; + + // Estimate time to complete based on exercise number (earlier exercises are usually simpler) + let estimatedTime = 10; // default 10 minutes + if (i === 0) estimatedTime = 5; // first exercise is usually simpler + else if (i === totalExercises - 1) estimatedTime = 15; // last exercise is usually more complex + else if (i > Math.floor(totalExercises / 2)) estimatedTime = 12; // later exercises are more complex + + const progressIndicator = `
    +Exercise ${i + 1} of ${totalExercises} | Estimated time: ${estimatedTime} minutes +
    \n\n`; + + // Find the position of the exercise heading + const headingPos = content.indexOf(exerciseHeading); + if (headingPos !== -1) { + // Find the end of the line + const lineEndPos = content.indexOf('\n', headingPos); + if (lineEndPos !== -1) { + // Insert the progress indicator after the heading + content = content.slice(0, lineEndPos + 1) + progressIndicator + content.slice(lineEndPos + 1); + } + } + } + } + + // Add a note about the final project + const finalProjectHeading = content.match(/^## Final Project/m); + if (finalProjectHeading) { + const headingPos = content.indexOf(finalProjectHeading[0]); + if (headingPos !== -1) { + const lineEndPos = content.indexOf('\n', headingPos); + if (lineEndPos !== -1) { + const finalProjectNote = `
    +Estimated time: 20-30 minutes | Combines concepts from all exercises +
    \n\n`; + content = content.slice(0, lineEndPos + 1) + finalProjectNote + content.slice(lineEndPos + 1); + } + } + } + + setWorkshopContent(content); + + } catch (err) { + console.error('Error generating workshop content:', err); + setError(err instanceof Error ? err.message : 'An unknown error occurred'); + } finally { + setIsLoading(false); + setLoadingMessage(undefined); + } + }, [owner, repo, repoInfo, token, providerParam, modelParam, isCustomModelParam, customModelParam, language, isLoading, messages.loading, cachedWikiContent, fetchCachedWikiContent]); + + // Export workshop content + const exportWorkshop = useCallback(async () => { + if (!workshopContent) { + setExportError('No workshop content to export'); + return; + } + + try { + setIsExporting(true); + setExportError(null); + + // Create a blob with the workshop content + const blob = new Blob([workshopContent], { type: 'text/markdown' }); + const url = window.URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `${repo}_workshop.md`; + document.body.appendChild(a); + a.click(); + window.URL.revokeObjectURL(url); + document.body.removeChild(a); + + } catch (err) { + console.error('Error exporting workshop:', err); + setExportError(err instanceof Error ? err.message : 'An unknown error occurred'); + } finally { + setIsExporting(false); + } + }, [workshopContent, repo]); + + // Track if we've already generated content + const contentGeneratedRef = useRef(false); + + // Generate workshop content on page load, but only once + useEffect(() => { + if (!contentGeneratedRef.current) { + contentGeneratedRef.current = true; + + // First fetch the cached wiki content, then generate the workshop + (async () => { + await fetchCachedWikiContent(); + generateWorkshopContent(); + })(); + } + }, [generateWorkshopContent, fetchCachedWikiContent]); + + return ( +
    + {/* Header */} +
    +
    +
    + + + {messages.workshop?.backToWiki || 'Back to Wiki'} + +

    + {messages.workshop?.title || 'Workshop'}: {repo} +

    +
    +
    + + + +
    +
    +
    + + {/* Main content */} +
    + {isLoading && !workshopContent ? ( +
    +
    +

    {loadingMessage}

    +
    + ) : error ? ( +
    +

    {messages.common?.error || 'Error'}

    +

    {error}

    +
    + ) : ( +
    + {exportError && ( +
    +

    {exportError}

    +
    + )} + +
    + )} +
    +
    + ); +} diff --git a/reference-deepwiki/deepwiki-open-main/src/app/api/auth/status/route.ts b/reference-deepwiki/deepwiki-open-main/src/app/api/auth/status/route.ts new file mode 100644 index 0000000..601bb30 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/api/auth/status/route.ts @@ -0,0 +1,31 @@ +import { NextResponse } from "next/server"; + +const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + +export async function GET() { + try { + // Forward the request to the backend API + const response = await fetch(`${TARGET_SERVER_BASE_URL}/auth/status`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + return NextResponse.json( + { error: `Backend server returned ${response.status}` }, + { status: response.status } + ); + } + + const data = await response.json(); + return NextResponse.json(data); + } catch (error) { + console.error('Error forwarding request to backend:', error); + return NextResponse.json( + { error: 'Internal Server Error' }, + { status: 500 } + ); + } +} diff --git a/reference-deepwiki/deepwiki-open-main/src/app/api/auth/validate/route.ts b/reference-deepwiki/deepwiki-open-main/src/app/api/auth/validate/route.ts new file mode 100644 index 0000000..0a9b7c0 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/api/auth/validate/route.ts @@ -0,0 +1,34 @@ +import { NextRequest, NextResponse } from "next/server"; + +const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + +export async function POST(request: NextRequest) { + try { + const body = await request.json(); + + // Forward the request to the backend API + const response = await fetch(`${TARGET_SERVER_BASE_URL}/auth/validate`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(body), + }); + + if (!response.ok) { + return NextResponse.json( + { error: `Backend server returned ${response.status}` }, + { status: response.status } + ); + } + + const data = await response.json(); + return NextResponse.json(data); + } catch (error) { + console.error('Error forwarding request to backend:', error); + return NextResponse.json( + { error: 'Internal Server Error' }, + { status: 500 } + ); + } +} diff --git a/reference-deepwiki/deepwiki-open-main/src/app/api/chat/stream/route.ts b/reference-deepwiki/deepwiki-open-main/src/app/api/chat/stream/route.ts new file mode 100644 index 0000000..544c5d1 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/api/chat/stream/route.ts @@ -0,0 +1,113 @@ +import { NextRequest, NextResponse } from 'next/server'; + +// The target backend server base URL, derived from environment variable or defaulted. +// This should match the logic in your frontend's page.tsx for consistency. +const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + +// This is a fallback HTTP implementation that will be used if WebSockets are not available +// or if there's an error with the WebSocket connection +export async function POST(req: NextRequest) { + try { + const requestBody = await req.json(); // Assuming the frontend sends JSON + + // Note: This endpoint now uses the HTTP fallback instead of WebSockets + // The WebSocket implementation is in src/utils/websocketClient.ts + // This HTTP endpoint is kept for backward compatibility + console.log('Using HTTP fallback for chat completion instead of WebSockets'); + + const targetUrl = `${TARGET_SERVER_BASE_URL}/chat/completions/stream`; + + // Make the actual request to the backend service + const backendResponse = await fetch(targetUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'text/event-stream', // Indicate that we expect a stream + }, + body: JSON.stringify(requestBody), + }); + + // If the backend service returned an error, forward that error to the client + if (!backendResponse.ok) { + const errorBody = await backendResponse.text(); + const errorHeaders = new Headers(); + backendResponse.headers.forEach((value, key) => { + errorHeaders.set(key, value); + }); + return new NextResponse(errorBody, { + status: backendResponse.status, + statusText: backendResponse.statusText, + headers: errorHeaders, + }); + } + + // Ensure the backend response has a body to stream + if (!backendResponse.body) { + return new NextResponse('Stream body from backend is null', { status: 500 }); + } + + // Create a new ReadableStream to pipe the data from the backend to the client + const stream = new ReadableStream({ + async start(controller) { + const reader = backendResponse.body!.getReader(); + try { + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } + controller.enqueue(value); + } + } catch (error) { + console.error('Error reading from backend stream in proxy:', error); + controller.error(error); + } finally { + controller.close(); + reader.releaseLock(); // Important to release the lock on the reader + } + }, + cancel(reason) { + console.log('Client cancelled stream request:', reason); + } + }); + + // Set up headers for the response to the client + const responseHeaders = new Headers(); + // Copy the Content-Type from the backend response (e.g., 'text/event-stream') + const contentType = backendResponse.headers.get('Content-Type'); + if (contentType) { + responseHeaders.set('Content-Type', contentType); + } + // It's good practice for streams not to be cached or transformed by intermediaries. + responseHeaders.set('Cache-Control', 'no-cache, no-transform'); + + return new NextResponse(stream, { + status: backendResponse.status, // Should be 200 for a successful stream start + headers: responseHeaders, + }); + + } catch (error) { + console.error('Error in API proxy route (/api/chat/stream):', error); + let errorMessage = 'Internal Server Error in proxy'; + if (error instanceof Error) { + errorMessage = error.message; + } + return new NextResponse(JSON.stringify({ error: errorMessage }), { + status: 500, + headers: { 'Content-Type': 'application/json' }, + }); + } +} + +// Optional: Handle OPTIONS requests for CORS if you ever call this from a different origin +// or use custom headers that trigger preflight requests. For same-origin, it's less critical. +export async function OPTIONS() { + return new NextResponse(null, { + status: 204, // No Content + headers: { + 'Access-Control-Allow-Origin': '*', // Be more specific in production if needed + 'Access-Control-Allow-Methods': 'POST, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', // Adjust as per client's request headers + }, + }); +} \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/src/app/api/models/config/route.ts b/reference-deepwiki/deepwiki-open-main/src/app/api/models/config/route.ts new file mode 100644 index 0000000..802df22 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/api/models/config/route.ts @@ -0,0 +1,48 @@ +import { NextResponse } from 'next/server'; + +// The target backend server base URL, derived from environment variable or defaulted. +const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost:8001'; + +export async function GET() { + try { + const targetUrl = `${TARGET_SERVER_BASE_URL}/models/config`; + + // Make the actual request to the backend service + const backendResponse = await fetch(targetUrl, { + method: 'GET', + headers: { + 'Accept': 'application/json', + } + }); + + // If the backend service responds with an error + if (!backendResponse.ok) { + return NextResponse.json( + { error: `Backend service responded with status: ${backendResponse.status}` }, + { status: backendResponse.status } + ); + } + + // Forward the response from the backend + const modelConfig = await backendResponse.json(); + return NextResponse.json(modelConfig); + } catch (error) { + console.error('Error fetching model configurations:', error); + return new NextResponse(JSON.stringify({ error: error }), { + status: 500, + headers: { 'Content-Type': 'application/json' }, + }); + } +} + +// Handle OPTIONS requests for CORS if needed +export function OPTIONS() { + return new NextResponse(null, { + status: 204, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + }, + }); +} diff --git a/reference-deepwiki/deepwiki-open-main/src/app/api/wiki/projects/route.ts b/reference-deepwiki/deepwiki-open-main/src/app/api/wiki/projects/route.ts new file mode 100644 index 0000000..f87ed35 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/api/wiki/projects/route.ts @@ -0,0 +1,104 @@ +import { NextResponse } from 'next/server'; + +// This should match the expected structure from your Python backend +interface ApiProcessedProject { + id: string; + owner: string; + repo: string; + name: string; + repo_type: string; + submittedAt: number; + language: string; +} +// Payload for deleting a project cache +interface DeleteProjectCachePayload { + owner: string; + repo: string; + repo_type: string; + language: string; +} + +/** Type guard to validate DeleteProjectCachePayload at runtime */ +function isDeleteProjectCachePayload(obj: unknown): obj is DeleteProjectCachePayload { + return ( + obj != null && + typeof obj === 'object' && + 'owner' in obj && typeof (obj as Record).owner === 'string' && ((obj as Record).owner as string).trim() !== '' && + 'repo' in obj && typeof (obj as Record).repo === 'string' && ((obj as Record).repo as string).trim() !== '' && + 'repo_type' in obj && typeof (obj as Record).repo_type === 'string' && ((obj as Record).repo_type as string).trim() !== '' && + 'language' in obj && typeof (obj as Record).language === 'string' && ((obj as Record).language as string).trim() !== '' + ); +} + +// Ensure this matches your Python backend configuration +const PYTHON_BACKEND_URL = process.env.PYTHON_BACKEND_HOST || 'http://localhost:8001'; +const PROJECTS_API_ENDPOINT = `${PYTHON_BACKEND_URL}/api/processed_projects`; +const CACHE_API_ENDPOINT = `${PYTHON_BACKEND_URL}/api/wiki_cache`; + +export async function GET() { + try { + const response = await fetch(PROJECTS_API_ENDPOINT, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + // Add any other headers your Python backend might require, e.g., API keys + }, + cache: 'no-store', // Ensure fresh data is fetched every time + }); + + if (!response.ok) { + // Try to parse error from backend, otherwise use status text + let errorBody = { error: `Failed to fetch from Python backend: ${response.statusText}` }; + try { + errorBody = await response.json(); + } catch { + // If parsing JSON fails, errorBody will retain its default value + // The error from backend is logged in the next line anyway + } + console.error(`Error from Python backend (${PROJECTS_API_ENDPOINT}): ${response.status} - ${JSON.stringify(errorBody)}`); + return NextResponse.json(errorBody, { status: response.status }); + } + + const projects: ApiProcessedProject[] = await response.json(); + return NextResponse.json(projects); + + } catch (error: unknown) { + console.error(`Network or other error when fetching from ${PROJECTS_API_ENDPOINT}:`, error); + const message = error instanceof Error ? error.message : 'An unknown error occurred'; + return NextResponse.json( + { error: `Failed to connect to the Python backend. ${message}` }, + { status: 503 } // Service Unavailable + ); + } +} + +export async function DELETE(request: Request) { + try { + const body: unknown = await request.json(); + if (!isDeleteProjectCachePayload(body)) { + return NextResponse.json( + { error: 'Invalid request body: owner, repo, repo_type, and language are required and must be non-empty strings.' }, + { status: 400 } + ); + } + const { owner, repo, repo_type, language } = body; + const params = new URLSearchParams({ owner, repo, repo_type, language }); + const response = await fetch(`${CACHE_API_ENDPOINT}?${params}`, { + method: 'DELETE', + headers: { 'Content-Type': 'application/json' }, + }); + if (!response.ok) { + let errorBody = { error: response.statusText }; + try { + errorBody = await response.json(); + } catch {} + console.error(`Error deleting project cache (${CACHE_API_ENDPOINT}): ${response.status} - ${JSON.stringify(errorBody)}`); + return NextResponse.json(errorBody, { status: response.status }); + } + return NextResponse.json({ message: 'Project deleted successfully' }); + } catch (error: unknown) { + console.error('Error in DELETE /api/wiki/projects:', error); + const message = error instanceof Error ? error.message : 'An unknown error occurred'; + return NextResponse.json({ error: `Failed to delete project: ${message}` }, { status: 500 }); + } +} \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/src/app/favicon.ico b/reference-deepwiki/deepwiki-open-main/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/reference-deepwiki/deepwiki-open-main/src/app/globals.css b/reference-deepwiki/deepwiki-open-main/src/app/globals.css new file mode 100644 index 0000000..d0648fa --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/globals.css @@ -0,0 +1,148 @@ +@import "tailwindcss"; + +/* Define dark mode variant */ +@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *)); + +:root { + /* Japanese aesthetic color palette - light mode */ + --background: #f8f4e6; /* Warm off-white like washi paper */ + --foreground: #333333; /* Soft black for text */ + --shadow-color: rgba(0, 0, 0, 0.05); + --accent-primary: #9b7cb9; /* Soft purple (Fuji) */ + --accent-secondary: #d7c4bb; /* Soft beige (Kinari) */ + --border-color: #e0d8c8; /* Soft beige border */ + --card-bg: #fffaf0; /* Slightly warmer than background */ + --highlight: #e8927c; /* Soft coral (Akane) */ + --muted: #a59e8c; /* Soft gray-brown (Nezumi) */ + --link-color: #7c5aa0; /* Slightly darker purple for links */ +} + +html[data-theme='dark'] { + /* Japanese aesthetic color palette - dark mode */ + --background: #1a1a1a; /* Deep charcoal */ + --foreground: #f0f0f0; /* Soft white */ + --shadow-color: rgba(0, 0, 0, 0.2); + --accent-primary: #9370db; /* Soft lavender */ + --accent-secondary: #5d4037; /* Warm brown */ + --border-color: #2c2c2c; /* Dark border */ + --card-bg: #222222; /* Slightly lighter than background */ + --highlight: #e57373; /* Soft red */ + --muted: #8c8c8c; /* Muted gray */ + --link-color: #b19cd9; /* Lighter purple for dark mode links */ +} + +/* Fix for unreadable + {error && ( +
    + {error} +
    + )} +
    + + + + + {/* Configuration Modal */} + setIsConfigModalOpen(false)} + repositoryInput={repositoryInput} + selectedLanguage={selectedLanguage} + setSelectedLanguage={setSelectedLanguage} + supportedLanguages={supportedLanguages} + isComprehensiveView={isComprehensiveView} + setIsComprehensiveView={setIsComprehensiveView} + provider={provider} + setProvider={setProvider} + model={model} + setModel={setModel} + isCustomModel={isCustomModel} + setIsCustomModel={setIsCustomModel} + customModel={customModel} + setCustomModel={setCustomModel} + selectedPlatform={selectedPlatform} + setSelectedPlatform={setSelectedPlatform} + accessToken={accessToken} + setAccessToken={setAccessToken} + excludedDirs={excludedDirs} + setExcludedDirs={setExcludedDirs} + excludedFiles={excludedFiles} + setExcludedFiles={setExcludedFiles} + includedDirs={includedDirs} + setIncludedDirs={setIncludedDirs} + includedFiles={includedFiles} + setIncludedFiles={setIncludedFiles} + onSubmit={handleGenerateWiki} + isSubmitting={isSubmitting} + authRequired={authRequired} + authCode={authCode} + setAuthCode={setAuthCode} + isAuthLoading={isAuthLoading} + /> + + + + +
    +
    + + {/* Conditionally show processed projects or welcome content */} + {!projectsLoading && projects.length > 0 ? ( +
    + {/* Header section for existing projects */} +
    +
    +
    +
    + +
    +
    +

    {t('projects.existingProjects')}

    +

    {t('projects.browseExisting')}

    +
    +
    +
    + + {/* Show processed projects */} + +
    + ) : ( + <> + {/* Header section */} +
    +
    +
    +
    + +
    +
    +

    {t('home.welcome')}

    +

    {t('home.welcomeTagline')}

    +
    +
    + +

    + {t('home.description')} +

    +
    + + {/* Quick Start section - redesigned for better spacing */} +
    +

    + + + + {t('home.quickStart')} +

    +

    {t('home.enterRepoUrl')}

    +
    +
    https://github.com/AsyncFuncAI/deepwiki-open +
    +
    https://gitlab.com/gitlab-org/gitlab +
    +
    AsyncFuncAI/deepwiki-open +
    +
    https://bitbucket.org/atlassian/atlaskit +
    +
    +
    + + {/* Visualization section - improved for better visibility */} +
    +
    + + + +

    {t('home.advancedVisualization')}

    +
    +

    + {t('home.diagramDescription')} +

    + + {/* Diagrams with improved layout */} +
    +
    +

    {t('home.flowDiagram')}

    + +
    + +
    +

    {t('home.sequenceDiagram')}

    + +
    +
    +
    + + )} +
    +
    + +
    + + ); +} \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/src/app/wiki/projects/page.tsx b/reference-deepwiki/deepwiki-open-main/src/app/wiki/projects/page.tsx new file mode 100644 index 0000000..751286c --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/app/wiki/projects/page.tsx @@ -0,0 +1,19 @@ +'use client'; + +import React from 'react'; +import ProcessedProjects from '@/components/ProcessedProjects'; +import { useLanguage } from '@/contexts/LanguageContext'; + +export default function WikiProjectsPage() { + const { messages } = useLanguage(); + + return ( +
    + +
    + ); +} \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/src/components/Ask.tsx b/reference-deepwiki/deepwiki-open-main/src/components/Ask.tsx new file mode 100644 index 0000000..056afcd --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/components/Ask.tsx @@ -0,0 +1,928 @@ +'use client'; + +import React, {useState, useRef, useEffect} from 'react'; +import {FaChevronLeft, FaChevronRight } from 'react-icons/fa'; +import Markdown from './Markdown'; +import { useLanguage } from '@/contexts/LanguageContext'; +import RepoInfo from '@/types/repoinfo'; +import getRepoUrl from '@/utils/getRepoUrl'; +import ModelSelectionModal from './ModelSelectionModal'; +import { createChatWebSocket, closeWebSocket, ChatCompletionRequest } from '@/utils/websocketClient'; + +interface Model { + id: string; + name: string; +} + +interface Provider { + id: string; + name: string; + models: Model[]; + supportsCustomModel?: boolean; +} + +interface Message { + role: 'user' | 'assistant' | 'system'; + content: string; +} + +interface ResearchStage { + title: string; + content: string; + iteration: number; + type: 'plan' | 'update' | 'conclusion'; +} + +interface AskProps { + repoInfo: RepoInfo; + provider?: string; + model?: string; + isCustomModel?: boolean; + customModel?: string; + language?: string; + onRef?: (ref: { clearConversation: () => void }) => void; +} + +const Ask: React.FC = ({ + repoInfo, + provider = '', + model = '', + isCustomModel = false, + customModel = '', + language = 'en', + onRef +}) => { + const [question, setQuestion] = useState(''); + const [response, setResponse] = useState(''); + const [isLoading, setIsLoading] = useState(false); + const [deepResearch, setDeepResearch] = useState(false); + + // Model selection state + const [selectedProvider, setSelectedProvider] = useState(provider); + const [selectedModel, setSelectedModel] = useState(model); + const [isCustomSelectedModel, setIsCustomSelectedModel] = useState(isCustomModel); + const [customSelectedModel, setCustomSelectedModel] = useState(customModel); + const [isModelSelectionModalOpen, setIsModelSelectionModalOpen] = useState(false); + const [isComprehensiveView, setIsComprehensiveView] = useState(true); + + // Get language context for translations + const { messages } = useLanguage(); + + // Research navigation state + const [researchStages, setResearchStages] = useState([]); + const [currentStageIndex, setCurrentStageIndex] = useState(0); + const [conversationHistory, setConversationHistory] = useState([]); + const [researchIteration, setResearchIteration] = useState(0); + const [researchComplete, setResearchComplete] = useState(false); + const inputRef = useRef(null); + const responseRef = useRef(null); + const providerRef = useRef(provider); + const modelRef = useRef(model); + + // Focus input on component mount + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus(); + } + }, []); + + // Expose clearConversation method to parent component + useEffect(() => { + if (onRef) { + onRef({ clearConversation }); + } + }, [onRef]); + + // Scroll to bottom of response when it changes + useEffect(() => { + if (responseRef.current) { + responseRef.current.scrollTop = responseRef.current.scrollHeight; + } + }, [response]); + + // Close WebSocket when component unmounts + useEffect(() => { + return () => { + closeWebSocket(webSocketRef.current); + }; + }, []); + + useEffect(() => { + providerRef.current = provider; + modelRef.current = model; + }, [provider, model]); + + useEffect(() => { + const fetchModel = async () => { + try { + setIsLoading(true); + + const response = await fetch('/api/models/config'); + if (!response.ok) { + throw new Error(`Error fetching model configurations: ${response.status}`); + } + + const data = await response.json(); + + // use latest provider/model ref to check + if(providerRef.current == '' || modelRef.current== '') { + setSelectedProvider(data.defaultProvider); + + // Find the default provider and set its default model + const selectedProvider = data.providers.find((p:Provider) => p.id === data.defaultProvider); + if (selectedProvider && selectedProvider.models.length > 0) { + setSelectedModel(selectedProvider.models[0].id); + } + } else { + setSelectedProvider(providerRef.current); + setSelectedModel(modelRef.current); + } + } catch (err) { + console.error('Failed to fetch model configurations:', err); + } finally { + setIsLoading(false); + } + }; + if(provider == '' || model == '') { + fetchModel() + } + }, [provider, model]); + + const clearConversation = () => { + setQuestion(''); + setResponse(''); + setConversationHistory([]); + setResearchIteration(0); + setResearchComplete(false); + setResearchStages([]); + setCurrentStageIndex(0); + if (inputRef.current) { + inputRef.current.focus(); + } + }; + const downloadresponse = () =>{ + const blob = new Blob([response], { type: 'text/markdown' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = `response-${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.md`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); +} + + // Function to check if research is complete based on response content + const checkIfResearchComplete = (content: string): boolean => { + // Check for explicit final conclusion markers + if (content.includes('## Final Conclusion')) { + return true; + } + + // Check for conclusion sections that don't indicate further research + if ((content.includes('## Conclusion') || content.includes('## Summary')) && + !content.includes('I will now proceed to') && + !content.includes('Next Steps') && + !content.includes('next iteration')) { + return true; + } + + // Check for phrases that explicitly indicate completion + if (content.includes('This concludes our research') || + content.includes('This completes our investigation') || + content.includes('This concludes the deep research process') || + content.includes('Key Findings and Implementation Details') || + content.includes('In conclusion,') || + (content.includes('Final') && content.includes('Conclusion'))) { + return true; + } + + // Check for topic-specific completion indicators + if (content.includes('Dockerfile') && + (content.includes('This Dockerfile') || content.includes('The Dockerfile')) && + !content.includes('Next Steps') && + !content.includes('In the next iteration')) { + return true; + } + + return false; + }; + + // Function to extract research stages from the response + const extractResearchStage = (content: string, iteration: number): ResearchStage | null => { + // Check for research plan (first iteration) + if (iteration === 1 && content.includes('## Research Plan')) { + const planMatch = content.match(/## Research Plan([\s\S]*?)(?:## Next Steps|$)/); + if (planMatch) { + return { + title: 'Research Plan', + content: content, + iteration: 1, + type: 'plan' + }; + } + } + + // Check for research updates (iterations 1-4) + if (iteration >= 1 && iteration <= 4) { + const updateMatch = content.match(new RegExp(`## Research Update ${iteration}([\\s\\S]*?)(?:## Next Steps|$)`)); + if (updateMatch) { + return { + title: `Research Update ${iteration}`, + content: content, + iteration: iteration, + type: 'update' + }; + } + } + + // Check for final conclusion + if (content.includes('## Final Conclusion')) { + const conclusionMatch = content.match(/## Final Conclusion([\s\S]*?)$/); + if (conclusionMatch) { + return { + title: 'Final Conclusion', + content: content, + iteration: iteration, + type: 'conclusion' + }; + } + } + + return null; + }; + + // Function to navigate to a specific research stage + const navigateToStage = (index: number) => { + if (index >= 0 && index < researchStages.length) { + setCurrentStageIndex(index); + setResponse(researchStages[index].content); + } + }; + + // Function to navigate to the next research stage + const navigateToNextStage = () => { + if (currentStageIndex < researchStages.length - 1) { + navigateToStage(currentStageIndex + 1); + } + }; + + // Function to navigate to the previous research stage + const navigateToPreviousStage = () => { + if (currentStageIndex > 0) { + navigateToStage(currentStageIndex - 1); + } + }; + + // WebSocket reference + const webSocketRef = useRef(null); + + // Function to continue research automatically + const continueResearch = async () => { + if (!deepResearch || researchComplete || !response || isLoading) return; + + // Add a small delay to allow the user to read the current response + await new Promise(resolve => setTimeout(resolve, 2000)); + + setIsLoading(true); + + try { + // Store the current response for use in the history + const currentResponse = response; + + // Create a new message from the AI's previous response + const newHistory: Message[] = [ + ...conversationHistory, + { + role: 'assistant', + content: currentResponse + }, + { + role: 'user', + content: '[DEEP RESEARCH] Continue the research' + } + ]; + + // Update conversation history + setConversationHistory(newHistory); + + // Increment research iteration + const newIteration = researchIteration + 1; + setResearchIteration(newIteration); + + // Clear previous response + setResponse(''); + + // Prepare the request body + const requestBody: ChatCompletionRequest = { + repo_url: getRepoUrl(repoInfo), + type: repoInfo.type, + messages: newHistory.map(msg => ({ role: msg.role as 'user' | 'assistant', content: msg.content })), + provider: selectedProvider, + model: isCustomSelectedModel ? customSelectedModel : selectedModel, + language: language + }; + + // Add tokens if available + if (repoInfo?.token) { + requestBody.token = repoInfo.token; + } + + // Close any existing WebSocket connection + closeWebSocket(webSocketRef.current); + + let fullResponse = ''; + + // Create a new WebSocket connection + webSocketRef.current = createChatWebSocket( + requestBody, + // Message handler + (message: string) => { + fullResponse += message; + setResponse(fullResponse); + + // Extract research stage if this is a deep research response + if (deepResearch) { + const stage = extractResearchStage(fullResponse, newIteration); + if (stage) { + // Add the stage to the research stages if it's not already there + setResearchStages(prev => { + // Check if we already have this stage + const existingStageIndex = prev.findIndex(s => s.iteration === stage.iteration && s.type === stage.type); + if (existingStageIndex >= 0) { + // Update existing stage + const newStages = [...prev]; + newStages[existingStageIndex] = stage; + return newStages; + } else { + // Add new stage + return [...prev, stage]; + } + }); + + // Update current stage index to the latest stage + setCurrentStageIndex(researchStages.length); + } + } + }, + // Error handler + (error: Event) => { + console.error('WebSocket error:', error); + setResponse(prev => prev + '\n\nError: WebSocket connection failed. Falling back to HTTP...'); + + // Fallback to HTTP if WebSocket fails + fallbackToHttp(requestBody); + }, + // Close handler + () => { + // Check if research is complete when the WebSocket closes + const isComplete = checkIfResearchComplete(fullResponse); + + // Force completion after a maximum number of iterations (5) + const forceComplete = newIteration >= 5; + + if (forceComplete && !isComplete) { + // If we're forcing completion, append a comprehensive conclusion to the response + const completionNote = "\n\n## Final Conclusion\nAfter multiple iterations of deep research, we've gathered significant insights about this topic. This concludes our investigation process, having reached the maximum number of research iterations. The findings presented across all iterations collectively form our comprehensive answer to the original question."; + fullResponse += completionNote; + setResponse(fullResponse); + setResearchComplete(true); + } else { + setResearchComplete(isComplete); + } + + setIsLoading(false); + } + ); + } catch (error) { + console.error('Error during API call:', error); + setResponse(prev => prev + '\n\nError: Failed to continue research. Please try again.'); + setResearchComplete(true); + setIsLoading(false); + } + }; + + // Fallback to HTTP if WebSocket fails + const fallbackToHttp = async (requestBody: ChatCompletionRequest) => { + try { + // Make the API call using HTTP + const apiResponse = await fetch(`/api/chat/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody) + }); + + if (!apiResponse.ok) { + throw new Error(`API error: ${apiResponse.status}`); + } + + // Process the streaming response + const reader = apiResponse.body?.getReader(); + const decoder = new TextDecoder(); + + if (!reader) { + throw new Error('Failed to get response reader'); + } + + // Read the stream + let fullResponse = ''; + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + const chunk = decoder.decode(value, { stream: true }); + fullResponse += chunk; + setResponse(fullResponse); + + // Extract research stage if this is a deep research response + if (deepResearch) { + const stage = extractResearchStage(fullResponse, researchIteration); + if (stage) { + // Add the stage to the research stages + setResearchStages(prev => { + const existingStageIndex = prev.findIndex(s => s.iteration === stage.iteration && s.type === stage.type); + if (existingStageIndex >= 0) { + const newStages = [...prev]; + newStages[existingStageIndex] = stage; + return newStages; + } else { + return [...prev, stage]; + } + }); + } + } + } + + // Check if research is complete + const isComplete = checkIfResearchComplete(fullResponse); + + // Force completion after a maximum number of iterations (5) + const forceComplete = researchIteration >= 5; + + if (forceComplete && !isComplete) { + // If we're forcing completion, append a comprehensive conclusion to the response + const completionNote = "\n\n## Final Conclusion\nAfter multiple iterations of deep research, we've gathered significant insights about this topic. This concludes our investigation process, having reached the maximum number of research iterations. The findings presented across all iterations collectively form our comprehensive answer to the original question."; + fullResponse += completionNote; + setResponse(fullResponse); + setResearchComplete(true); + } else { + setResearchComplete(isComplete); + } + } catch (error) { + console.error('Error during HTTP fallback:', error); + setResponse(prev => prev + '\n\nError: Failed to get a response. Please try again.'); + setResearchComplete(true); + } finally { + setIsLoading(false); + } + }; + + // Effect to continue research when response is updated + useEffect(() => { + if (deepResearch && response && !isLoading && !researchComplete) { + const isComplete = checkIfResearchComplete(response); + if (isComplete) { + setResearchComplete(true); + } else if (researchIteration > 0 && researchIteration < 5) { + // Only auto-continue if we're already in a research process and haven't reached max iterations + // Use setTimeout to avoid potential infinite loops + const timer = setTimeout(() => { + continueResearch(); + }, 1000); + return () => clearTimeout(timer); + } + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [response, isLoading, deepResearch, researchComplete, researchIteration]); + + // Effect to update research stages when the response changes + useEffect(() => { + if (deepResearch && response && !isLoading) { + // Try to extract a research stage from the response + const stage = extractResearchStage(response, researchIteration); + if (stage) { + // Add or update the stage in the research stages + setResearchStages(prev => { + // Check if we already have this stage + const existingStageIndex = prev.findIndex(s => s.iteration === stage.iteration && s.type === stage.type); + if (existingStageIndex >= 0) { + // Update existing stage + const newStages = [...prev]; + newStages[existingStageIndex] = stage; + return newStages; + } else { + // Add new stage + return [...prev, stage]; + } + }); + + // Update current stage index to point to this stage + setCurrentStageIndex(prev => { + const newIndex = researchStages.findIndex(s => s.iteration === stage.iteration && s.type === stage.type); + return newIndex >= 0 ? newIndex : prev; + }); + } + } + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [response, isLoading, deepResearch, researchIteration]); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + if (!question.trim() || isLoading) return; + + handleConfirmAsk(); + }; + + // Handle confirm and send request + const handleConfirmAsk = async () => { + setIsLoading(true); + setResponse(''); + setResearchIteration(0); + setResearchComplete(false); + + try { + // Create initial message + const initialMessage: Message = { + role: 'user', + content: deepResearch ? `[DEEP RESEARCH] ${question}` : question + }; + + // Set initial conversation history + const newHistory: Message[] = [initialMessage]; + setConversationHistory(newHistory); + + // Prepare request body + const requestBody: ChatCompletionRequest = { + repo_url: getRepoUrl(repoInfo), + type: repoInfo.type, + messages: newHistory.map(msg => ({ role: msg.role as 'user' | 'assistant', content: msg.content })), + provider: selectedProvider, + model: isCustomSelectedModel ? customSelectedModel : selectedModel, + language: language + }; + + // Add tokens if available + if (repoInfo?.token) { + requestBody.token = repoInfo.token; + } + + // Close any existing WebSocket connection + closeWebSocket(webSocketRef.current); + + let fullResponse = ''; + + // Create a new WebSocket connection + webSocketRef.current = createChatWebSocket( + requestBody, + // Message handler + (message: string) => { + fullResponse += message; + setResponse(fullResponse); + + // Extract research stage if this is a deep research response + if (deepResearch) { + const stage = extractResearchStage(fullResponse, 1); // First iteration + if (stage) { + // Add the stage to the research stages + setResearchStages([stage]); + setCurrentStageIndex(0); + } + } + }, + // Error handler + (error: Event) => { + console.error('WebSocket error:', error); + setResponse(prev => prev + '\n\nError: WebSocket connection failed. Falling back to HTTP...'); + + // Fallback to HTTP if WebSocket fails + fallbackToHttp(requestBody); + }, + // Close handler + () => { + // If deep research is enabled, check if we should continue + if (deepResearch) { + const isComplete = checkIfResearchComplete(fullResponse); + setResearchComplete(isComplete); + + // If not complete, start the research process + if (!isComplete) { + setResearchIteration(1); + // The continueResearch function will be triggered by the useEffect + } + } + + setIsLoading(false); + } + ); + } catch (error) { + console.error('Error during API call:', error); + setResponse(prev => prev + '\n\nError: Failed to get a response. Please try again.'); + setResearchComplete(true); + setIsLoading(false); + } + }; + + const [buttonWidth, setButtonWidth] = useState(0); + const buttonRef = useRef(null); + + // Measure button width and update state + useEffect(() => { + if (buttonRef.current) { + const width = buttonRef.current.offsetWidth; + setButtonWidth(width); + } + }, [messages.ask?.askButton, isLoading]); + + return ( +
    +
    +
    + {/* Model selection button */} + +
    + + {/* Question input */} +
    +
    + setQuestion(e.target.value)} + placeholder={messages.ask?.placeholder || 'What would you like to know about this codebase?'} + className="block w-full rounded-md border border-[var(--border-color)] bg-[var(--input-bg)] text-[var(--foreground)] px-5 py-3.5 text-base shadow-sm focus:border-[var(--accent-primary)] focus:ring-2 focus:ring-[var(--accent-primary)]/30 focus:outline-none transition-all" + style={{ paddingRight: `${buttonWidth + 24}px` }} + disabled={isLoading} + /> + +
    + + {/* Deep Research toggle */} +
    +
    + +
    +
    +
    +

    Deep Research conducts a multi-turn investigation process:

    +
      +
    • Initial Research: Creates a research plan and initial findings
    • +
    • Iteration 1: Explores specific aspects in depth
    • +
    • Iteration 2: Investigates remaining questions
    • +
    • Iterations 3-4: Dives deeper into complex areas
    • +
    • Final Conclusion: Comprehensive answer based on all iterations
    • +
    +

    The AI automatically continues research until complete (up to 5 iterations)

    +
    +
    +
    + {deepResearch && ( +
    + Multi-turn research process enabled + {researchIteration > 0 && !researchComplete && ` (iteration ${researchIteration})`} + {researchComplete && ` (complete)`} +
    + )} +
    +
    + + {/* Response area */} + {response && ( +
    +
    + +
    + + {/* Research navigation and clear button */} +
    + {/* Research navigation */} + {deepResearch && researchStages.length > 1 && ( +
    + + +
    + {currentStageIndex + 1} / {researchStages.length} +
    + + + +
    + {researchStages[currentStageIndex]?.title || `Stage ${currentStageIndex + 1}`} +
    +
    + )} + +
    + {/* Download button */} + + + {/* Clear button */} + +
    +
    +
    + )} + + {/* Loading indicator */} + {isLoading && !response && ( +
    +
    +
    +
    +
    +
    +
    + + {deepResearch + ? (researchIteration === 0 + ? "Planning research approach..." + : `Research iteration ${researchIteration} in progress...`) + : "Thinking..."} + +
    + {deepResearch && ( +
    +
    + {researchIteration === 0 && ( + <> +
    +
    + Creating research plan... +
    +
    +
    + Identifying key areas to investigate... +
    + + )} + {researchIteration === 1 && ( + <> +
    +
    + Exploring first research area in depth... +
    +
    +
    + Analyzing code patterns and structures... +
    + + )} + {researchIteration === 2 && ( + <> +
    +
    + Investigating remaining questions... +
    +
    +
    + Connecting findings from previous iterations... +
    + + )} + {researchIteration === 3 && ( + <> +
    +
    + Exploring deeper connections... +
    +
    +
    + Analyzing complex patterns... +
    + + )} + {researchIteration === 4 && ( + <> +
    +
    + Refining research conclusions... +
    +
    +
    + Addressing remaining edge cases... +
    + + )} + {researchIteration >= 5 && ( + <> +
    +
    + Finalizing comprehensive answer... +
    +
    +
    + Synthesizing all research findings... +
    + + )} +
    +
    + )} +
    + )} +
    + + {/* Model Selection Modal */} + setIsModelSelectionModalOpen(false)} + provider={selectedProvider} + setProvider={setSelectedProvider} + model={selectedModel} + setModel={setSelectedModel} + isCustomModel={isCustomSelectedModel} + setIsCustomModel={setIsCustomSelectedModel} + customModel={customSelectedModel} + setCustomModel={setCustomSelectedModel} + isComprehensiveView={isComprehensiveView} + setIsComprehensiveView={setIsComprehensiveView} + showFileFilters={false} + onApply={() => { + console.log('Model selection applied:', selectedProvider, selectedModel); + }} + showWikiType={false} + authRequired={false} + isAuthLoading={false} + /> +
    + ); +}; + +export default Ask; diff --git a/reference-deepwiki/deepwiki-open-main/src/components/ConfigurationModal.tsx b/reference-deepwiki/deepwiki-open-main/src/components/ConfigurationModal.tsx new file mode 100644 index 0000000..7a1dae6 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/components/ConfigurationModal.tsx @@ -0,0 +1,298 @@ +'use client'; + +import React, { useState } from 'react'; +import { useLanguage } from '@/contexts/LanguageContext'; +import UserSelector from './UserSelector'; +import TokenInput from './TokenInput'; + +interface ConfigurationModalProps { + isOpen: boolean; + onClose: () => void; + + // Repository input + repositoryInput: string; + + // Language selection + selectedLanguage: string; + setSelectedLanguage: (value: string) => void; + supportedLanguages: Record; + + // Wiki type options + isComprehensiveView: boolean; + setIsComprehensiveView: (value: boolean) => void; + + // Model selection + provider: string; + setProvider: (value: string) => void; + model: string; + setModel: (value: string) => void; + isCustomModel: boolean; + setIsCustomModel: (value: boolean) => void; + customModel: string; + setCustomModel: (value: string) => void; + + // Platform selection + selectedPlatform: 'github' | 'gitlab' | 'bitbucket'; + setSelectedPlatform: (value: 'github' | 'gitlab' | 'bitbucket') => void; + + // Access token + accessToken: string; + setAccessToken: (value: string) => void; + + // File filter options + excludedDirs: string; + setExcludedDirs: (value: string) => void; + excludedFiles: string; + setExcludedFiles: (value: string) => void; + includedDirs: string; + setIncludedDirs: (value: string) => void; + includedFiles: string; + setIncludedFiles: (value: string) => void; + + // Form submission + onSubmit: () => void; + isSubmitting: boolean; + + // Authentication + authRequired?: boolean; + authCode?: string; + setAuthCode?: (code: string) => void; + isAuthLoading?: boolean; +} + +export default function ConfigurationModal({ + isOpen, + onClose, + repositoryInput, + selectedLanguage, + setSelectedLanguage, + supportedLanguages, + isComprehensiveView, + setIsComprehensiveView, + provider, + setProvider, + model, + setModel, + isCustomModel, + setIsCustomModel, + customModel, + setCustomModel, + selectedPlatform, + setSelectedPlatform, + accessToken, + setAccessToken, + excludedDirs, + setExcludedDirs, + excludedFiles, + setExcludedFiles, + includedDirs, + setIncludedDirs, + includedFiles, + setIncludedFiles, + onSubmit, + isSubmitting, + authRequired, + authCode, + setAuthCode, + isAuthLoading +}: ConfigurationModalProps) { + const { messages: t } = useLanguage(); + + // Show token section state + const [showTokenSection, setShowTokenSection] = useState(false); + + if (!isOpen) return null; + + return ( +
    +
    +
    + {/* Modal header with close button */} +
    +

    + {t.form?.configureWiki || 'Configure Wiki'} +

    + +
    + + {/* Modal body */} +
    + {/* Repository info */} +
    + +
    + {repositoryInput} +
    +
    + + {/* Language selection */} +
    + + +
    + + {/* Wiki Type Selector - more compact version */} +
    + +
    + + + +
    +
    + + {/* Model Selector */} +
    + +
    + + {/* Access token section using TokenInput component */} + setShowTokenSection(!showTokenSection)} + allowPlatformChange={true} + /> + + {/* Authorization Code Input */} + {isAuthLoading && ( +
    + Loading authentication status... +
    + )} + {!isAuthLoading && authRequired && ( +
    + + setAuthCode?.(e.target.value)} + className="input-japanese block w-full px-3 py-2 text-sm rounded-md bg-transparent text-[var(--foreground)] focus:outline-none focus:border-[var(--accent-primary)]" + placeholder="Enter your authorization code" + /> +
    + + + + {t.form?.authorizationRequired || 'Authentication is required to generate the wiki.'} +
    +
    + )} +
    + + {/* Modal footer */} +
    + + +
    +
    +
    +
    + ); +} diff --git a/reference-deepwiki/deepwiki-open-main/src/components/Markdown.tsx b/reference-deepwiki/deepwiki-open-main/src/components/Markdown.tsx new file mode 100644 index 0000000..69dcfe8 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/components/Markdown.tsx @@ -0,0 +1,208 @@ +import React from 'react'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import rehypeRaw from 'rehype-raw'; +import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; +import { tomorrow } from 'react-syntax-highlighter/dist/cjs/styles/prism'; +import Mermaid from './Mermaid'; + +interface MarkdownProps { + content: string; +} + +const Markdown: React.FC = ({ content }) => { + // Define markdown components + const MarkdownComponents: React.ComponentProps['components'] = { + p({ children, ...props }: { children?: React.ReactNode }) { + return

    {children}

    ; + }, + h1({ children, ...props }: { children?: React.ReactNode }) { + return

    {children}

    ; + }, + h2({ children, ...props }: { children?: React.ReactNode }) { + // Special styling for ReAct headings + if (children && typeof children === 'string') { + const text = children.toString(); + if (text.includes('Thought') || text.includes('Action') || text.includes('Observation') || text.includes('Answer')) { + return ( +

    + {children} +

    + ); + } + } + return

    {children}

    ; + }, + h3({ children, ...props }: { children?: React.ReactNode }) { + return

    {children}

    ; + }, + h4({ children, ...props }: { children?: React.ReactNode }) { + return

    {children}

    ; + }, + ul({ children, ...props }: { children?: React.ReactNode }) { + return
      {children}
    ; + }, + ol({ children, ...props }: { children?: React.ReactNode }) { + return
      {children}
    ; + }, + li({ children, ...props }: { children?: React.ReactNode }) { + return
  • {children}
  • ; + }, + a({ children, href, ...props }: { children?: React.ReactNode; href?: string }) { + return ( + + {children} + + ); + }, + blockquote({ children, ...props }: { children?: React.ReactNode }) { + return ( +
    + {children} +
    + ); + }, + table({ children, ...props }: { children?: React.ReactNode }) { + return ( +
    + + {children} +
    +
    + ); + }, + thead({ children, ...props }: { children?: React.ReactNode }) { + return {children}; + }, + tbody({ children, ...props }: { children?: React.ReactNode }) { + return {children}; + }, + tr({ children, ...props }: { children?: React.ReactNode }) { + return {children}; + }, + th({ children, ...props }: { children?: React.ReactNode }) { + return ( + + {children} + + ); + }, + td({ children, ...props }: { children?: React.ReactNode }) { + return {children}; + }, + code(props: { + inline?: boolean; + className?: string; + children?: React.ReactNode; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [key: string]: any; // Using any here as it's required for ReactMarkdown components + }) { + const { inline, className, children, ...otherProps } = props; + const match = /language-(\w+)/.exec(className || ''); + const codeContent = children ? String(children).replace(/\n$/, '') : ''; + + // Handle Mermaid diagrams + if (!inline && match && match[1] === 'mermaid') { + return ( +
    + +
    + ); + } + + // Handle code blocks + if (!inline && match) { + return ( +
    +
    + {match[1]} + +
    + + {codeContent} + +
    + ); + } + + // Handle inline code + return ( + + {children} + + ); + }, + }; + + return ( +
    + + {content} + +
    + ); +}; + +export default Markdown; \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/src/components/Mermaid.tsx b/reference-deepwiki/deepwiki-open-main/src/components/Mermaid.tsx new file mode 100644 index 0000000..a201c98 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/components/Mermaid.tsx @@ -0,0 +1,491 @@ +import React, { useEffect, useRef, useState } from 'react'; +import mermaid from 'mermaid'; +// We'll use dynamic import for svg-pan-zoom + +// Initialize mermaid with defaults - Japanese aesthetic +mermaid.initialize({ + startOnLoad: true, + theme: 'neutral', + securityLevel: 'loose', + suppressErrorRendering: true, + logLevel: 'error', + maxTextSize: 100000, // Increase text size limit + htmlLabels: true, + flowchart: { + htmlLabels: true, + curve: 'basis', + nodeSpacing: 60, + rankSpacing: 60, + padding: 20, + }, + themeCSS: ` + /* Japanese aesthetic styles for all diagrams */ + .node rect, .node circle, .node ellipse, .node polygon, .node path { + fill: #f8f4e6; + stroke: #d7c4bb; + stroke-width: 1px; + } + .edgePath .path { + stroke: #9b7cb9; + stroke-width: 1.5px; + } + .edgeLabel { + background-color: transparent; + color: #333333; + p { + background-color: transparent !important; + } + } + .label { + color: #333333; + } + .cluster rect { + fill: #f8f4e6; + stroke: #d7c4bb; + stroke-width: 1px; + } + + /* Sequence diagram specific styles */ + .actor { + fill: #f8f4e6; + stroke: #d7c4bb; + stroke-width: 1px; + } + text.actor { + fill: #333333; + stroke: none; + } + .messageText { + fill: #333333; + stroke: none; + } + .messageLine0, .messageLine1 { + stroke: #9b7cb9; + } + .noteText { + fill: #333333; + } + + /* Dark mode overrides - will be applied with data-theme="dark" */ + [data-theme="dark"] .node rect, + [data-theme="dark"] .node circle, + [data-theme="dark"] .node ellipse, + [data-theme="dark"] .node polygon, + [data-theme="dark"] .node path { + fill: #222222; + stroke: #5d4037; + } + [data-theme="dark"] .edgePath .path { + stroke: #9370db; + } + [data-theme="dark"] .edgeLabel { + background-color: transparent; + color: #f0f0f0; + } + [data-theme="dark"] .label { + color: #f0f0f0; + } + [data-theme="dark"] .cluster rect { + fill: #222222; + stroke: #5d4037; + } + [data-theme="dark"] .flowchart-link { + stroke: #9370db; + } + + /* Dark mode sequence diagram overrides */ + [data-theme="dark"] .actor { + fill: #222222; + stroke: #5d4037; + } + [data-theme="dark"] text.actor { + fill: #f0f0f0; + stroke: none; + } + [data-theme="dark"] .messageText { + fill: #f0f0f0; + stroke: none; + font-weight: 500; + } + [data-theme="dark"] .messageLine0, [data-theme="dark"] .messageLine1 { + stroke: #9370db; + stroke-width: 1.5px; + } + [data-theme="dark"] .noteText { + fill: #f0f0f0; + } + /* Additional styles for sequence diagram text */ + [data-theme="dark"] #sequenceNumber { + fill: #f0f0f0; + } + [data-theme="dark"] text.sequenceText { + fill: #f0f0f0; + font-weight: 500; + } + [data-theme="dark"] text.loopText, [data-theme="dark"] text.loopText tspan { + fill: #f0f0f0; + } + /* Add a subtle background to message text for better readability */ + [data-theme="dark"] .messageText, [data-theme="dark"] text.sequenceText { + paint-order: stroke; + stroke: #1a1a1a; + stroke-width: 2px; + stroke-linecap: round; + stroke-linejoin: round; + } + + /* Force text elements to be properly colored */ + text[text-anchor][dominant-baseline], + text[text-anchor][alignment-baseline], + .nodeLabel, + .edgeLabel, + .label, + text { + fill: #777 !important; + } + + [data-theme="dark"] text[text-anchor][dominant-baseline], + [data-theme="dark"] text[text-anchor][alignment-baseline], + [data-theme="dark"] .nodeLabel, + [data-theme="dark"] .edgeLabel, + [data-theme="dark"] .label, + [data-theme="dark"] text { + fill: #f0f0f0 !important; + } + + /* Add clickable element styles with subtle transitions */ + .clickable { + transition: all 0.3s ease; + } + .clickable:hover { + transform: scale(1.03); + cursor: pointer; + } + .clickable:hover > * { + filter: brightness(0.95); + } + `, + fontFamily: 'var(--font-geist-sans), var(--font-serif-jp), sans-serif', + fontSize: 12, +}); + +interface MermaidProps { + chart: string; + className?: string; + zoomingEnabled?: boolean; +} + +// Full screen modal component for the diagram +const FullScreenModal: React.FC<{ + isOpen: boolean; + onClose: () => void; + children: React.ReactNode; +}> = ({ isOpen, onClose, children }) => { + const modalRef = useRef(null); + const [zoom, setZoom] = useState(1); + + // Close on Escape key + useEffect(() => { + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + onClose(); + } + }; + + if (isOpen) { + document.addEventListener('keydown', handleKeyDown); + } + + return () => { + document.removeEventListener('keydown', handleKeyDown); + }; + }, [isOpen, onClose]); + + // Handle click outside to close + useEffect(() => { + const handleOutsideClick = (e: MouseEvent) => { + if (modalRef.current && !modalRef.current.contains(e.target as Node)) { + onClose(); + } + }; + + if (isOpen) { + document.addEventListener('mousedown', handleOutsideClick); + } + + return () => { + document.removeEventListener('mousedown', handleOutsideClick); + }; + }, [isOpen, onClose]); + + // Reset zoom when modal opens + useEffect(() => { + if (isOpen) { + setZoom(1); + } + }, [isOpen]); + + if (!isOpen) return null; + + return ( +
    +
    + {/* Modal header with controls */} +
    +
    図表表示
    +
    +
    + + {Math.round(zoom * 100)}% + + +
    + +
    +
    + + {/* Modal content with zoom */} +
    +
    + {children} +
    +
    +
    +
    + ); +}; + +const Mermaid: React.FC = ({ chart, className = '', zoomingEnabled = false }) => { + const [svg, setSvg] = useState(''); + const [error, setError] = useState(null); + const [isFullscreen, setIsFullscreen] = useState(false); + const mermaidRef = useRef(null); + const containerRef = useRef(null); + const idRef = useRef(`mermaid-${Math.random().toString(36).substring(2, 9)}`); + const isDarkModeRef = useRef( + typeof window !== 'undefined' && + window.matchMedia && + window.matchMedia('(prefers-color-scheme: dark)').matches + ); + + // Initialize pan-zoom functionality when SVG is rendered + useEffect(() => { + if (svg && zoomingEnabled && containerRef.current) { + const initializePanZoom = async () => { + const svgElement = containerRef.current?.querySelector("svg"); + if (svgElement) { + // Remove any max-width constraints + svgElement.style.maxWidth = "none"; + svgElement.style.width = "100%"; + svgElement.style.height = "100%"; + + try { + // Dynamically import svg-pan-zoom only when needed in the browser + const svgPanZoom = (await import("svg-pan-zoom")).default; + + svgPanZoom(svgElement, { + zoomEnabled: true, + controlIconsEnabled: true, + fit: true, + center: true, + minZoom: 0.1, + maxZoom: 10, + zoomScaleSensitivity: 0.3, + }); + } catch (error) { + console.error("Failed to load svg-pan-zoom:", error); + } + } + }; + + // Wait for the SVG to be rendered + setTimeout(() => { + void initializePanZoom(); + }, 100); + } + }, [svg, zoomingEnabled]); + + useEffect(() => { + if (!chart) return; + + let isMounted = true; + + const renderChart = async () => { + if (!isMounted) return; + + try { + setError(null); + setSvg(''); + + // Render the chart directly without preprocessing + const { svg: renderedSvg } = await mermaid.render(idRef.current, chart); + + if (!isMounted) return; + + let processedSvg = renderedSvg; + if (isDarkModeRef.current) { + processedSvg = processedSvg.replace(' { + mermaid.contentLoaded(); + }, 50); + } catch (err) { + console.error('Mermaid rendering error:', err); + + const errorMessage = err instanceof Error ? err.message : String(err); + + if (isMounted) { + setError(`Failed to render diagram: ${errorMessage}`); + + if (mermaidRef.current) { + mermaidRef.current.innerHTML = ` +
    Syntax error in diagram
    +
    ${chart}
    + `; + } + } + } + }; + + renderChart(); + + return () => { + isMounted = false; + }; + }, [chart]); + + const handleDiagramClick = () => { + if (!error && svg) { + setIsFullscreen(true); + } + }; + + if (error) { + return ( +
    +
    +
    + + + + 図表レンダリングエラー +
    +
    +
    +
    + 図表に構文エラーがあり、レンダリングできません。 +
    +
    + ); + } + + if (!svg) { + return ( +
    +
    +
    +
    +
    + 図表を描画中... +
    +
    + ); + } + + return ( + <> +
    +
    +
    + + {!zoomingEnabled && ( +
    + + + + + + + Click to zoom +
    + )} +
    +
    + + {!zoomingEnabled && ( + setIsFullscreen(false)} + > +
    + + )} + + ); +}; + + + +export default Mermaid; \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/src/components/ModelSelectionModal.tsx b/reference-deepwiki/deepwiki-open-main/src/components/ModelSelectionModal.tsx new file mode 100644 index 0000000..5a8ed3f --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/components/ModelSelectionModal.tsx @@ -0,0 +1,259 @@ +'use client'; + +import React, {useEffect, useState} from 'react'; +import {useLanguage} from '@/contexts/LanguageContext'; +import UserSelector from './UserSelector'; +import WikiTypeSelector from './WikiTypeSelector'; +import TokenInput from './TokenInput'; + +interface ModelSelectionModalProps { + isOpen: boolean; + onClose: () => void; + provider: string; + setProvider: (value: string) => void; + model: string; + setModel: (value: string) => void; + isCustomModel: boolean; + setIsCustomModel: (value: boolean) => void; + customModel: string; + setCustomModel: (value: string) => void; + onApply: (token?: string) => void; + + // Wiki type options + isComprehensiveView: boolean; + setIsComprehensiveView: (value: boolean) => void; + + // File filter options - optional + excludedDirs?: string; + setExcludedDirs?: (value: string) => void; + excludedFiles?: string; + setExcludedFiles?: (value: string) => void; + includedDirs?: string; + setIncludedDirs?: (value: string) => void; + includedFiles?: string; + setIncludedFiles?: (value: string) => void; + showFileFilters?: boolean; + showWikiType: boolean; + + // Token input for refresh + showTokenInput?: boolean; + repositoryType?: 'github' | 'gitlab' | 'bitbucket'; + // Authentication + authRequired?: boolean; + authCode?: string; + setAuthCode?: (code: string) => void; + isAuthLoading?: boolean; +} + +export default function ModelSelectionModal({ + isOpen, + onClose, + provider, + setProvider, + model, + setModel, + isCustomModel, + setIsCustomModel, + customModel, + setCustomModel, + onApply, + isComprehensiveView, + setIsComprehensiveView, + excludedDirs = '', + setExcludedDirs, + excludedFiles = '', + setExcludedFiles, + includedDirs = '', + setIncludedDirs, + includedFiles = '', + setIncludedFiles, + showFileFilters = false, + authRequired = false, + authCode = '', + setAuthCode, + isAuthLoading, + showWikiType = true, + showTokenInput = false, + repositoryType = 'github', +}: ModelSelectionModalProps) { + const { messages: t } = useLanguage(); + + // Local state for form values (to only apply changes when the user clicks "Submit") + const [localProvider, setLocalProvider] = useState(provider); + const [localModel, setLocalModel] = useState(model); + const [localIsCustomModel, setLocalIsCustomModel] = useState(isCustomModel); + const [localCustomModel, setLocalCustomModel] = useState(customModel); + const [localIsComprehensiveView, setLocalIsComprehensiveView] = useState(isComprehensiveView); + const [localExcludedDirs, setLocalExcludedDirs] = useState(excludedDirs); + const [localExcludedFiles, setLocalExcludedFiles] = useState(excludedFiles); + const [localIncludedDirs, setLocalIncludedDirs] = useState(includedDirs); + const [localIncludedFiles, setLocalIncludedFiles] = useState(includedFiles); + + // Token input state + const [localAccessToken, setLocalAccessToken] = useState(''); + const [localSelectedPlatform, setLocalSelectedPlatform] = useState<'github' | 'gitlab' | 'bitbucket'>(repositoryType); + const [showTokenSection, setShowTokenSection] = useState(showTokenInput); + + // Reset local state when modal is opened + useEffect(() => { + if (isOpen) { + setLocalProvider(provider); + setLocalModel(model); + setLocalIsCustomModel(isCustomModel); + setLocalCustomModel(customModel); + setLocalIsComprehensiveView(isComprehensiveView); + setLocalExcludedDirs(excludedDirs); + setLocalExcludedFiles(excludedFiles); + setLocalIncludedDirs(includedDirs); + setLocalIncludedFiles(includedFiles); + setLocalSelectedPlatform(repositoryType); + setLocalAccessToken(''); + setShowTokenSection(showTokenInput); + } + }, [isOpen, provider, model, isCustomModel, customModel, isComprehensiveView, excludedDirs, excludedFiles, includedDirs, includedFiles, repositoryType, showTokenInput]); + + // Handler for applying changes + const handleApply = () => { + setProvider(localProvider); + setModel(localModel); + setIsCustomModel(localIsCustomModel); + setCustomModel(localCustomModel); + setIsComprehensiveView(localIsComprehensiveView); + if (setExcludedDirs) setExcludedDirs(localExcludedDirs); + if (setExcludedFiles) setExcludedFiles(localExcludedFiles); + if (setIncludedDirs) setIncludedDirs(localIncludedDirs); + if (setIncludedFiles) setIncludedFiles(localIncludedFiles); + + // Pass token to onApply if needed + if (showTokenInput) { + onApply(localAccessToken); + } else { + onApply(); + } + onClose(); + }; + + if (!isOpen) return null; + + return ( +
    +
    +
    + {/* Modal header with close button */} +
    +

    + {t.form?.modelSelection || 'Model Selection'} +

    + +
    + + {/* Modal body */} +
    + {/* Wiki Type Selector */} + { + showWikiType && + } + + {/* Divider */} +
    + + {/* Model Selector */} + setLocalExcludedDirs(value) : undefined} + excludedFiles={localExcludedFiles} + setExcludedFiles={showFileFilters ? (value: string) => setLocalExcludedFiles(value) : undefined} + includedDirs={localIncludedDirs} + setIncludedDirs={showFileFilters ? (value: string) => setLocalIncludedDirs(value) : undefined} + includedFiles={localIncludedFiles} + setIncludedFiles={showFileFilters ? (value: string) => setLocalIncludedFiles(value) : undefined} + /> + + {/* Token Input Section for refresh */} + {showTokenInput && ( + <> +
    + setShowTokenSection(!showTokenSection)} + allowPlatformChange={false} // Don't allow platform change during refresh + /> + + )} + {/* Authorization Code Input */} + {isAuthLoading && ( +
    + Loading authentication status... +
    + )} + {!isAuthLoading && authRequired && ( +
    + + setAuthCode?.(e.target.value)} + className="input-japanese block w-full px-3 py-2 text-sm rounded-md bg-transparent text-[var(--foreground)] focus:outline-none focus:border-[var(--accent-primary)]" + placeholder="Enter your authorization code" + /> +
    + + + + {t.form?.authorizationRequired || 'Authentication is required to generate the wiki.'} +
    +
    + )} +
    + + {/* Modal footer */} +
    + + +
    +
    +
    +
    + ); +} diff --git a/reference-deepwiki/deepwiki-open-main/src/components/ProcessedProjects.tsx b/reference-deepwiki/deepwiki-open-main/src/components/ProcessedProjects.tsx new file mode 100644 index 0000000..b3df192 --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/components/ProcessedProjects.tsx @@ -0,0 +1,270 @@ +'use client'; + +import React, { useState, useEffect, useMemo } from 'react'; +import Link from 'next/link'; +import { FaTimes, FaTh, FaList } from 'react-icons/fa'; + +// Interface should match the structure from the API +interface ProcessedProject { + id: string; + owner: string; + repo: string; + name: string; + repo_type: string; + submittedAt: number; + language: string; +} + +interface ProcessedProjectsProps { + showHeader?: boolean; + maxItems?: number; + className?: string; + messages?: Record>; // Translation messages with proper typing +} + +export default function ProcessedProjects({ + showHeader = true, + maxItems, + className = "", + messages +}: ProcessedProjectsProps) { + const [projects, setProjects] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + const [searchQuery, setSearchQuery] = useState(''); + const [viewMode, setViewMode] = useState<'card' | 'list'>('card'); + + // Default messages fallback + const defaultMessages = { + title: 'Processed Wiki Projects', + searchPlaceholder: 'Search projects by name, owner, or repository...', + noProjects: 'No projects found in the server cache. The cache might be empty or the server encountered an issue.', + noSearchResults: 'No projects match your search criteria.', + processedOn: 'Processed on:', + loadingProjects: 'Loading projects...', + errorLoading: 'Error loading projects:', + backToHome: 'Back to Home' + }; + + const t = (key: string) => { + if (messages?.projects?.[key]) { + return messages.projects[key]; + } + return defaultMessages[key as keyof typeof defaultMessages] || key; + }; + + useEffect(() => { + const fetchProjects = async () => { + setIsLoading(true); + setError(null); + try { + const response = await fetch('/api/wiki/projects'); + if (!response.ok) { + throw new Error(`Failed to fetch projects: ${response.statusText}`); + } + const data = await response.json(); + if (data.error) { + throw new Error(data.error); + } + setProjects(data as ProcessedProject[]); + } catch (e: unknown) { + console.error("Failed to load projects from API:", e); + const message = e instanceof Error ? e.message : "An unknown error occurred."; + setError(message); + setProjects([]); + } finally { + setIsLoading(false); + } + }; + + fetchProjects(); + }, []); + + // Filter projects based on search query + const filteredProjects = useMemo(() => { + if (!searchQuery.trim()) { + return maxItems ? projects.slice(0, maxItems) : projects; + } + + const query = searchQuery.toLowerCase(); + const filtered = projects.filter(project => + project.name.toLowerCase().includes(query) || + project.owner.toLowerCase().includes(query) || + project.repo.toLowerCase().includes(query) || + project.repo_type.toLowerCase().includes(query) + ); + + return maxItems ? filtered.slice(0, maxItems) : filtered; + }, [projects, searchQuery, maxItems]); + + const clearSearch = () => { + setSearchQuery(''); + }; + + const handleDelete = async (project: ProcessedProject) => { + if (!confirm(`Are you sure you want to delete project ${project.name}?`)) { + return; + } + try { + const response = await fetch('/api/wiki/projects', { + method: 'DELETE', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + owner: project.owner, + repo: project.repo, + repo_type: project.repo_type, + language: project.language, + }), + }); + if (!response.ok) { + const errorBody = await response.json().catch(() => ({ error: response.statusText })); + throw new Error(errorBody.error || response.statusText); + } + setProjects(prev => prev.filter(p => p.id !== project.id)); + } catch (e: unknown) { + console.error('Failed to delete project:', e); + alert(`Failed to delete project: ${e instanceof Error ? e.message : 'Unknown error'}`); + } + }; + + return ( +
    + {showHeader && ( +
    +
    +

    {t('title')}

    + + {t('backToHome')} + +
    +
    + )} + + {/* Search Bar and View Toggle */} +
    + {/* Search Bar */} +
    + setSearchQuery(e.target.value)} + placeholder={t('searchPlaceholder')} + className="input-japanese block w-full pl-4 pr-12 py-2.5 border border-[var(--border-color)] rounded-lg bg-[var(--background)] text-[var(--foreground)] placeholder:text-[var(--muted)] focus:outline-none focus:border-[var(--accent-primary)] focus:ring-1 focus:ring-[var(--accent-primary)]" + /> + {searchQuery && ( + + )} +
    + + {/* View Toggle */} +
    + + +
    +
    + + {isLoading &&

    {t('loadingProjects')}

    } + {error &&

    {t('errorLoading')} {error}

    } + + {!isLoading && !error && filteredProjects.length > 0 && ( +
    + {filteredProjects.map((project) => ( + viewMode === 'card' ? ( +
    + + +

    + {project.name} +

    +
    + + {project.repo_type} + + + {project.language} + +
    +

    + {t('processedOn')} {new Date(project.submittedAt).toLocaleDateString()} +

    + +
    + ) : ( +
    + + +
    +

    + {project.name} +

    +

    + {t('processedOn')} {new Date(project.submittedAt).toLocaleDateString()} • {project.repo_type} • {project.language} +

    +
    +
    + + {project.repo_type} + +
    + +
    + ) + ))} +
    + )} + + {!isLoading && !error && projects.length > 0 && filteredProjects.length === 0 && searchQuery && ( +

    {t('noSearchResults')}

    + )} + + {!isLoading && !error && projects.length === 0 && ( +

    {t('noProjects')}

    + )} +
    + ); +} diff --git a/reference-deepwiki/deepwiki-open-main/src/components/TokenInput.tsx b/reference-deepwiki/deepwiki-open-main/src/components/TokenInput.tsx new file mode 100644 index 0000000..14fadcd --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/components/TokenInput.tsx @@ -0,0 +1,108 @@ +'use client'; + +import React from 'react'; +import { useLanguage } from '@/contexts/LanguageContext'; + +interface TokenInputProps { + selectedPlatform: 'github' | 'gitlab' | 'bitbucket'; + setSelectedPlatform: (value: 'github' | 'gitlab' | 'bitbucket') => void; + accessToken: string; + setAccessToken: (value: string) => void; + showTokenSection?: boolean; + onToggleTokenSection?: () => void; + allowPlatformChange?: boolean; +} + +export default function TokenInput({ + selectedPlatform, + setSelectedPlatform, + accessToken, + setAccessToken, + showTokenSection = true, + onToggleTokenSection, + allowPlatformChange = true +}: TokenInputProps) { + const { messages: t } = useLanguage(); + + const platformName = selectedPlatform.charAt(0).toUpperCase() + selectedPlatform.slice(1); + + return ( +
    + {onToggleTokenSection && ( + + )} + + {showTokenSection && ( +
    + {allowPlatformChange && ( +
    + +
    + + + +
    +
    + )} + +
    + + setAccessToken(e.target.value)} + placeholder={(t.form?.tokenPlaceholder || 'Enter your access token').replace('{platform}', platformName)} + className="input-japanese block w-full px-3 py-2 rounded-md bg-transparent text-[var(--foreground)] focus:outline-none focus:border-[var(--accent-primary)] text-sm" + /> +
    + + + + {t.form?.tokenSecurityNote || 'Your token is stored locally and never sent to our servers.'} +
    +
    +
    + )} +
    + ); +} \ No newline at end of file diff --git a/reference-deepwiki/deepwiki-open-main/src/components/UserSelector.tsx b/reference-deepwiki/deepwiki-open-main/src/components/UserSelector.tsx new file mode 100644 index 0000000..a959f2b --- /dev/null +++ b/reference-deepwiki/deepwiki-open-main/src/components/UserSelector.tsx @@ -0,0 +1,522 @@ +'use client'; + +import React, { useState, useEffect } from 'react'; +import { useLanguage } from '@/contexts/LanguageContext'; + +// Define the interfaces for our model configuration +interface Model { + id: string; + name: string; +} + +interface Provider { + id: string; + name: string; + models: Model[]; + supportsCustomModel?: boolean; +} + +interface ModelConfig { + providers: Provider[]; + defaultProvider: string; +} + +interface ModelSelectorProps { + provider: string; + setProvider: (value: string) => void; + model: string; + setModel: (value: string) => void; + isCustomModel: boolean; + setIsCustomModel: (value: boolean) => void; + customModel: string; + setCustomModel: (value: string) => void; + + // File filter configuration + showFileFilters?: boolean; + excludedDirs?: string; + setExcludedDirs?: (value: string) => void; + excludedFiles?: string; + setExcludedFiles?: (value: string) => void; + includedDirs?: string; + setIncludedDirs?: (value: string) => void; + includedFiles?: string; + setIncludedFiles?: (value: string) => void; +} + +export default function UserSelector({ + provider, + setProvider, + model, + setModel, + isCustomModel, + setIsCustomModel, + customModel, + setCustomModel, + + // File filter configuration + showFileFilters = false, + excludedDirs = '', + setExcludedDirs, + excludedFiles = '', + setExcludedFiles, + includedDirs = '', + setIncludedDirs, + includedFiles = '', + setIncludedFiles +}: ModelSelectorProps) { + // State to manage the visibility of the filters modal and filter section + const [isFilterSectionOpen, setIsFilterSectionOpen] = useState(false); + // State to manage filter mode: 'exclude' or 'include' + const [filterMode, setFilterMode] = useState<'exclude' | 'include'>('exclude'); + const { messages: t } = useLanguage(); + + // State for model configurations from backend + const [modelConfig, setModelConfig] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + // State for viewing default values + const [showDefaultDirs, setShowDefaultDirs] = useState(false); + const [showDefaultFiles, setShowDefaultFiles] = useState(false); + + // Fetch model configurations from the backend + useEffect(() => { + const fetchModelConfig = async () => { + try { + setIsLoading(true); + setError(null); + + const response = await fetch('/api/models/config'); + + if (!response.ok) { + throw new Error(`Error fetching model configurations: ${response.status}`); + } + + const data = await response.json(); + setModelConfig(data); + + // Initialize provider and model with defaults from API if not already set + if (!provider && data.defaultProvider) { + setProvider(data.defaultProvider); + + // Find the default provider and set its default model + const selectedProvider = data.providers.find((p: Provider) => p.id === data.defaultProvider); + if (selectedProvider && selectedProvider.models.length > 0) { + setModel(selectedProvider.models[0].id); + } + } + } catch (err) { + console.error('Failed to fetch model configurations:', err); + setError('Failed to load model configurations. Using default options.'); + } finally { + setIsLoading(false); + } + }; + + fetchModelConfig(); + }, [provider, setModel, setProvider]); + + // Handler for changing provider + const handleProviderChange = (newProvider: string) => { + setProvider(newProvider); + setTimeout(() => { + // Reset custom model state when changing providers + setIsCustomModel(false); + + // Set default model for the selected provider + if (modelConfig) { + const selectedProvider = modelConfig.providers.find((p: Provider) => p.id === newProvider); + if (selectedProvider && selectedProvider.models.length > 0) { + setModel(selectedProvider.models[0].id); + } + } + }, 10); + }; + + // Default excluded directories from config.py + const defaultExcludedDirs = +`./.venv/ +./venv/ +./env/ +./virtualenv/ +./node_modules/ +./bower_components/ +./jspm_packages/ +./.git/ +./.svn/ +./.hg/ +./.bzr/ +./__pycache__/ +./.pytest_cache/ +./.mypy_cache/ +./.ruff_cache/ +./.coverage/ +./dist/ +./build/ +./out/ +./target/ +./bin/ +./obj/ +./docs/ +./_docs/ +./site-docs/ +./_site/ +./.idea/ +./.vscode/ +./.vs/ +./.eclipse/ +./.settings/ +./logs/ +./log/ +./tmp/ +./temp/ +./.eng`; + + // Default excluded files from config.py + const defaultExcludedFiles = +`package-lock.json +yarn.lock +pnpm-lock.yaml +npm-shrinkwrap.json +poetry.lock +Pipfile.lock +requirements.txt.lock +Cargo.lock +composer.lock +.lock +.DS_Store +Thumbs.db +desktop.ini +*.lnk +.env +.env.* +*.env +*.cfg +*.ini +.flaskenv +.gitignore +.gitattributes +.gitmodules +.github +.gitlab-ci.yml +.prettierrc +.eslintrc +.eslintignore +.stylelintrc +.editorconfig +.jshintrc +.pylintrc +.flake8 +mypy.ini +pyproject.toml +tsconfig.json +webpack.config.js +babel.config.js +rollup.config.js +jest.config.js +karma.conf.js +vite.config.js +next.config.js +*.min.js +*.min.css +*.bundle.js +*.bundle.css +*.map +*.gz +*.zip +*.tar +*.tgz +*.rar +*.pyc +*.pyo +*.pyd +*.so +*.dll +*.class +*.exe +*.o +*.a +*.jpg +*.jpeg +*.png +*.gif +*.ico +*.svg +*.webp +*.mp3 +*.mp4 +*.wav +*.avi +*.mov +*.webm +*.csv +*.tsv +*.xls +*.xlsx +*.db +*.sqlite +*.sqlite3 +*.pdf +*.docx +*.pptx`; + + // Display loading state + if (isLoading) { + return ( +
    +
    Loading model configurations...
    +
    + ); + } + + return ( +
    +
    + {error && ( +
    {error}
    + )} + + {/* Provider Selection */} +
    + + +
    + + {/* Model Selection - consistent height regardless of type */} +
    + + + {isCustomModel ? ( + { + setCustomModel(e.target.value); + setModel(e.target.value); + }} + placeholder={t.form?.customModelPlaceholder || 'Enter custom model name'} + className="input-japanese block w-full px-2.5 py-1.5 text-sm rounded-md bg-transparent text-[var(--foreground)] focus:outline-none focus:border-[var(--accent-primary)]" + /> + ) : ( + + )} +
    + + {/* Custom model toggle - only when provider supports it */} + {modelConfig?.providers.find((p: Provider) => p.id === provider)?.supportsCustomModel && ( +
    +
    +
    { + const newValue = !isCustomModel; + setIsCustomModel(newValue); + if (newValue) { + setCustomModel(model); + } + }} + > + {}} + className="sr-only" + /> +
    +
    +
    + +
    +
    + )} + + {showFileFilters && ( +
    + + + {isFilterSectionOpen && ( +
    + {/* Filter Mode Selection */} +
    + +
    + + +
    +

    + {filterMode === 'exclude' + ? (t.form?.excludeModeDescription || 'Specify paths to exclude from processing (default behavior)') + : (t.form?.includeModeDescription || 'Specify only the paths to include, ignoring all others') + } +

    +
    + + {/* Directories Section */} +
    + +

    ?5oSAm0uv!FA&Krv@OLVC;4yTuOvI2STMX7Zs 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Ν~TQh*VvxeBT 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%0A?_l}C&f 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 URuk~erj6&Et>aHsKl { + return `deepwiki_cache_${repoType}_${owner}_${repo}_${language}_${isComprehensive ? 'comprehensive' : 'concise'}`; +}; + +// Helper function to add tokens and other parameters to request body +const addTokensToRequestBody = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + requestBody: Record, + token: string, + repoType: string, + provider: string = '', + model: string = '', + isCustomModel: boolean = false, + customModel: string = '', + language: string = 'en', + excludedDirs?: string, + excludedFiles?: string, + includedDirs?: string, + includedFiles?: string +): void => { + if (token !== '') { + requestBody.token = token; + } + + // Add provider-based model selection parameters + requestBody.provider = provider; + requestBody.model = model; + if (isCustomModel && customModel) { + requestBody.custom_model = customModel; + } + + requestBody.language = language; + + // Add file filter parameters if provided + if (excludedDirs) { + requestBody.excluded_dirs = excludedDirs; + } + if (excludedFiles) { + requestBody.excluded_files = excludedFiles; + } + if (includedDirs) { + requestBody.included_dirs = includedDirs; + } + if (includedFiles) { + requestBody.included_files = includedFiles; + } + +}; + +const createGithubHeaders = (githubToken: string): HeadersInit => { + const headers: HeadersInit = { + 'Accept': 'application/vnd.github.v3+json' + }; + + if (githubToken) { + headers['Authorization'] = `Bearer ${githubToken}`; + } + + return headers; +}; + +const createGitlabHeaders = (gitlabToken: string): HeadersInit => { + const headers: HeadersInit = { + 'Content-Type': 'application/json', + }; + + if (gitlabToken) { + headers['PRIVATE-TOKEN'] = gitlabToken; + } + + return headers; +}; + +const createBitbucketHeaders = (bitbucketToken: string): HeadersInit => { + const headers: HeadersInit = { + 'Content-Type': 'application/json', + }; + + if (bitbucketToken) { + headers['Authorization'] = `Bearer ${bitbucketToken}`; + } + + return headers; +}; + + +export default function RepoWikiPage() { + // Get route parameters and search params + const params = useParams(); + const searchParams = useSearchParams(); + + // Extract owner and repo from route params + const owner = params.owner as string; + const repo = params.repo as string; + + // Extract tokens from search params + const token = searchParams.get('token') || ''; + const localPath = searchParams.get('local_path') ? decodeURIComponent(searchParams.get('local_path') || '') : undefined; + const repoUrl = searchParams.get('repo_url') ? decodeURIComponent(searchParams.get('repo_url') || '') : undefined; + const providerParam = searchParams.get('provider') || ''; + const modelParam = searchParams.get('model') || ''; + const isCustomModelParam = searchParams.get('is_custom_model') === 'true'; + const customModelParam = searchParams.get('custom_model') || ''; + const language = searchParams.get('language') || 'en'; + const repoType = repoUrl?.includes('bitbucket.org') + ? 'bitbucket' + : repoUrl?.includes('gitlab.com') + ? 'gitlab' + : repoUrl?.includes('github.com') + ? 'github' + : searchParams.get('type') || 'github'; + + // Import language context for translations + const { messages } = useLanguage(); + + // Initialize repo info + const repoInfo = useMemo(() => ({ + owner, + repo, + type: repoType, + token: token || null, + localPath: localPath || null, + repoUrl: repoUrl || null + }), [owner, repo, repoType, localPath, repoUrl, token]); + + // State variables + const [isLoading, setIsLoading] = useState(true); + const [loadingMessage, setLoadingMessage] = useState( + messages.loading?.initializing || 'Initializing wiki generation...' + ); + const [error, setError] = useState(null); + const [wikiStructure, setWikiStructure] = useState(); + const [currentPageId, setCurrentPageId] = useState(); + const [generatedPages, setGeneratedPages] = useState>({}); + const [pagesInProgress, setPagesInProgress] = useState(new Set()); + const [isExporting, setIsExporting] = useState(false); + const [exportError, setExportError] = useState(null); + const [originalMarkdown, setOriginalMarkdown] = useState>({}); + const [requestInProgress, setRequestInProgress] = useState(false); + const [currentToken, setCurrentToken] = useState(token); // Track current effective token + const [effectiveRepoInfo, setEffectiveRepoInfo] = useState(repoInfo); // Track effective repo info with cached data + const [embeddingError, setEmbeddingError] = useState(false); + + // Model selection state variables + const [selectedProviderState, setSelectedProviderState] = useState(providerParam); + const [selectedModelState, setSelectedModelState] = useState(modelParam); + const [isCustomSelectedModelState, setIsCustomSelectedModelState] = useState(isCustomModelParam); + const [customSelectedModelState, setCustomSelectedModelState] = useState(customModelParam); + const [showModelOptions, setShowModelOptions] = useState(false); // Controls whether to show model options + const excludedDirs = searchParams.get('excluded_dirs') || ''; + const excludedFiles = searchParams.get('excluded_files') || ''; + const [modelExcludedDirs, setModelExcludedDirs] = useState(excludedDirs); + const [modelExcludedFiles, setModelExcludedFiles] = useState(excludedFiles); + const includedDirs = searchParams.get('included_dirs') || ''; + const includedFiles = searchParams.get('included_files') || ''; + const [modelIncludedDirs, setModelIncludedDirs] = useState(includedDirs); + const [modelIncludedFiles, setModelIncludedFiles] = useState(includedFiles); + + + // Wiki type state - default to comprehensive view + const isComprehensiveParam = searchParams.get('comprehensive') !== 'false'; + const [isComprehensiveView, setIsComprehensiveView] = useState(isComprehensiveParam); + // Using useRef for activeContentRequests to maintain a single instance across renders + // This map tracks which pages are currently being processed to prevent duplicate requests + // Note: In a multi-threaded environment, additional synchronization would be needed, + // but in React's single-threaded model, this is safe as long as we set the flag before any async operations + const activeContentRequests = useRef(new Map()).current; + const [structureRequestInProgress, setStructureRequestInProgress] = useState(false); + // Create a flag to track if data was loaded from cache to prevent immediate re-save + const cacheLoadedSuccessfully = useRef(false); + + // Create a flag to ensure the effect only runs once + const effectRan = React.useRef(false); + + // State for Ask modal + const [isAskModalOpen, setIsAskModalOpen] = useState(false); + const askComponentRef = useRef<{ clearConversation: () => void } | null>(null); + + // Authentication state + const [authRequired, setAuthRequired] = useState(false); + const [authCode, setAuthCode] = useState(''); + const [isAuthLoading, setIsAuthLoading] = useState(true); + + // Default branch state + const [defaultBranch, setDefaultBranch] = useState('main'); + + // Helper function to generate proper repository file URLs + const generateFileUrl = useCallback((filePath: string): string => { + if (effectiveRepoInfo.type === 'local') { + // For local repositories, we can't generate web URLs + return filePath; + } + + const repoUrl = effectiveRepoInfo.repoUrl; + if (!repoUrl) { + return filePath; + } + + try { + const url = new URL(repoUrl); + const hostname = url.hostname; + + if (hostname === 'github.com' || hostname.includes('github')) { + // GitHub URL format: https://github.com/owner/repo/blob/branch/path + return `${repoUrl}/blob/${defaultBranch}/${filePath}`; + } else if (hostname === 'gitlab.com' || hostname.includes('gitlab')) { + // GitLab URL format: https://gitlab.com/owner/repo/-/blob/branch/path + return `${repoUrl}/-/blob/${defaultBranch}/${filePath}`; + } else if (hostname === 'bitbucket.org' || hostname.includes('bitbucket')) { + // Bitbucket URL format: https://bitbucket.org/owner/repo/src/branch/path + return `${repoUrl}/src/${defaultBranch}/${filePath}`; + } + } catch (error) { + console.warn('Error generating file URL:', error); + } + + // Fallback to just the file path + return filePath; + }, [effectiveRepoInfo, defaultBranch]); + + // Memoize repo info to avoid triggering updates in callbacks + + // Add useEffect to handle scroll reset + useEffect(() => { + // Scroll to top when currentPageId changes + const wikiContent = document.getElementById('wiki-content'); + if (wikiContent) { + wikiContent.scrollTo({ top: 0, behavior: 'smooth' }); + } + }, [currentPageId]); + + // close the modal when escape is pressed + useEffect(() => { + const handleEsc = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + setIsAskModalOpen(false); + } + }; + + if (isAskModalOpen) { + window.addEventListener('keydown', handleEsc); + } + + // Cleanup on unmount or when modal closes + return () => { + window.removeEventListener('keydown', handleEsc); + }; + }, [isAskModalOpen]); + + // Fetch authentication status on component mount + useEffect(() => { + const fetchAuthStatus = async () => { + try { + setIsAuthLoading(true); + const response = await fetch('/api/auth/status'); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + setAuthRequired(data.auth_required); + } catch (err) { + console.error("Failed to fetch auth status:", err); + // Assuming auth is required if fetch fails to avoid blocking UI for safety + setAuthRequired(true); + } finally { + setIsAuthLoading(false); + } + }; + + fetchAuthStatus(); + }, []); + + // Generate content for a wiki page + const generatePageContent = useCallback(async (page: WikiPage, owner: string, repo: string) => { + return new Promise(async (resolve) => { + try { + // Skip if content already exists + if (generatedPages[page.id]?.content) { + resolve(); + return; + } + + // Skip if this page is already being processed + // Use a synchronized pattern to avoid race conditions + if (activeContentRequests.get(page.id)) { + console.log(`Page ${page.id} (${page.title}) is already being processed, skipping duplicate call`); + resolve(); + return; + } + + // Mark this page as being processed immediately to prevent race conditions + // This ensures that if multiple calls happen nearly simultaneously, only one proceeds + activeContentRequests.set(page.id, true); + + // Validate repo info + if (!owner || !repo) { + throw new Error('Invalid repository information. Owner and repo name are required.'); + } + + // Mark page as in progress + setPagesInProgress(prev => new Set(prev).add(page.id)); + // Don't set loading message for individual pages during queue processing + + const filePaths = page.filePaths; + + // Store the initially generated content BEFORE rendering/potential modification + setGeneratedPages(prev => ({ + ...prev, + [page.id]: { ...page, content: 'Loading...' } // Placeholder + })); + setOriginalMarkdown(prev => ({ ...prev, [page.id]: '' })); // Clear previous original + + // Make API call to generate page content + console.log(`Starting content generation for page: ${page.title}`); + + // Get repository URL + const repoUrl = getRepoUrl(effectiveRepoInfo); + + // Create the prompt content - simplified to avoid message dialogs + const promptContent = +`You are an expert technical writer and software architect. +Your task is to generate a comprehensive and accurate technical wiki page in Markdown format about a specific feature, system, or module within a given software project. + +You will be given: +1. The "[WIKI_PAGE_TOPIC]" for the page you need to create. +2. A list of "[RELEVANT_SOURCE_FILES]" from the project that you MUST use as the sole basis for the content. You have access to the full content of these files. You MUST use AT LEAST 5 relevant source files for comprehensive coverage - if fewer are provided, search for additional related files in the codebase. + +CRITICAL STARTING INSTRUCTION: +The very first thing on the page MUST be a \`